STM32开发板(小苗板)资料系列之十二——SysTick定时器

完整文章地址:http://wenku.baidu.com/view/69095e0902020740be1e9b36.html

实验例程讲解
先前的流水灯实验和按键实验都有用到延时程序,那部分的延时程序都是通过循环执行代码来实现的,延时的精确度不能保证。当我们需要精确延时时,就可以利用滴答定时器来实现了,理论上它的最小计时单位为AHB的时钟周期,即1/72000000秒(AHB最大时钟72M),这基本能满足一般的精确要求。下面通过实验代码来说明下滴答定时器如何使用。
实验调用了先前使用的流水灯实验代码,但只使用了LED1,需要添加的库文件和流水灯实验一样。
SysTick的中断是在文件core_cm3.h中配置的,没有使用NVIC来配置中断,所以不需要添加misc.c文件。
在这里再次强调下,一些库文件是任何一个实验都需要用到的,每次都必须添加,在流水灯实验中对这些库文件都有详细的说明,有不清楚的可以参考先前的实验,以后的说明资料就不再重复赘述。
需要用户编写的文件有LED.c和SysTick.c及SysTick.h文件,LED.c可以把前面的实验拿来直接用,只需要编写SysTick.c和SysTick.h就可以了,还需要在stm32f10x_conf.h中把使用到的ST库的头文件注释去掉(每个实验都是)。基于小苗板的实验代码,这里每个实验中ST库的头文件注释都被去掉了,如下图所示。






 




所以,就不再需要格外注释掉,但其他时候自己要注意查看所使用的外设头文件是否被注释了。
主函数
在这个主函数中,22行的LED_GPIO_Config()是初始化LED函数,流水灯实验中讲解过。SYSTICK_Init()是配置SysTick定时器的,delay_ms()函数是用来精确延时的,该延时函数是基于滴答定时器的,不是使用for循环。
主函数初始化好LED和SysTick定时器后,就进入while死循环,执行点亮LED1延时一段时间,然后再熄灭LED1再延时一段时间,不断循环。
SysTicktimer
看下SysTick_Init()函数。






 




函数SYSTICK_Init()是由用户在SysTick.c这个文件中实现的,其功能是启动系统SysTick,并配置SysTick为1us中断一次。
本函数实际调用了SysTick_Config()函数,它属于内核层Cortex_M3通用函数,在core_cm3.h文件中。该函数无法在STM32固件库手册中找到其使用方法,所以我们可查看core_cm3.h文件中该函数的定义。
通过该函数的注释,我们能够知道,这个函数检测了输入参数ticks是否大于重载寄存器和当前计数值寄存器的存储容量,并对参数进行处理;调用了NVIC_SetPriority函数配置了SysTick中断,所以我们在外设没有再使用NVIC配置SysTick中断;配置好后把STK_VAL寄存器重新赋值为0,在使能定时器时,






 




硬件会把存储在STK_LOAD寄存器中的ticks值加载给它。代码最后向STK_CTRL寄存器写入了SysTickTimer的控制参数配置为使用AHB时钟,使能计数至0时引起中断,使能SysTick。执行了这行代码,SysTick就开始运行了。如果想使用AHB/8为时钟,则可调用库函数SysTick_CLKSourceConfig()进行修改,该函数在固件库手册中可以找到。
再回到SysTick_Init()中,调用完SysTick_Config()函数后,向它输入的参数为SystemCoreClock/1000000,SystemCoreClock定义为系统时钟频率的宏,即等于AHB的时钟频率,本例程中AHB时钟频率配置为72MHz,也就是这个宏的数值即为72000000。前面说过函数SysTick_Config()输入的参数为将要技术的脉冲数,经过ticks个脉冲后将触发中断。
定时时间计算公式:T=ticks*(1/f)T为要定时的总时间
Ticks为函数SysTick_Config()要输入的参数f为定时器使用的时钟源时钟频率
比如:本实验时钟源为AHB时钟,频率配置为72MHz。调用函数时ticks赋值为ticks=SystemCoreClock/1000000=72,即为72个时钟周期中断一次;(1/f)是时钟周期,为(1/72us),所以T=1us。
延时函数
SYSTICK.c文件中的编写了两个延时函数,在LED1开关之间调用了该函数。第一个延时函数代码如下图所示。
一旦调用了延时函数,SysTick定时就被开启,使用whlie语句等待nTime变量为0,这个变量递减在中断服务函数中被修改。
该中断服务函数已经在stm32f10x_it.c文件中定义,但内容为空,我们找到这个函数自己编写就可。
所以延时时间=中断周期*nTime,要写入延时函数的参数为要中断的次数。






 




毫秒延时代码如下:
主函数中调用的延时是毫秒延时函数,delay_us(1000)实现的是1000*1us=1000us=1ms,whlile(nms--)实现(nms*1ms)ms延时,主函数给延时函数写入的参数为500,即延时500ms。
SysTick的延时使用到这里就讲解完了!

你可能感兴趣的:(C/C++,uCOS)