✨ feat(adc): 重构ADC数据处理架构,引入1ms定时器中断处理
- 新增TIM2定时器配置,用于1ms周期的ADC数据处理中断 - 将主循环中的ADC数据处理逻辑移至定时器中断回调函数中 - 新增ProcessAdcData函数,封装完整的ADC数据处理流程 - 优化数据缓冲区大小,从2增加到64,提升数据处理能力 - 调整DMA中断优先级,优化系统实时性 🔧 chore(config): 更新STM32CubeMX项目配置 - 在IOC配置文件中添加TIM2定时器配置 - 更新NVIC中断优先级配置 - 调整DMA中断优先级设置 - 更新项目初始化函数调用顺序 📦 build(storage): 优化数据存储缓冲区配置 - 将数据存储缓冲区大小从1024字节增加到32768字节 - 提升数据写入效率,减少文件系统操作频率
This commit is contained in:
parent
2cbd4a152d
commit
082ea96e88
@ -58,6 +58,7 @@ void SysTick_Handler(void);
|
||||
void EXTI1_IRQHandler(void);
|
||||
void DMA1_Stream0_IRQHandler(void);
|
||||
void DMA1_Stream3_IRQHandler(void);
|
||||
void TIM2_IRQHandler(void);
|
||||
void DMA2_Stream0_IRQHandler(void);
|
||||
void DMA2_Stream3_IRQHandler(void);
|
||||
void OTG_FS_IRQHandler(void);
|
||||
|
||||
@ -34,11 +34,14 @@ extern "C" {
|
||||
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_TIM1_Init(void);
|
||||
void MX_TIM2_Init(void);
|
||||
|
||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
|
||||
|
||||
|
||||
@ -45,22 +45,22 @@ void MX_DMA_Init(void)
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Stream0_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 1, 0);
|
||||
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
|
||||
/* DMA1_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 0);
|
||||
HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
|
||||
/* DMA2_Stream0_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
|
||||
/* DMA2_Stream3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 3, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 10, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
|
||||
/* DMA2_Stream6_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 3, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 10, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
|
||||
/* DMA2_Stream7_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 6, 0);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 12, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
|
||||
|
||||
}
|
||||
|
||||
248
Core/Src/main.c
248
Core/Src/main.c
@ -64,6 +64,7 @@
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
extern SPI_HandleTypeDef hspi2;
|
||||
extern SPI_HandleTypeDef hspi3;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern UART_HandleTypeDef huart3;
|
||||
|
||||
@ -83,6 +84,7 @@ static uint32_t g_sample_count = 0;
|
||||
static uint32_t g_last_debug_output = 0;
|
||||
static uint8_t g_debug_output_enabled = ENABLE_UART_DEBUG_OUTPUT;
|
||||
static SystemPerfStats_t g_perf_stats;
|
||||
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@ -90,7 +92,8 @@ void SystemClock_Config(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
static void StartRecording(void);
|
||||
static void StopRecording(void);
|
||||
static HAL_StatusTypeDef ValidateSystemHealth(void);
|
||||
static void ProcessAdcData(void);
|
||||
|
||||
static void DebugOutput_Init(void);
|
||||
static void DebugOutput_SendString(const char* str);
|
||||
static void DebugOutput_PrintSystemStats(void);
|
||||
@ -129,6 +132,111 @@ static void StopRecording(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 处理ADC数据
|
||||
* @retval None
|
||||
*/
|
||||
static void ProcessAdcData(void)
|
||||
{
|
||||
// 检查ADC数据是否准备就绪
|
||||
LTC2508_BufferTypeDef *ready_buffer = NULL;
|
||||
if (LTC2508_GetReadyBuffer(&ready_buffer) == LTC2508_OK && ready_buffer != NULL)
|
||||
{
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_ADC_PROCESSING);
|
||||
SystemMonitor_SetState(SYSTEM_STATE_SAMPLING);
|
||||
g_sample_count++;
|
||||
|
||||
// 1. 从双缓冲区获取数据并合并 (高位16位在前)
|
||||
int32_t raw_adc[NUM_LTC2508];
|
||||
for (uint8_t i = 0; i < NUM_LTC2508; i++) {
|
||||
raw_adc[i] = (int32_t)(((uint32_t)ready_buffer->data[i][0] << 16) | ready_buffer->data[i][1]);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_ADC_PROCESSING);
|
||||
|
||||
// 2. 验证数据有效性
|
||||
uint8_t data_valid = 1;
|
||||
for (uint8_t i = 0; i < NUM_LTC2508; i++) {
|
||||
if (LTC2508_ValidateData(ready_buffer, i) != LTC2508_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_ADC);
|
||||
data_valid = 0;
|
||||
break; // 如果有任何通道数据无效,跳过整个样本
|
||||
}
|
||||
}
|
||||
|
||||
if (!data_valid) {
|
||||
// 释放缓冲区并返回
|
||||
LTC2508_ReleaseBuffer(LTC2508_GetCurrentReadBuffer());
|
||||
SystemMonitor_SetState(SYSTEM_STATE_IDLE);
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. 应用校正算法
|
||||
CorrectionResult_t correction_result;
|
||||
uint8_t correction_applied = 0;
|
||||
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_CORRECTION);
|
||||
if (g_correction_params.params_valid &&
|
||||
Apply_Correction(raw_adc[0], raw_adc[1], raw_adc[2],
|
||||
&correction_result, &g_correction_params) == HAL_OK) {
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_CORRECTION);
|
||||
|
||||
// 4a. 打包校正后的数据
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_DATA_PACKET);
|
||||
PackCorrectedData(&g_corrected_packet,
|
||||
correction_result.corrected_x,
|
||||
correction_result.corrected_y,
|
||||
correction_result.corrected_z);
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_DATA_PACKET);
|
||||
correction_applied = 1;
|
||||
|
||||
// 发送校正后的数据包
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_RS485_TX);
|
||||
if (RS485_SendData((uint8_t*)&g_corrected_packet, sizeof(CorrectedDataPacket_t)) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_COMMUNICATION);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_RS485_TX);
|
||||
} else {
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_CORRECTION);
|
||||
|
||||
// 4b. 校正失败或未启用,使用原始数据
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_DATA_PACKET);
|
||||
PackData(&g_data_packet, raw_adc[0], raw_adc[1], raw_adc[2]);
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_DATA_PACKET);
|
||||
|
||||
// 发送原始数据包
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_RS485_TX);
|
||||
if (RS485_SendData((uint8_t*)&g_data_packet, sizeof(DataPacket_t)) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_COMMUNICATION);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_RS485_TX);
|
||||
}
|
||||
|
||||
// 6. 存储数据到SD卡 (如果启用记录)
|
||||
if (g_recording_enabled) {
|
||||
SystemMonitor_SetState(SYSTEM_STATE_RECORDING);
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_FATFS_WRITE);
|
||||
|
||||
if (correction_applied) {
|
||||
// 存储校正后的数据
|
||||
if (DataStorage_WriteCorrectedData(&g_data_storage, &correction_result) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_STORAGE);
|
||||
}
|
||||
} else {
|
||||
// 存储原始数据
|
||||
if (DataStorage_WriteData(&g_data_storage, &g_data_packet) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_STORAGE);
|
||||
}
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_FATFS_WRITE);
|
||||
}
|
||||
|
||||
// 7. 释放已处理的缓冲区
|
||||
LTC2508_ReleaseBuffer(LTC2508_GetCurrentReadBuffer());
|
||||
|
||||
SystemMonitor_SetState(SYSTEM_STATE_IDLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化调试输出
|
||||
* @retval None
|
||||
@ -267,6 +375,7 @@ int main(void)
|
||||
MX_FATFS_Init();
|
||||
MX_USB_DEVICE_Init();
|
||||
MX_USART3_UART_Init();
|
||||
MX_TIM2_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
// 初始化系统监控
|
||||
SystemMonitor_Init();
|
||||
@ -296,9 +405,18 @@ int main(void)
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_STORAGE);
|
||||
}
|
||||
|
||||
// 开始数据记录
|
||||
StartRecording();
|
||||
|
||||
// 系统初始化完成
|
||||
SystemMonitor_SetState(SYSTEM_STATE_IDLE);
|
||||
|
||||
// 启动TIM2定时器用于1ms周期的ADC数据处理
|
||||
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_CRITICAL);
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
// 触发信号引脚初始化
|
||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
|
||||
@ -321,105 +439,10 @@ int main(void)
|
||||
g_last_monitor_update = current_tick;
|
||||
}
|
||||
|
||||
// 检查ADC数据是否准备就绪
|
||||
LTC2508_BufferTypeDef *ready_buffer = NULL;
|
||||
if (LTC2508_GetReadyBuffer(&ready_buffer) == LTC2508_OK && ready_buffer != NULL)
|
||||
{
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_ADC_PROCESSING);
|
||||
SystemMonitor_SetState(SYSTEM_STATE_SAMPLING);
|
||||
g_sample_count++;
|
||||
// ADC数据处理已移至1ms定时器中断中处理
|
||||
|
||||
// 1. 从双缓冲区获取数据并合并 (高位16位在前)
|
||||
int32_t raw_adc[NUM_LTC2508];
|
||||
for (uint8_t i = 0; i < NUM_LTC2508; i++) {
|
||||
raw_adc[i] = (int32_t)(((uint32_t)ready_buffer->data[i][0] << 16) | ready_buffer->data[i][1]);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_ADC_PROCESSING);
|
||||
|
||||
// 2. 验证数据有效性
|
||||
uint8_t data_valid = 1;
|
||||
for (uint8_t i = 0; i < NUM_LTC2508; i++) {
|
||||
if (LTC2508_ValidateData(ready_buffer, i) != LTC2508_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_ADC);
|
||||
data_valid = 0;
|
||||
break; // 如果有任何通道数据无效,跳过整个样本
|
||||
}
|
||||
}
|
||||
|
||||
if (!data_valid) {
|
||||
// 释放缓冲区并继续下一次循环
|
||||
LTC2508_ReleaseBuffer(g_current_read_buffer);
|
||||
SystemMonitor_SetState(SYSTEM_STATE_IDLE);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 3. 应用校正算法
|
||||
CorrectionResult_t correction_result;
|
||||
uint8_t correction_applied = 0;
|
||||
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_CORRECTION);
|
||||
if (g_correction_params.params_valid &&
|
||||
Apply_Correction(raw_adc[0], raw_adc[1], raw_adc[2],
|
||||
&correction_result, &g_correction_params) == HAL_OK) {
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_CORRECTION);
|
||||
|
||||
// 4a. 打包校正后的数据
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_DATA_PACKET);
|
||||
PackCorrectedData(&g_corrected_packet,
|
||||
correction_result.corrected_x,
|
||||
correction_result.corrected_y,
|
||||
correction_result.corrected_z);
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_DATA_PACKET);
|
||||
correction_applied = 1;
|
||||
|
||||
// 发送校正后的数据包
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_RS485_TX);
|
||||
if (RS485_SendData((uint8_t*)&g_corrected_packet, sizeof(CorrectedDataPacket_t)) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_COMMUNICATION);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_RS485_TX);
|
||||
} else {
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_CORRECTION);
|
||||
|
||||
// 4b. 校正失败或未启用,使用原始数据
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_DATA_PACKET);
|
||||
PackData(&g_data_packet, raw_adc[0], raw_adc[1], raw_adc[2]);
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_DATA_PACKET);
|
||||
|
||||
// 发送原始数据包
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_RS485_TX);
|
||||
if (RS485_SendData((uint8_t*)&g_data_packet, sizeof(DataPacket_t)) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_COMMUNICATION);
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_RS485_TX);
|
||||
}
|
||||
|
||||
// 6. 存储数据到SD卡 (如果启用记录)
|
||||
if (g_recording_enabled) {
|
||||
SystemMonitor_SetState(SYSTEM_STATE_RECORDING);
|
||||
PerformanceMonitor_TaskStart(PERF_TASK_FATFS_WRITE);
|
||||
|
||||
if (correction_applied) {
|
||||
// 存储校正后的数据
|
||||
if (DataStorage_WriteCorrectedData(&g_data_storage, &correction_result) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_STORAGE);
|
||||
}
|
||||
} else {
|
||||
// 存储原始数据
|
||||
if (DataStorage_WriteData(&g_data_storage, &g_data_packet) != HAL_OK) {
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_STORAGE);
|
||||
}
|
||||
}
|
||||
PerformanceMonitor_TaskEnd(PERF_TASK_FATFS_WRITE);
|
||||
}
|
||||
|
||||
// 7. 释放已处理的缓冲区
|
||||
LTC2508_ReleaseBuffer(g_current_read_buffer);
|
||||
|
||||
SystemMonitor_SetState(SYSTEM_STATE_IDLE);
|
||||
}
|
||||
|
||||
// 处理数据存储后台任务
|
||||
// 处理数据存储后台任务 (轮询方式)
|
||||
if (g_recording_enabled) {
|
||||
DataStorage_ProcessBackgroundTasks(&g_data_storage);
|
||||
}
|
||||
@ -434,6 +457,10 @@ int main(void)
|
||||
// ADC采样由PA1外部中断触发,不在主循环中触发
|
||||
// 可以在这里添加其他低优先级任务
|
||||
}
|
||||
|
||||
// 停止数据记录
|
||||
StopRecording();
|
||||
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
|
||||
@ -528,6 +555,31 @@ void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
|
||||
SystemMonitor_ReportError(SYSTEM_ERROR_ADC);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM2回调函数 - 1ms定时器中断处理ADC数据
|
||||
* @param htim: TIM句柄指针
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
if (htim->Instance == TIM2) {
|
||||
// ADC是4KHz采样率,定时器是1KHz,需要在每次1ms中断中处理多个ADC数据
|
||||
// 循环处理所有可用的ADC数据,直到没有新数据为止
|
||||
uint8_t processed_count = 0;
|
||||
const uint8_t max_process_per_interrupt = 8; // 限制每次中断最多处理的数据量,避免中断时间过长
|
||||
|
||||
while (processed_count < max_process_per_interrupt) {
|
||||
LTC2508_BufferTypeDef *ready_buffer = NULL;
|
||||
if (LTC2508_GetReadyBuffer(&ready_buffer) == LTC2508_OK && ready_buffer != NULL) {
|
||||
ProcessAdcData();
|
||||
processed_count++;
|
||||
} else {
|
||||
break; // 没有更多数据可处理
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief UART传输完成回调函数
|
||||
* @param huart: UART句柄指针
|
||||
|
||||
@ -63,6 +63,7 @@ extern DMA_HandleTypeDef hdma_sdio_tx;
|
||||
extern DMA_HandleTypeDef hdma_spi1_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi2_rx;
|
||||
extern DMA_HandleTypeDef hdma_spi3_rx;
|
||||
extern TIM_HandleTypeDef htim2;
|
||||
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||
/* USER CODE BEGIN EV */
|
||||
extern SPI_HandleTypeDef hspi1;
|
||||
@ -251,6 +252,20 @@ void DMA1_Stream3_IRQHandler(void)
|
||||
/* USER CODE END DMA1_Stream3_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM2 global interrupt.
|
||||
*/
|
||||
void TIM2_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN TIM2_IRQn 0 */
|
||||
|
||||
/* USER CODE END TIM2_IRQn 0 */
|
||||
HAL_TIM_IRQHandler(&htim2);
|
||||
/* USER CODE BEGIN TIM2_IRQn 1 */
|
||||
|
||||
/* USER CODE END TIM2_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles DMA2 stream0 global interrupt.
|
||||
*/
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
TIM_HandleTypeDef htim1;
|
||||
TIM_HandleTypeDef htim2;
|
||||
|
||||
/* TIM1 init function */
|
||||
void MX_TIM1_Init(void)
|
||||
@ -95,6 +96,46 @@ void MX_TIM1_Init(void)
|
||||
/* USER CODE END TIM1_Init 2 */
|
||||
HAL_TIM_MspPostInit(&htim1);
|
||||
|
||||
}
|
||||
/* TIM2 init function */
|
||||
void MX_TIM2_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN TIM2_Init 0 */
|
||||
|
||||
/* USER CODE END TIM2_Init 0 */
|
||||
|
||||
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||
|
||||
/* USER CODE BEGIN TIM2_Init 1 */
|
||||
|
||||
/* USER CODE END TIM2_Init 1 */
|
||||
htim2.Instance = TIM2;
|
||||
htim2.Init.Prescaler = 83;
|
||||
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim2.Init.Period = 999;
|
||||
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN TIM2_Init 2 */
|
||||
|
||||
/* USER CODE END TIM2_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
|
||||
@ -111,6 +152,21 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
|
||||
|
||||
/* USER CODE END TIM1_MspInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM2)
|
||||
{
|
||||
/* USER CODE BEGIN TIM2_MspInit 0 */
|
||||
|
||||
/* USER CODE END TIM2_MspInit 0 */
|
||||
/* TIM2 clock enable */
|
||||
__HAL_RCC_TIM2_CLK_ENABLE();
|
||||
|
||||
/* TIM2 interrupt Init */
|
||||
HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
|
||||
HAL_NVIC_EnableIRQ(TIM2_IRQn);
|
||||
/* USER CODE BEGIN TIM2_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM2_MspInit 1 */
|
||||
}
|
||||
}
|
||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
|
||||
{
|
||||
@ -154,6 +210,20 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
|
||||
|
||||
/* USER CODE END TIM1_MspDeInit 1 */
|
||||
}
|
||||
else if(tim_baseHandle->Instance==TIM2)
|
||||
{
|
||||
/* USER CODE BEGIN TIM2_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END TIM2_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM2_CLK_DISABLE();
|
||||
|
||||
/* TIM2 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(TIM2_IRQn);
|
||||
/* USER CODE BEGIN TIM2_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM2_MspDeInit 1 */
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
@ -96,10 +96,11 @@ Mcu.CPN=STM32F405RGT6
|
||||
Mcu.Family=STM32F4
|
||||
Mcu.IP0=DMA
|
||||
Mcu.IP1=FATFS
|
||||
Mcu.IP10=USART1
|
||||
Mcu.IP11=USART3
|
||||
Mcu.IP12=USB_DEVICE
|
||||
Mcu.IP13=USB_OTG_FS
|
||||
Mcu.IP10=TIM2
|
||||
Mcu.IP11=USART1
|
||||
Mcu.IP12=USART3
|
||||
Mcu.IP13=USB_DEVICE
|
||||
Mcu.IP14=USB_OTG_FS
|
||||
Mcu.IP2=NVIC
|
||||
Mcu.IP3=RCC
|
||||
Mcu.IP4=SDIO
|
||||
@ -108,7 +109,7 @@ Mcu.IP6=SPI2
|
||||
Mcu.IP7=SPI3
|
||||
Mcu.IP8=SYS
|
||||
Mcu.IP9=TIM1
|
||||
Mcu.IPNb=14
|
||||
Mcu.IPNb=15
|
||||
Mcu.Name=STM32F405RGTx
|
||||
Mcu.Package=LQFP64
|
||||
Mcu.Pin0=PH0-OSC_IN
|
||||
@ -136,26 +137,27 @@ Mcu.Pin28=VP_FATFS_VS_SDIO
|
||||
Mcu.Pin29=VP_SYS_VS_Systick
|
||||
Mcu.Pin3=PA1
|
||||
Mcu.Pin30=VP_TIM1_VS_ClockSourceINT
|
||||
Mcu.Pin31=VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS
|
||||
Mcu.Pin31=VP_TIM2_VS_ClockSourceINT
|
||||
Mcu.Pin32=VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS
|
||||
Mcu.Pin4=PA2
|
||||
Mcu.Pin5=PA5
|
||||
Mcu.Pin6=PA6
|
||||
Mcu.Pin7=PA7
|
||||
Mcu.Pin8=PB10
|
||||
Mcu.Pin9=PB11
|
||||
Mcu.PinsNb=32
|
||||
Mcu.PinsNb=33
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F405RGTx
|
||||
MxCube.Version=6.15.0
|
||||
MxDb.Version=DB.6.0.150
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.DMA1_Stream0_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream3_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream0_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream3_IRQn=true\:3\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream6_IRQn=true\:3\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream7_IRQn=true\:6\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream0_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA1_Stream3_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream0_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream3_IRQn=true\:10\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream6_IRQn=true\:10\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DMA2_Stream7_IRQn=true\:12\:0\:true\:false\:true\:false\:true\:true
|
||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.EXTI1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
|
||||
NVIC.ForceEnableDMAVector=true
|
||||
@ -167,6 +169,7 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
|
||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
|
||||
NVIC.TIM2_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
|
||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
PA1.GPIOParameters=GPIO_Label
|
||||
PA1.GPIO_Label=ADC_DRY
|
||||
@ -265,7 +268,7 @@ ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UAScriptAfterPath=
|
||||
ProjectManager.UAScriptBeforePath=
|
||||
ProjectManager.UnderRoot=true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_SDIO_SD_Init-SDIO-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_SPI3_Init-SPI3-false-HAL-true,8-MX_TIM1_Init-TIM1-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_FATFS_Init-FATFS-false-HAL-false,11-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,12-MX_USART3_UART_Init-USART3-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_SDIO_SD_Init-SDIO-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_SPI3_Init-SPI3-false-HAL-true,8-MX_TIM1_Init-TIM1-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_FATFS_Init-FATFS-false-HAL-false,11-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,12-MX_USART3_UART_Init-USART3-false-HAL-true,13-MX_TIM2_Init-TIM2-false-HAL-true
|
||||
RCC.48MHZClocksFreq_Value=48000000
|
||||
RCC.AHBFreq_Value=168000000
|
||||
RCC.APB1CLKDivider=RCC_HCLK_DIV4
|
||||
@ -320,6 +323,9 @@ SPI3.VirtualType=VM_SLAVE
|
||||
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
|
||||
TIM1.IPParameters=Channel-PWM Generation1 CH1,Period
|
||||
TIM1.Period=83
|
||||
TIM2.IPParameters=Prescaler,Period
|
||||
TIM2.Period=999
|
||||
TIM2.Prescaler=83
|
||||
USART1.IPParameters=VirtualMode
|
||||
USART1.VirtualMode=VM_ASYNC
|
||||
USART3.IPParameters=VirtualMode
|
||||
@ -337,6 +343,8 @@ VP_SYS_VS_Systick.Mode=SysTick
|
||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
||||
VP_TIM1_VS_ClockSourceINT.Mode=Internal
|
||||
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
|
||||
VP_TIM2_VS_ClockSourceINT.Mode=Internal
|
||||
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
|
||||
VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS.Mode=MSC_FS
|
||||
VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_MSC_FS
|
||||
board=custom
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
// 数据存储配置
|
||||
#define DATA_STORAGE_BUFFER_SIZE 1024 // 缓冲区大小(字节)
|
||||
#define DATA_STORAGE_BUFFER_SIZE 32768 // 缓冲区大小(字节)
|
||||
#define DATA_STORAGE_FILE_MAX_SIZE (10*1024*1024) // 单个文件最大10MB
|
||||
#define DATA_STORAGE_PATH "0:/DATA/" // 数据存储路径
|
||||
#define DATA_STORAGE_FILE_PREFIX "ADC_DATA_" // 文件名前缀
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
#define NUM_LTC2508 3
|
||||
|
||||
// 双缓冲区定义
|
||||
#define LTC2508_BUFFER_COUNT 2
|
||||
#define LTC2508_BUFFER_COUNT 64
|
||||
|
||||
// 缓冲区状态定义
|
||||
typedef enum {
|
||||
@ -78,4 +78,4 @@ uint8_t LTC2508_GetCurrentWriteBuffer(void);
|
||||
uint8_t LTC2508_GetCurrentReadBuffer(void);
|
||||
LTC2508_StatusTypeDef LTC2508_IsBufferReady(uint8_t buffer_index);
|
||||
|
||||
#endif // LTC2508_DRIVER_H
|
||||
#endif // LTC2508_DRIVER_H
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user