30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在嵌入式开发中频率测量是一个常见且重要的应用场景。这次我们来看如何使用STM32C552的定时器输入捕获功能来精确测量外部信号的频率。这个功能在电机控制、传感器数据采集、通信协议分析等场景中非常实用。STM32C552作为STMicroelectronics推出的一款高性能微控制器其定时器模块提供了强大的输入捕获能力。通过配置定时器的输入捕获模式我们可以准确测量外部脉冲信号的频率、占空比等参数。相比软件轮询方式硬件定时器捕获具有更高的精度和更低的CPU占用率。本文将重点介绍STM32C552定时器输入捕获的配置方法、测量原理和实际验证步骤。我们会使用STM32CubeMX进行图形化配置结合HAL库编写代码最终实现一个可靠的频率测量方案。无论你是嵌入式初学者还是有经验的开发者都能从中获得实用的技术参考。1. 核心能力速览能力项说明测量范围理论上从几Hz到几十MHz具体取决于系统时钟和预分频设置测量精度取决于定时器时钟精度通常可达0.01%级别资源占用单个定时器通道极低CPU占用支持信号方波、脉冲波等数字信号开发环境STM32CubeMX Keil MDK/STM32CubeIDE库支持HAL库/LL库本文以HAL库为例适用场景电机转速测量、传感器频率采集、通信时钟检测等2. 输入捕获原理与工作流程输入捕获的基本原理是利用定时器的计数器值来记录外部信号边沿发生的时刻。通过捕获两个连续边沿如上升沿对应的计数器值计算时间间隔从而得到信号频率。具体工作流程如下配置定时器基础时钟和预分频器确定定时器的计数频率设置输入捕获通道选择捕获边沿上升沿/下降沿使能捕获中断在边沿到来时记录计数器值计算连续两个捕获值之差转换为时间间隔根据时间间隔计算频率值以测量1kHz信号为例周期为1ms。如果定时器时钟为1MHz每个计数代表1μs那么两个上升沿之间的计数值差应该为1000对应1ms的时间间隔。3. 硬件环境准备在进行软件配置前需要准备好硬件环境最小系统要求STM32C552开发板如NUCLEO-C552或自定义板ST-Link调试器通常开发板集成外部信号源函数发生器、PWM输出或其他待测信号示波器可选用于验证测量结果引脚连接将待测信号连接到STM32C552的定时器输入捕获引脚以TIM2_CH1为例对应PA0引脚具体参考芯片数据手册确保信号电平符合STM32的IO电平标准3.3V信号要求信号幅度0-3.3V信号类型数字信号方波、脉冲波最大频率不超过定时器最大计数频率的一半奈奎斯特采样定理4. STM32CubeMX工程配置使用STM32CubeMX可以快速完成定时器和GPIO的配置4.1 时钟树配置首先配置系统时钟确保定时器有足够精确的时钟源选择HSI或HSE作为系统时钟源配置PLL倍频得到系统主频如80MHz配置APB总线时钟定时器时钟通常来自APB对于STM32C552定时器时钟频率由APB预分频器决定。如果APB预分频器不为1定时器时钟会是APB时钟的2倍。4.2 定时器基础配置以TIM2为例进行配置在Pinout界面选择TIM2选择Channel1为Input Capture direct mode在Configuration标签页配置定时器参数Prescaler预分频器根据测量范围设置Counter Mode计数模式Up向上计数Counter Period自动重装载值0xFFFF16位最大值auto-reload preloadDisable预分频器的计算公式定时器计数频率 定时器时钟频率 / (Prescaler 1)例如如果定时器时钟为80MHz要得到1MHz的计数频率则Prescaler 79。4.3 输入捕获通道配置在TIM2的Parameter Settings中配置输入捕获IC SelectionDirect TI直接模式IC PolarityRising Edge上升沿捕获IC PrescalerDiv1每个事件都捕获IC Filter0x0无滤波高速信号时可适当增加输入捕获滤波器IC1F[3:0]用于设置采样频率和数字滤波器长度。其中fCK_INT是定时器的输入频率fDTS是根据TIMx_CR1的CKD[1:0]的设置来确定的。对于大多数应用设置为0即可。4.4 NVIC中断配置使能定时器捕获中断在NVIC Settings中勾选TIM2全局中断设置合适的抢占优先级和子优先级5. 代码实现与功能验证生成代码后我们需要编写具体的捕获逻辑5.1 变量定义与初始化// 全局变量定义 volatile uint32_t capture_count 0; volatile uint32_t last_capture_value 0; volatile uint32_t current_capture_value 0; volatile uint32_t capture_difference 0; volatile float frequency_hz 0.0; volatile uint8_t capture_ready 0; // 定时器初始化 void TIM2_Init(void) { HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); }5.2 输入捕获中断处理// 在stm32c5xx_it.c中实现中断处理 void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(htim2); } // 捕获比较回调函数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM2) { capture_count; if(capture_count 1) { // 第一次捕获记录值 last_capture_value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); } else if(capture_count 2) { // 第二次捕获计算差值 current_capture_value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if(current_capture_value last_capture_value) { capture_difference current_capture_value - last_capture_value; } else { // 处理计数器溢出 capture_difference (0xFFFF - last_capture_value) current_capture_value; } // 计算频率 frequency_hz (float)SystemCoreClock / (htim2.Init.Prescaler 1) / capture_difference; capture_ready 1; capture_count 0; } } }5.3 主循环中的频率读取int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); TIM2_Init(); while(1) { if(capture_ready) { // 频率值已更新可以进行处理 printf(Measured Frequency: %.2f Hz\r\n, frequency_hz); capture_ready 0; // 添加适当的延时避免过于频繁的输出 HAL_Delay(500); } } }6. 测量精度优化策略为了提高频率测量的精度可以采取以下策略6.1 预分频器优化配置预分频器的设置直接影响测量精度和范围高频信号使用较小的预分频值提高时间分辨率低频信号使用较大的预分频值避免计数器过快溢出计算公式最优预分频器 定时器时钟频率 / 预期最大频率 - 16.2 多次测量取平均#define SAMPLE_COUNT 10 volatile float frequency_sum 0; volatile uint8_t sample_count 0; // 修改回调函数实现多次平均 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static float samples[SAMPLE_COUNT]; static uint8_t index 0; // ... 频率计算代码 ... if(capture_ready) { samples[index] frequency_hz; index (index 1) % SAMPLE_COUNT; // 计算平均值 float sum 0; for(int i 0; i SAMPLE_COUNT; i) { sum samples[i]; } frequency_hz sum / SAMPLE_COUNT; } }6.3 信号滤波处理对于有噪声的信号可以启用硬件滤波器// 在CubeMX中设置输入捕获滤波器 // 或者在代码中配置 TIM_ICInitTypeDef sConfigIC; sConfigIC.ICFilter 0x6; // 中等滤波强度 HAL_TIM_IC_ConfigChannel(htim2, sConfigIC, TIM_CHANNEL_1);7. 实际测试与效果验证7.1 测试环境搭建使用以下设备进行验证STM32C552 NUCLEO开发板函数发生器输出1kHz方波3.3V幅度逻辑分析仪可选用于信号质量检查7.2 测试步骤硬件连接将函数发生器输出连接到开发板的PA0引脚TIM2_CH1信号设置函数发生器输出1kHz占空比50%幅度3.3V的方波程序下载编译并下载上述代码到开发板串口监控通过串口调试助手查看频率测量结果7.3 预期结果对于1kHz输入信号测量结果应该在999-1001Hz范围内波动具体精度取决于时钟精度和信号质量。7.4 不同频率测试测试多个频率点以验证测量范围的正确性输入频率预期测量结果允许误差100 Hz99-101 Hz±1%1 kHz999-1001 Hz±0.1%10 kHz9.99-10.01 kHz±0.1%100 kHz99.9-100.1 kHz±0.1%8. 常见问题与排查方法问题现象可能原因排查方式解决方案测量值为0信号未连接或引脚配置错误检查硬件连接验证引脚配置确认信号源工作正常检查CubeMX引脚分配测量值不稳定信号噪声大或接触不良用示波器观察信号质量增加硬件滤波或软件平均算法测量值偏差大时钟配置错误检查系统时钟和定时器时钟配置确认时钟树配置正确PLL锁定正常无法进入中断NVIC未配置或优先级问题检查NVIC配置确认中断使能在CubeMX中正确配置中断优先级计数器溢出信号频率过低检查捕获差值计算逻辑增加预分频器或使用32位定时器8.1 中断优先级配置要点确保定时器中断具有合适的优先级// 在main.c中检查NVIC配置 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn);8.2 信号质量检查使用示波器检查输入信号上升/下降时间是否满足要求是否存在过冲或振铃信号幅度是否在0-3.3V范围内9. 高级功能扩展9.1 占空比测量通过交替捕获上升沿和下降沿可以测量信号的占空比void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint8_t edge_state 0; // 0:等待上升沿, 1:等待下降沿 static uint32_t rise_time, fall_time; if(edge_state 0) { // 上升沿捕获 rise_time HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 切换为下降沿捕获 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); edge_state 1; } else { // 下降沿捕获 fall_time HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 计算占空比 uint32_t period fall_time - rise_time; // 需要处理溢出 uint32_t high_time ... // 根据具体逻辑计算 float duty_cycle (float)high_time / period * 100; // 切换回上升沿捕获 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); edge_state 0; } }9.2 多通道频率测量如果需要同时测量多个信号的频率可以使用定时器的多个捕获通道// 同时使能多个通道 HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_3); // 在回调函数中区分通道 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { // 通道1处理 } else if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_2) { // 通道2处理 } // ... 更多通道 }9.3 自动量程切换对于宽范围频率测量可以实现自动量程切换功能void auto_range_adjust(void) { if(frequency_hz 100000) // 高频范围 { // 设置小预分频器 htim2.Instance-PSC 79; // 1MHz计数频率 } else if(frequency_hz 100) // 低频范围 { // 设置大预分频器 htim2.Instance-PSC 7999; // 10kHz计数频率 } else // 中频范围 { htim2.Instance-PSC 799; // 100kHz计数频率 } // 重新启动定时器 __HAL_TIM_DISABLE(htim2); __HAL_TIM_SET_COUNTER(htim2, 0); __HAL_TIM_ENABLE(htim2); }10. 性能优化与最佳实践10.1 资源占用优化CPU占用输入捕获使用硬件中断CPU只在边沿到来时被唤醒占用率极低内存使用只需要少量变量存储捕获值内存占用可忽略不计功耗考虑在低功耗应用中可以配置定时器在测量间隔进入睡眠模式10.2 实时性考虑对于需要快速响应的应用使用DMA传输捕获值减少中断处理时间优化中断服务程序只完成必要的计算考虑使用更高优先级的定时器中断10.3 可靠性设计添加超时检测防止信号丢失导致的死锁实现数据有效性检查过滤异常测量值考虑计数器溢出的正确处理STM32C552的定时器输入捕获功能为频率测量提供了硬件级的解决方案结合HAL库的封装开发者可以快速实现高精度的频率测量应用。通过合理的配置和优化这个方案能够满足从低速传感器到高速数字信号的广泛测量需求。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度
STM32C552定时器输入捕获实现高精度频率测量技术详解
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在嵌入式开发中频率测量是一个常见且重要的应用场景。这次我们来看如何使用STM32C552的定时器输入捕获功能来精确测量外部信号的频率。这个功能在电机控制、传感器数据采集、通信协议分析等场景中非常实用。STM32C552作为STMicroelectronics推出的一款高性能微控制器其定时器模块提供了强大的输入捕获能力。通过配置定时器的输入捕获模式我们可以准确测量外部脉冲信号的频率、占空比等参数。相比软件轮询方式硬件定时器捕获具有更高的精度和更低的CPU占用率。本文将重点介绍STM32C552定时器输入捕获的配置方法、测量原理和实际验证步骤。我们会使用STM32CubeMX进行图形化配置结合HAL库编写代码最终实现一个可靠的频率测量方案。无论你是嵌入式初学者还是有经验的开发者都能从中获得实用的技术参考。1. 核心能力速览能力项说明测量范围理论上从几Hz到几十MHz具体取决于系统时钟和预分频设置测量精度取决于定时器时钟精度通常可达0.01%级别资源占用单个定时器通道极低CPU占用支持信号方波、脉冲波等数字信号开发环境STM32CubeMX Keil MDK/STM32CubeIDE库支持HAL库/LL库本文以HAL库为例适用场景电机转速测量、传感器频率采集、通信时钟检测等2. 输入捕获原理与工作流程输入捕获的基本原理是利用定时器的计数器值来记录外部信号边沿发生的时刻。通过捕获两个连续边沿如上升沿对应的计数器值计算时间间隔从而得到信号频率。具体工作流程如下配置定时器基础时钟和预分频器确定定时器的计数频率设置输入捕获通道选择捕获边沿上升沿/下降沿使能捕获中断在边沿到来时记录计数器值计算连续两个捕获值之差转换为时间间隔根据时间间隔计算频率值以测量1kHz信号为例周期为1ms。如果定时器时钟为1MHz每个计数代表1μs那么两个上升沿之间的计数值差应该为1000对应1ms的时间间隔。3. 硬件环境准备在进行软件配置前需要准备好硬件环境最小系统要求STM32C552开发板如NUCLEO-C552或自定义板ST-Link调试器通常开发板集成外部信号源函数发生器、PWM输出或其他待测信号示波器可选用于验证测量结果引脚连接将待测信号连接到STM32C552的定时器输入捕获引脚以TIM2_CH1为例对应PA0引脚具体参考芯片数据手册确保信号电平符合STM32的IO电平标准3.3V信号要求信号幅度0-3.3V信号类型数字信号方波、脉冲波最大频率不超过定时器最大计数频率的一半奈奎斯特采样定理4. STM32CubeMX工程配置使用STM32CubeMX可以快速完成定时器和GPIO的配置4.1 时钟树配置首先配置系统时钟确保定时器有足够精确的时钟源选择HSI或HSE作为系统时钟源配置PLL倍频得到系统主频如80MHz配置APB总线时钟定时器时钟通常来自APB对于STM32C552定时器时钟频率由APB预分频器决定。如果APB预分频器不为1定时器时钟会是APB时钟的2倍。4.2 定时器基础配置以TIM2为例进行配置在Pinout界面选择TIM2选择Channel1为Input Capture direct mode在Configuration标签页配置定时器参数Prescaler预分频器根据测量范围设置Counter Mode计数模式Up向上计数Counter Period自动重装载值0xFFFF16位最大值auto-reload preloadDisable预分频器的计算公式定时器计数频率 定时器时钟频率 / (Prescaler 1)例如如果定时器时钟为80MHz要得到1MHz的计数频率则Prescaler 79。4.3 输入捕获通道配置在TIM2的Parameter Settings中配置输入捕获IC SelectionDirect TI直接模式IC PolarityRising Edge上升沿捕获IC PrescalerDiv1每个事件都捕获IC Filter0x0无滤波高速信号时可适当增加输入捕获滤波器IC1F[3:0]用于设置采样频率和数字滤波器长度。其中fCK_INT是定时器的输入频率fDTS是根据TIMx_CR1的CKD[1:0]的设置来确定的。对于大多数应用设置为0即可。4.4 NVIC中断配置使能定时器捕获中断在NVIC Settings中勾选TIM2全局中断设置合适的抢占优先级和子优先级5. 代码实现与功能验证生成代码后我们需要编写具体的捕获逻辑5.1 变量定义与初始化// 全局变量定义 volatile uint32_t capture_count 0; volatile uint32_t last_capture_value 0; volatile uint32_t current_capture_value 0; volatile uint32_t capture_difference 0; volatile float frequency_hz 0.0; volatile uint8_t capture_ready 0; // 定时器初始化 void TIM2_Init(void) { HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); }5.2 输入捕获中断处理// 在stm32c5xx_it.c中实现中断处理 void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(htim2); } // 捕获比较回调函数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM2) { capture_count; if(capture_count 1) { // 第一次捕获记录值 last_capture_value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); } else if(capture_count 2) { // 第二次捕获计算差值 current_capture_value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if(current_capture_value last_capture_value) { capture_difference current_capture_value - last_capture_value; } else { // 处理计数器溢出 capture_difference (0xFFFF - last_capture_value) current_capture_value; } // 计算频率 frequency_hz (float)SystemCoreClock / (htim2.Init.Prescaler 1) / capture_difference; capture_ready 1; capture_count 0; } } }5.3 主循环中的频率读取int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); TIM2_Init(); while(1) { if(capture_ready) { // 频率值已更新可以进行处理 printf(Measured Frequency: %.2f Hz\r\n, frequency_hz); capture_ready 0; // 添加适当的延时避免过于频繁的输出 HAL_Delay(500); } } }6. 测量精度优化策略为了提高频率测量的精度可以采取以下策略6.1 预分频器优化配置预分频器的设置直接影响测量精度和范围高频信号使用较小的预分频值提高时间分辨率低频信号使用较大的预分频值避免计数器过快溢出计算公式最优预分频器 定时器时钟频率 / 预期最大频率 - 16.2 多次测量取平均#define SAMPLE_COUNT 10 volatile float frequency_sum 0; volatile uint8_t sample_count 0; // 修改回调函数实现多次平均 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static float samples[SAMPLE_COUNT]; static uint8_t index 0; // ... 频率计算代码 ... if(capture_ready) { samples[index] frequency_hz; index (index 1) % SAMPLE_COUNT; // 计算平均值 float sum 0; for(int i 0; i SAMPLE_COUNT; i) { sum samples[i]; } frequency_hz sum / SAMPLE_COUNT; } }6.3 信号滤波处理对于有噪声的信号可以启用硬件滤波器// 在CubeMX中设置输入捕获滤波器 // 或者在代码中配置 TIM_ICInitTypeDef sConfigIC; sConfigIC.ICFilter 0x6; // 中等滤波强度 HAL_TIM_IC_ConfigChannel(htim2, sConfigIC, TIM_CHANNEL_1);7. 实际测试与效果验证7.1 测试环境搭建使用以下设备进行验证STM32C552 NUCLEO开发板函数发生器输出1kHz方波3.3V幅度逻辑分析仪可选用于信号质量检查7.2 测试步骤硬件连接将函数发生器输出连接到开发板的PA0引脚TIM2_CH1信号设置函数发生器输出1kHz占空比50%幅度3.3V的方波程序下载编译并下载上述代码到开发板串口监控通过串口调试助手查看频率测量结果7.3 预期结果对于1kHz输入信号测量结果应该在999-1001Hz范围内波动具体精度取决于时钟精度和信号质量。7.4 不同频率测试测试多个频率点以验证测量范围的正确性输入频率预期测量结果允许误差100 Hz99-101 Hz±1%1 kHz999-1001 Hz±0.1%10 kHz9.99-10.01 kHz±0.1%100 kHz99.9-100.1 kHz±0.1%8. 常见问题与排查方法问题现象可能原因排查方式解决方案测量值为0信号未连接或引脚配置错误检查硬件连接验证引脚配置确认信号源工作正常检查CubeMX引脚分配测量值不稳定信号噪声大或接触不良用示波器观察信号质量增加硬件滤波或软件平均算法测量值偏差大时钟配置错误检查系统时钟和定时器时钟配置确认时钟树配置正确PLL锁定正常无法进入中断NVIC未配置或优先级问题检查NVIC配置确认中断使能在CubeMX中正确配置中断优先级计数器溢出信号频率过低检查捕获差值计算逻辑增加预分频器或使用32位定时器8.1 中断优先级配置要点确保定时器中断具有合适的优先级// 在main.c中检查NVIC配置 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn);8.2 信号质量检查使用示波器检查输入信号上升/下降时间是否满足要求是否存在过冲或振铃信号幅度是否在0-3.3V范围内9. 高级功能扩展9.1 占空比测量通过交替捕获上升沿和下降沿可以测量信号的占空比void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint8_t edge_state 0; // 0:等待上升沿, 1:等待下降沿 static uint32_t rise_time, fall_time; if(edge_state 0) { // 上升沿捕获 rise_time HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 切换为下降沿捕获 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); edge_state 1; } else { // 下降沿捕获 fall_time HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 计算占空比 uint32_t period fall_time - rise_time; // 需要处理溢出 uint32_t high_time ... // 根据具体逻辑计算 float duty_cycle (float)high_time / period * 100; // 切换回上升沿捕获 __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); edge_state 0; } }9.2 多通道频率测量如果需要同时测量多个信号的频率可以使用定时器的多个捕获通道// 同时使能多个通道 HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_3); // 在回调函数中区分通道 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { // 通道1处理 } else if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_2) { // 通道2处理 } // ... 更多通道 }9.3 自动量程切换对于宽范围频率测量可以实现自动量程切换功能void auto_range_adjust(void) { if(frequency_hz 100000) // 高频范围 { // 设置小预分频器 htim2.Instance-PSC 79; // 1MHz计数频率 } else if(frequency_hz 100) // 低频范围 { // 设置大预分频器 htim2.Instance-PSC 7999; // 10kHz计数频率 } else // 中频范围 { htim2.Instance-PSC 799; // 100kHz计数频率 } // 重新启动定时器 __HAL_TIM_DISABLE(htim2); __HAL_TIM_SET_COUNTER(htim2, 0); __HAL_TIM_ENABLE(htim2); }10. 性能优化与最佳实践10.1 资源占用优化CPU占用输入捕获使用硬件中断CPU只在边沿到来时被唤醒占用率极低内存使用只需要少量变量存储捕获值内存占用可忽略不计功耗考虑在低功耗应用中可以配置定时器在测量间隔进入睡眠模式10.2 实时性考虑对于需要快速响应的应用使用DMA传输捕获值减少中断处理时间优化中断服务程序只完成必要的计算考虑使用更高优先级的定时器中断10.3 可靠性设计添加超时检测防止信号丢失导致的死锁实现数据有效性检查过滤异常测量值考虑计数器溢出的正确处理STM32C552的定时器输入捕获功能为频率测量提供了硬件级的解决方案结合HAL库的封装开发者可以快速实现高精度的频率测量应用。通过合理的配置和优化这个方案能够满足从低速传感器到高速数字信号的广泛测量需求。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度