修改TIM3_IRQHandler使之每一秒都中断
时间: 2024-12-28 14:40:05 浏览: 6
为了使`TIM3_IRQHandler`每一秒触发一次中断,你需要调整定时器的基本定时周期(Period)和预分频系数(Prescaler),使得总的计数值每秒钟达到一定的整数倍。假设当前的计数模式是Up(递增计数),你需要计算出一个大约等于1秒内所需计数次数的值,这个值将是`TIM_Period`和`TIM_Prescaler`乘积的结果。
例如,如果你的系统时钟频率是36MHz,选择了APB1的2倍即72MHz,那么你可以这样操作:
1. 首先,确定一个大约接近1秒(比如1000毫秒)的计数值,这将成为`TIM_Period`的值。
```c
u16 period_ms = 1000; // 1000毫秒即1秒
```
2. 接着,使用系统时钟频率除以这个计数值得到预分频系数。由于36MHz / 1000 ≈ 36,所以可以选择一个稍微大于此值的预分频系数,例如40。
```c
u16 prescaler = 40;
```
3. 将这两个值传递给`TIM_TimeBaseInitTypeDef`结构体的`TIM_Period`和`TIM_Prescaler`成员。
```c
TIM_TimeBaseStructure.TIM_Period = period_ms;
TIM_TimeBaseStructure.TIM_Prescaler = prescaler;
```
4. 调用`TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure)`来更新定时器的配置。
5. 确保在`TIM3_IRQHandler`函数开始时,依然清除中断标志,并检查是否到了新的一秒,比如检查`value_nixietube`是否已经增加到等于周期数加上1,如果是,则表示新的一秒到来。
```c
if (value_nixietube == period_ms * (TIM_GetPrescaler(TIM3) + 1)) {
// 新的一秒,执行相应操作...
value_nixietube = 0;
}
```
记得在实际应用中要适当考虑余数,以防计数值溢出,而且可能需要添加延时来让定时器在新的一秒真正到来时才执行中断回调。
阅读全文