一、SysTick定时器介绍
- SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,所有使用Cortex-M3内核的单片机都具有这个定时器。Systick被内嵌在NVIC寄存器中,是一个24位的向下递减计数的定时器,在stm32中它的时钟通常由系统时钟8分频后得到。
- Systick定时器启动后,首先装载LOAD寄存器中的定时器初始值,然后向下递减计数,如果systick开启了中断,当计数值为0时,将产生一个中断信号。
二、Systick寄存器
2.1、控制及状态寄存器
2.2、重装载数值寄存器
- systick计数的初始值,当倒数至零时,重新从这个值开始倒数
- 该寄存器为24位,需要注意最大值不能溢出;
2.3、当前数值寄存器
2.4、校准数值寄存器
三、stm32+HAL库代码
unsigned short fac_us = 0;
unsigned short fac_ms = 0;
void Delay_Init()
{
SysTick->CTRL &= ~(1<<2);
fac_us=SystemCoreClock/8000000;
fac_ms=(unsigned short)fac_us*1000;
}
void DelayMs(unsigned short nms)
{
uint32_t temp;
SysTick->LOAD =nms*fac_ms;
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;
}
void DelayUs(unsigned int nus)
{
unsigned int temp;
SysTick->LOAD=nus*fac_us;
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;
}