提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Systick:系统滴答定时器是什么?
Cortex-M3 的内核中包含一个 SysTick 时钟。SysTick 为一个 24 位递减计数器,SysTick 设定初
值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装
初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断 (如果中断使能情况下)。
二、相关寄存器:
- CTRL控制寄存器(有一个易错点,很重要):
SysTick控制及状态寄存器(地址:0xE000_E010)(32位),由于SysTick的时钟源是固定
(提前配置好的SYSCLK分频后的时钟),所以ST公司将位2设置为了分频选项,0表示8分频,
1表示不分频,一般就是用8分频后的9MHz时钟。
- SysTick:重载数值寄存器:一般设置为 9*微秒 ,8分频后,时钟为9MHz,即1微秒记9个数,所以这个9就是这样来的
- SysTick当前数值寄存器(地址:0xE000_E018)(24位):一般用不上
- SysTick校准数值寄存器(地址:0xE000_E01C)(32位):一般用不上
- SysTick校准数值寄存器(地址:0xE000_E01C)(32位):一般用不上
三、延时案例(代码):
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 9 * xus; //设置定时器重装值,72MHz 8分频后9HMz,即一微秒记9个数
SysTick->VAL = 0x00; //清空当前计数值,清空后会自动装入重载值
SysTick->CTRL = 0x00000001; //位2设置为0,8分频,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0,第16位为计数标志位,数到0后置1,下次读操作自动置0
SysTick->CTRL = 0x00000000; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
四、总结
使用SYSTICK可以精准的做到微秒级延迟,缺点就是在操作系统中不能用(或者可以用,只是我还不会用),由于操作系统(如FreeRTOS)中用的是SYSTICK作为系统时间片(计时,一般一个时间片1ms),所以在有操作系统的情况下,不能用SYSTICK计时,可以选用软件计时或者TIM计时。对于裸机来说,SYSTICK即方便又精准。