首先,我是一个完整的n00b,刚刚开始使用STM32。我在设置tiM1和使用外部中断EXTI3时遇到了一些奇怪的行为。我正在尝试测量外部中断的低输入频率,并使用TIM1递增1 MHz计数器,因此我可以以微秒为单位进行测量。我这样做,因为看起来SysTick不够快(1毫秒)给我一个准确的测量。
核心时钟为16 MHz,TIM1设置如下:- <font size="4">htim1.Instance = TIM1;
- htim1.Init.Prescaler = 16; // 16 MHz / 16 = 1 MHz
- htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim1.Init.Period = 1; // 1Mhz no sub-dividing
- htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim1.Init.RepetitionCounter = 0;
- ...
- HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(EXTI3_IRQn);
- ...
- void TIM1_UP_TIM10_IRQHandler(void)
- {
- timerTicks++;
- HAL_TIM_IRQHandler(&htim1);
- }
- ...
- void EXTI1_IRQHandler(void)
- {
- previousTimerTicks = currentTimerTicks;
- currentTimerTicks = timerTicks;
- }
- ...
- // Start the timer as interrupt
- HAL_TIM_Base_Start_IT(&htim1);
- ...
- while(1){
- // Blink a light so we know the program is running
- HAL_GPIO_TogglePin(GPIOB, Led_Green_Pin);
- HAL_Delay(100);
- }</font>
复制代码但是,程序几乎锁定并且while()运行循环似乎没有执行。然而,我可以看到TIM1计数器正在递增。如果我将句点减慢到100,那么主应用程序循环似乎运行正常。这是TIM1和EXTI3在这个速度上发生冲突的问题 - 还是其他的事情发生在这里?我认为设备应该没有问题提供1 MHz计数器,但也许我这样做是错误的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
没有办法让你能够在16个时钟周期内执行你的定时器中断处理程序 - 永远不要绕过你的while(1)循环。
你应该做的是让计时器自由运行,只在溢出时处理中断。我们很快就会回到这里。
接下来,为EXTI设置一个中断处理程序,然后在其中捕获计时器的值并保存。
在下一个中断中,计算2个值之间的差值 - 并且你有它 - 两个连续EXTI事件之间的时间,它是你的定时器周期的倍数(如果保持相同,则为1uSec)。
但是如果定时器翻转怎么办 - 这就是我们想要在翻转时处理定时器中断的原因。
在这里,您可以设置一个标志,告诉您的EXTI处理程序计时器已经翻转,并且在进行计算时需要考虑到这一点。
一周热门 更多>