在我的项目中,两个 16 位定时器链接在一起以实现 32 位捕获分辨率。
tiM3 作为主定时器,TIM4 作为从定时器,由 TIM3 溢出事件提供时钟(TIM4 工作在外部时钟模式 1)。捕获信号连接到两个定时器输入(TIM3 的 CH2 和 TIM4 的 CH1)。主定时器以 36Mhz (72Mhz / 2) 运行。
捕获的数据在 TIM3(主)捕获中断中处理。
中断看起来像:
- uint32_t period_ticks = 0;
- uint16_t ccr_msb = TIM4.CCR1;
- uint16_t ccr_lsb = TIM3.CCR2;
- uint32_t ticks = (ccr_msb<<16) + ccr_lsb;
- period_ticks = ticks - pre_tick_count;
- pre_tick_count = ticks; // pre_tick_count is static
大多数情况下,此代码按预期工作,但当 ccr_lsb(主定时器捕获值)== 0 时会出现问题,而 ccr_msb(从定时器捕获值)比预期小 1,并且 period_ticks 变得比预期小 65535。当捕获事件与从定时器溢出事件同时发生时,看起来像是一些同步问题。丑陋的解决方法,如
- if (ccr_lsb == 0) ccr_msb++;
有助于解决这个问题。在没有此类变通办法的情况下,是否有正确的方法将定时器配置为在 32 位捕获模式下工作。