Cortex-Mx内核内部包含了一个Systick定时器, SysTick 是一个24 位的倒计数定时器, 当计到0 时, 将从RELOAD寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在《STM32xx 中文参考手册》里面基本没有介绍,其详细介绍,内核编程手册中。在工程中我们将以STM32F373为例,为SysTick配置1ms,利用1ms中断处理系统任务。下面我们介绍下寄存器:
下图是SysTick定时器的4个寄存器概括,我们介绍部分使用的寄存器:
SysTick控制和状态寄存器
这个寄存器的EBNALE(0位)为SysTick的使能位,TICKINT(1位)为设置是否产生中断,CLKSOURCE(2位)为时钟选择,当为1 时AHB时钟不分频,为0时AHB时钟8分频。当然我们选择使能定时器,产生中断,并选择AHB 8分频。假如系统时钟为72M,即可获得 72/8 = 9M的SysTick时钟频率。使能SysTick并产生中断,8分频时钟,代码如下: SysTick->CTRL= (0<<2) | (1<<1) | (1<<0); SysTick重装载值寄存器
图5 该图来自数据手册中断和事件章节 图5为SysTick重载计数值寄存器RELOAD([23:0]),从该介绍我们可以得出结论,SysTick的计数方式为向下计数,也就是从RELOAD([23:0])值向下递减,当减到0的时候产生标志位,这个时候会重新装载该寄存器值,循环执行上面的步骤。那麽我们可以利用这个功能做一个1ms的定时器,我们已经配置系统时钟为72M,使用系统时钟的8分频(9M)作为SysTick定时器的时钟,也就是说时钟周期T = 1/9M(ns),即SysTick减1需要1/9M(ns),我们定时1ms那麽重载寄存器的值为 1ms/(1/9M(ns))-1 = 8999(注意这里要进行单位换算),这也就是我们的重装载值,下面给出具体代码配置,其中使能等操作包含在SysTick_Config();函数里面。配置代码如下:
|