版权声明:个人爱好,可随便转载 https://blog.csdn.net/qq_43528087/article/details/89068079
什么是 SysTick?
CM3的内核中包含一个SysTick时钟。SysTick为一个24位的递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。当计数到0后,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会被置1,触发中断。中断响应属于NVIC异常,异常号为15
SysTick定时器寄存器
<1> CTRL 寄存器
CTRL 是 SysTick 定时器的控制及状态寄存器。其相应位功能如下:
注:CLKSOURCE 位是用于选择 SysTick 定时器时钟来源,如果该位为 1,表示其时钟是由系统时钟直接提供即 72M。如果为 0,表示其时钟是由系统时钟八分频后提供即 72/8=9M。
<2> LOAD 寄存器
LOAD 是 SysTick 定时器的重装载数值寄存器。其相应位功能如下:
因为 STM32F1 的 SysTick 定时器是一个 24 位递减计数器,因此重装载寄存
器中只使用到了低 24 位,即 bit0-bit23。当系统复位时,其值为 0。
<3> VAL 寄存器
VAL 是 SysTick 定时器的当前数值寄存器。其相应位功能如下:
同样只有 bit0-bit23 有效,复位时值为 0
<4> CALIB 寄存器
CALIB 是 SysTick 定时器的校准数值寄存器。其相应位功能如下:
此寄存器在定时实验中不需要使用,可以不用了解。
SysTick操作步骤
<1> 设置SysTick定时器的时钟源
<2> 设置SysTick的重装初始值(如果需要中断,就将中断使能打开)
<3> 清零SysTick定时器当前计数器的值
<4> 打开SysTick定时器
毫秒延时 代码示例
static u16 fac_ms=0; //ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}