我们首先完成1ms定时,每隔1ms对PF6引脚的输出取反。使用固件库编写SysTick定时非常简单,只需使用SysTick_Config()函数与SysTick_CLKSourceConfig()函数。注意:这里PF6的1ms的定时闪烁LED,肉眼无法观察,可以使用示波器观察。
1.建立项目工程
我们首先对做好的固件库模板进行修改,建立好编译环境(今后的例程操作步骤一样):
(1)复制之前项目做好的LED工程模板,将复制好的文件夹名字改为FL_SysTick,并把工程文件名改为FL_SysTick.uvprojx。
(2)根据惯例,在USER文件夹内添加SysTick文件夹,用于存放SysTick的驱动“.c”文件与“.h”文件。分别命名为systick.c与systick.h。
(3)双击USER组,将systick.c添加进USER组,设置编译环境路径,添加SysTick文件夹,搭建好SysTick的项目文件模板。
2.编写systick.h
代码如下:
头文件只声明了SysTick_Init()函数,该函数在systick.c文件中编写,用于Systick的初始化与配置。
3.编写systick.c
代码如下:
程序第一行与第二行包含systick.h与misc.h文件,因为SysTick_CLKSourceConfig()函数在misc.h内声明,SysTick_Config()函数在core_cm4.h内,已经在stm32f4xx.h中包含过,无须再包含一次。
编写systick初始化与配置函数,首先要编写SysTick_Config(),填入实参。参数应该是计数器的计数值(初值)。这里参数填入SystemCoreClock/1000。SystemCoreClock已经宏定义为168M了,即168000000,按照运算规律,1ms的定时正好是168M/1000,即SystemCoreClock/1000。再编写SysTick_CLKSourceConfig()函数,即时钟分频因子选择函数。前面的章节已经介绍过,该函数的参数为SysTick_CLKSource_HCLK,当分频因子为1时不分频,定时器时钟按168M的频率计数。这里预留8分频的分频因子,对8分频的时钟频率进行定时验证。
4.编写main.c
利用已经做好的led.c驱动,直接对PF6进行初始化。
(www.xing528.com)
5.修改stm32f4xx-it.c,添加SysTick定时器中断服务函数
在中断章节中,我们已经知道中断服务函数都放在了stm32f4xx_it.c文件内。打开stm32f4xx_it.c并找到SysTick_Handler()函数,如图6-9所示。
图6-9 stm32f4xx_it.c文件内的SysTick_Handler()函数
函数中无内容。根据任务要求,我们需要完成1ms定时,对PF6取反,添加代码如下:
下载并编译程序,用示波器观察PF6引脚输出波形,如图6-10所示。通过示波器检测可知,周期为2ms,每隔1ms,引脚PF6输出取反一次。
图6-10 Systick定时1ms的输出取反波形
下面验证8分频因子带来的定时,修改systick.c,将SysTick_CLKSourceConfig()参数改为SysTick_CLKSource_HCLK_Div8,如图6-11所示。
图6-11 修改分频因子为8分频
编译后观察输出结果,如图6-12所示,可以发现输出波形的周期变成了16ms,与预设一致。
图6-12 系统时钟8分频后的输出波形
编写程序时一定要注意,先编写SysTick_Config()函数,后编写SysTick_CLKSourceConfig()函数,否则无法实现8分频,如果倒过来,或者不写SysTick_CLKSourceConfig()函数,就代表默认使用分频因子为1,即系统时钟不分频。读者可以自行验证。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。