STM32F7上的定时器不稳定

2019-07-14 17:12发布

首先,我是一个完整的n00b,刚刚开始使用STM32。我在设置tiM1和使用外部中断EXTI3时遇到了一些奇怪的行为。我正在尝试测量外部中断的低输入频率,并使用TIM1递增1 MHz计数器,因此我可以以微秒为单位进行测量。我这样做,因为看起来SysTick不够快(1毫秒)给我一个准确的测量。
核心时钟为16 MHz,TIM1设置如下:
  1. <font size="4">htim1.Instance = TIM1;
  2. htim1.Init.Prescaler = 16; // 16 MHz / 16 = 1 MHz
  3. htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  4. htim1.Init.Period = 1; // 1Mhz no sub-dividing
  5. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  6. htim1.Init.RepetitionCounter = 0;
  7. ...
  8. HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
  9. HAL_NVIC_EnableIRQ(EXTI3_IRQn);
  10. ...
  11. void TIM1_UP_TIM10_IRQHandler(void)
  12. {
  13.     timerTicks++;
  14.     HAL_TIM_IRQHandler(&htim1);
  15. }
  16. ...
  17. void EXTI1_IRQHandler(void)
  18. {
  19.     previousTimerTicks = currentTimerTicks;
  20.     currentTimerTicks = timerTicks;
  21. }
  22. ...
  23. // Start the timer as interrupt
  24. HAL_TIM_Base_Start_IT(&htim1);
  25. ...
  26. while(1){
  27.     // Blink a light so we know the program is running
  28.     HAL_GPIO_TogglePin(GPIOB, Led_Green_Pin);
  29.     HAL_Delay(100);
  30. }</font>
复制代码
但是,程序几乎锁定并且while()运行循环似乎没有执行。然而,我可以看到TIM1计数器正在递增。如果我将句点减慢到100,那么主应用程序循环似乎运行正常。这是TIM1和EXTI3在这个速度上发生冲突的问题 - 还是其他的事情发生在这里?我认为设备应该没有问题提供1 MHz计数器,但也许我这样做是错误的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
tinlyxian
1楼-- · 2019-07-15 01:32
在我所遵循的例子中我没有注意到这一点,但你似乎是正确的,非常好理解
lifei639156
2楼-- · 2019-07-15 02:30
你这一切都错了。
没有办法让你能够在16个时钟周期内执行你的定时器中断处理程序 - 永远不要绕过你的while(1)循环。

你应该做的是让计时器自由运行,只在溢出时处理中断。我们很快就会回到这里。

接下来,为EXTI设置一个中断处理程序,然后在其中捕获计时器的值并保存。
在下一个中断中,计算2个值之间的差值 - 并且你有它 - 两个连续EXTI事件之间的时间,它是你的定时器周期的倍数(如果保持相同,则为1uSec)。

但是如果定时器翻转怎么办 - 这就是我们想要在翻转时处理定时器中断的原因。
在这里,您可以设置一个标志,告诉您的EXTI处理程序计时器已经翻转,并且在进行计算时需要考虑到这一点。
tinlyxian
3楼-- · 2019-07-15 07:02
 精彩回答 2  元偷偷看……
lifei639156
4楼-- · 2019-07-15 12:15
这是你问题的根源。不要使用由定时器ISR递增的变量 - 使用定时器自己的内部硬件计数器寄存器 - 它已经存在并且可供您阅读和使用
tinlyxian
5楼-- · 2019-07-15 15:23
我明白了,我以为它会在下面实现相同的 - 谢谢你我会试一试。
lifei639156
6楼-- · 2019-07-15 19:47
这个实例的主要区别在于计时器自己的计数器已经在没有任何CPU干预的情况下递增,而您的ISR实现使用CPU指令。

一周热门 更多>