1.SysTick定时器
SysTick定时器用来产生操作系统需要的滴答中断,作为整个系统的时基。SysTick定时器可以产生周期性中断,用户程序不能随意访问它的寄存器,SysTick定时器是维持操作系统“心跳”的节律。SysTick定时器可以为多个任务许以不同的时间片,确保没有一个任务能够霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务;SysTick定时器还可以为操作系统提供各种定时功能。SysTick定时器由4个寄存器控制。
2.SysTick实现延时
在SMT32中,利用SysTick来实现延时,既不占用中断,也不占用系统定时器。SysTick是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时初值,开始下一轮计数。只要不把它在SysTick控制及状态寄存器中的使能位清除,就用不停息的工作。
以UCOSII为例,介绍如何实现操作系统和delay函数共用SysTick定时器。ucos运行时需要一个系统时钟节拍(类似“心跳”),这个节拍是固定的,比如5ms一次。在STM32中,一般是由SysTick来提供这个节拍,也就是SysTick要设置为5ms中断一次,为ucos提供节拍,一般这个时钟是不能被打断的。
在ucos下SysTick不能被随意更改,采用时钟摘取法利用SysTick定时器实现延时毫秒或微秒功能。以定时1us为例,假设系统时钟频率为72MHz,SysTick时钟频率为系统时钟频率的八分频即9Mhz,则SysTick每增加1,时间就增加1/9us。要实现1us的定时,当SysTick计数次数达到9次时(1/9us * 9次 = 1us),此时定时时间为1us。此处只是抓取了SysTick计数器的变化,不需要对SysTick任何状态进行修改,完全不影响SysTick作为ucos时钟节拍的功能,这就是实现delay和操作系统共用SysTick定时器的原理。