【摘要】:本实例通过通用定时器TIM3的定时中断来控制LED1的亮灭,LED1是直接连接到PE8上的。TIM3属于STM32F4处理器的内部资源,只需要软件设置即可正常工作。对于通用定时器而言,只有4个成员变量有效。设置定时器允许更新中断。只要使用TIM3的更新中断,寄存器的相应位便可使能更新中断。因为定时器也是一种中断,所以要通过操作NVIC为其设置中断优先级。在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。
本实例通过通用定时器TIM3的定时中断来控制LED1的亮灭,LED1是直接连接到PE8上的。TIM3属于STM32F4处理器的内部资源,只需要软件设置即可正常工作。例程中,初始化部分TIM3_Init、LED_Init和Delay_Init 3个自定义函数完成;进入while死循环等待外部中断发生;当定时时间到时,将触发定时中断,进入TIM3定时中断处理子程序TIM3_IRQHandler中,实现定时反转LED灯的效果。
1.定时器初始化过程
定时器初始化配置分为5个步骤,具体如下:
(1)使能定时器时钟总线。
TIM3是挂载在APB1之下,所以通过APB1总线下的使能函数来使能TIM3。调用的函数是如下:
(2)配置定时器定时参数,包括设置自动重装值、分频系数、计数方式等。
在库函数中,定时器的初始化参数是通过初始化函数TIM_TimeBaseInit实现的,例如:
函数有两个参数,第1个参数是配置哪个定时器;第2个参数是定时器初始化参数结构体指针,结构体类型为TIM_TimeBaseInitTypeDef,内有有5个成员变量。对于通用定时器而言,只有4个成员变量有效。例程中成员变量的设置如下:
下面我们来分析定时时间与自动重载值、分频系数的关系。定时器溢出时间公式如下:
Tout=((arr+1)×(psc+1))/Ft(μs)
例程中使用TIM3_Init(5000-1,8400-1)形式,使形参变量arr为4999、形参变量psc为8399,且TIM3此时Ft时钟频率为84MHz,因此可计算得出定时时间为500ms。
(3)设置定时器允许更新中断。
只要使用TIM3的更新中断,寄存器的相应位便可使能更新中断。在库函数中定时器中断使能是通过TIM_ITConfig函数来实现的,方法如下:(www.chuimin.cn)
注意:函数第2个参数除了有更新中断TIM_IT_Update之外,还有触发中断TIM_IT_Trigger及输入捕获中断等。其余定时中断工作模式的介绍,感兴趣的读者可阅读《STM32F4××中文参考手册》。
(4)设置定时器中断优先级。
因为定时器也是一种中断,所以要通过操作NVIC为其设置中断优先级。方法如下:
(5)开启定时器TIM3工作。
在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。在固件库中使能定时器的函数是通过TIM_Cmd函数来实现的,方法如下:
2.定时中断服务过程
在定时中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型;执行相关的操作,这里使用的是更新(溢出)中断,中断出现时状态寄存器SR的最低位为1;在处理完中断之后应该向TIM3_SR的最低位写0,以清除该中断标志。
在固件库函数里面,用来读取中断状态寄存器的值判断中断类型的函数是ITStatus TIM_GetITStatus,可以判断定时器TIMx的中断类型TIM_IT是否发生中断。例如,要判断定时器3是否发生更新(溢出)中断,方法如下:
固件库中清除中断标志位的函数是TIM_ClearITPendingBit,可以清除定时器TIMx的中断TIM_IT标志位。例如,在TIM3的溢出中断发生后,要清除中断标志位,其方法如下:
需要补充一点,固件库还提供了两个函数用来判断定时器状态及清除定时器状态标志位的函数TIM_GetFlagStatus和TIM_ClearFlag,其作用和前面两个函数的作用类似。只是在TIM_GetITStatus函数中会先判断这种中断是否使能,使能后才去判断中断标志位,而TIM_GetFlagStatus直接用来判断状态标志位。
3.两种定时的比较
在例程的主程序while循环中,指令delay_ms(500)调用SysTick时钟每延时500ms使指示灯LED2反转一次,而定时器TIM3每500ms触发中断,并使指示灯LED1反转一次。因此,虽然两个指示灯都是每一秒闪烁一次,但延时机制完全不同。对于时间精度和稳定性要求较高的场合,定时器中断方式效果更好些。
相关推荐