From 082ea96e8836b52071f4fe47b18899a82198a8bb Mon Sep 17 00:00:00 2001 From: zhoujie <929834232@qq.com> Date: Sun, 25 Jan 2026 21:20:15 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(adc):=20=E9=87=8D=E6=9E=84ADC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86=E6=9E=B6=E6=9E=84=EF=BC=8C?= =?UTF-8?q?=E5=BC=95=E5=85=A51ms=E5=AE=9A=E6=97=B6=E5=99=A8=E4=B8=AD?= =?UTF-8?q?=E6=96=AD=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增TIM2定时器配置,用于1ms周期的ADC数据处理中断 - 将主循环中的ADC数据处理逻辑移至定时器中断回调函数中 - 新增ProcessAdcData函数,封装完整的ADC数据处理流程 - 优化数据缓冲区大小,从2增加到64,提升数据处理能力 - 调整DMA中断优先级,优化系统实时性 🔧 chore(config): 更新STM32CubeMX项目配置 - 在IOC配置文件中添加TIM2定时器配置 - 更新NVIC中断优先级配置 - 调整DMA中断优先级设置 - 更新项目初始化函数调用顺序 📦 build(storage): 优化数据存储缓冲区配置 - 将数据存储缓冲区大小从1024字节增加到32768字节 - 提升数据写入效率,减少文件系统操作频率 --- Core/Inc/stm32f4xx_it.h | 1 + Core/Inc/tim.h | 3 + Core/Src/dma.c | 12 +- Core/Src/main.c | 248 ++++++++++++++++++++++++---------------- Core/Src/stm32f4xx_it.c | 15 +++ Core/Src/tim.c | 70 ++++++++++++ STM_ATEM_F405.ioc | 36 +++--- User/data_storage.h | 2 +- User/ltc2508_driver.h | 4 +- 9 files changed, 270 insertions(+), 121 deletions(-) diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index 7a18f3e..fcedcd4 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -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); diff --git a/Core/Inc/tim.h b/Core/Inc/tim.h index af069df..24dd662 100644 --- a/Core/Inc/tim.h +++ b/Core/Inc/tim.h @@ -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); diff --git a/Core/Src/dma.c b/Core/Src/dma.c index e75391b..0fb0498 100644 --- a/Core/Src/dma.c +++ b/Core/Src/dma.c @@ -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); } diff --git a/Core/Src/main.c b/Core/Src/main.c index a7cd61d..3a004fe 100644 --- a/Core/Src/main.c +++ b/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句柄指针 diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index a88c86e..418d021 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -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. */ diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 684c9e5..23c6a23 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -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 */ diff --git a/STM_ATEM_F405.ioc b/STM_ATEM_F405.ioc index db76d6f..9c6c6e6 100644 --- a/STM_ATEM_F405.ioc +++ b/STM_ATEM_F405.ioc @@ -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 diff --git a/User/data_storage.h b/User/data_storage.h index 057af18..843c7db 100644 --- a/User/data_storage.h +++ b/User/data_storage.h @@ -9,7 +9,7 @@ #include // 数据存储配置 -#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_" // 文件名前缀 diff --git a/User/ltc2508_driver.h b/User/ltc2508_driver.h index 05861a9..0a6cc0d 100644 --- a/User/ltc2508_driver.h +++ b/User/ltc2508_driver.h @@ -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 \ No newline at end of file +#endif // LTC2508_DRIVER_H