热门文章
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为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();函数里面。配置代码如下:
SysTick->LOAD = 8999;
单个寄存器讲完了我们总结一下综合起来让SysTick工作起来,我们把SySTick的配置单独做成一个函数如下:
Void SysTick_Init(void)
{
/*
第一步:装载值
第二步:使能SysTick并允许中断,8分频时钟
第三步:设置SysTick优先级
*/
SysTick->LOAD = 8999;
SysTick->CTRL = (0<<2) | (1<<1) | (1<<0);
NVIC_SetPriority (SysTick_IRQn, (1<<4) - 1);
}
我们用库函数表示为:
对于官方库函数的查找我们可以使用《stm32f37x_dsp_stdperiph_lib_um.chm》这个文档,想要找某一方面的函数在里面直接搜索就可以,具体的使用方法我们下面再仔细介绍。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。
文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。