因为要使用LED,所以先复制前面做好的FL_LED工程文件夹,并且将文件夹重新命名为FL_Tim6,将项目文件名重新命名为FL_Tim6.uvprojx,在User目录下添加文件夹BasicTim,在编译环境的Include Path中添加BasicTim目录,建立basictim.c与basictim.h两个文件。
1.编写basictim.h
编写basictim.h头文件,与编写其他头文件的操作基本一样:
编写头文件时,首先要对TIM6、TIM6外设时钟、TIM6中断与TIM6中断服务都进行宏定义。如果要使用TIM7,则对宏定义做出修改即可,无须再在程序中改动。然后在头文件中预先声明TIMx_Configuration()函数,在basictim.c中完成此函数的编写。
2.编写basictim.c
首先编写NVIC初始化函数。因为使用了定时器中断,它属于外设中断,因此要设置定时器中断的优先级以及初始化,编写中断初始化函数。编写函数定时器中断配置函数如下:
然后编写定时器初始化函数。定时器初始化的操作步骤如下:
(1)初始化定时器结构体。
使用TIM_TimeBaseInitTypeDef进行初始化结构体定义:TIM_TimeBaseStructure,这是常规操作,与使用GPIO等外设类似,对必要的控制寄存器的结构体定义。
(2)开启定时器时钟。
与其他外设一样,要使用外设,必须打开相应的时钟,因此这里也要打开定时器的时钟,这个时钟实际来自APB1。
使用时钟命令函数使能定时器:
(3)设置TIM_Period与TIM_Prescaler。
按0.5s定时的要求,默认定时器使用时钟CK_PSC的频率为84MHz,预分频可以设置为8400,则计数时钟频率为84MHz/8400=10kHz,周期为0.1ms,计数值为0.5s/0.1ms=5000,因此TIM_Period=5000-1,即从0开始计数到4999,TIM_Prescaler=8400-1,分频值为8400。
(4)使用初始化定时器函数初始化。
当结构体成员都赋值(设置)完毕,与其他案例类似,使用一个初始化函数将这个外设进行初始化。定时器的初始化函数如下:
(5)清除定时器更新标志。
除了初始化函数外,还需要使用TIM_ClearFlag()函数清除定时器更新中断标志位。这个函数主要操作定时器TIMx_SR寄存器的UIF位,在官方数据手册中的描述是:对该位在发生更新事件时通过硬件置1,但需要通过软件清0。意思是定时器发生更新时(对基本定时器而言,则是溢出引起事件的更新),硬件置1,因此在使用定时器前,先对此位清0,为下一次定时器做好准备。TIM_ClearFlag()函数在stm32f4xx_tim.c中可以找到,如图6-17所示。
图6-17 TIM_Clear Flag()函数的定义与说明
从以上说明可以看出,TIM_ClearFlag()函数的使用方法为:TIM_ClearFlag(TIMx,清除请求对象)。比如基本定时器只有上溢的中断请求一种,因此清除Tim6定时器的上溢请求时,编写函数TIM_ClearFlag(BASIC_TIM,TIM_FLAG_Update)即可。
(6)开启定时器更新标志。(www.xing528.com)
TIM_ITConfig()函数可在stm32f4xx_tim.c中找到,如图6-18所示。
图6-18 TIM_ITConfig()函数
该函数有三个形参:第一个形参为TIMx,x为相应的定时器号;第二个形参为TIM_IT,为定时器的中断源,具体参数参考图6-18的参数,其中基本定时器Tim6与Tim7只有TIM_IT_Update上溢中断标志;第三个形参为NewState,其值为ENABLE或DISABLE,用于使能。
这里打开Tim6的上溢中断标志:
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
(7)使能定时器。
最后一步,使能定时器,使用函数TIM_Cmd(TIM6,ENABLE)。
按照在basictim.h中的宏定义BASIC_TIM等,编写定时器设置函数如下:
最后编写basictim.c如下:
3.编写main.c与中断服务函数
编写main.c文件的程序很简单,只需初始化LED的GPIO与定时器,即可进入空循环。代码如下:
主函数非常简单,0.5s的LED取反程序代码放在中断服务函数内处理。STM32的定时器服务中断也是在stm32f4xx_it.c内编写。如Tim6对应中断服务函数名称是void TIM6_DAC_IRQHandler(),这个对应的服务函数名称列表在前面中断系统中有介绍,详见图5-13,可查看startup_stm32f40xx.s文件里的中断向量表。所有的外部中断与定时器等外设的中断服务函数都必须由用户自己添加到stm32f4xx_it.c中。
首先在stm32f4xx_it.c文件开头添加头文件:
#include"stm32f4xx_it.h"
#include"led.h"
#include"basictim.h"
然后在stm32f4xx_it.c末尾添加定时器中断函数,由于使用了BASIC_TIM_IRQHandler的宏,再添加中断服务函数:
由于产生定时器中断的事件不止一个,函数首先对基本定时器的上溢事件中断状态进行判断,如果是,则对GPIO PF6进行取反操作,操作完毕后清除中断请求;否则,定时器一直处于当前的中断,无法进入下一次的中断。
最后编译并下载程序使红色LED实现0.5s周期的闪烁输出。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。