什么是systick
1.就是stm32内部的一个定时器,非常精确的定时器。又称为滴答定时器。
2.他是24位的,采取向下递减的方式定时。
3.计数一次的时间为1/系统时钟,通常为(1/(168/8)),也就是系统时钟八分频的倒数1/(21MHZ),即计数1us计数21次。所以只要知道计数的次数就知道了计数时间。最大计数时间为798ms
4.systick自带中断,如果你要用他的中断功能,需要打开他的中断开关
配置systick步骤
1.设置时钟源,时钟源包括内部的系统时钟源,也有外部的时钟源,通常选用外部的时终源
2.设置计数初值
3.清空当前计数值
4.打开使能开关
具体配置函数
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//这个就是配置时钟源
fac_us=SYSCLK/8; //1us所需的技术次数
fac_ms=(u16)fac_us*1000; //1ms所需的计数次数
}
void delay_us(u32 nus)//us级延迟
{
u32 temp;
SysTick->LOAD=nus*fac_us; //加载初值
SysTick->VAL=0x00; //清空
SysTick->CTRL|=0x01 ; //打开计数器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到
SysTick->CTRL&=~0x01; //关闭
SysTick->VAL =0X00; //清空
}
void delay_nms(u16 nms)//ms级延迟
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //设初值
SysTick->VAL =0x00; //清空
SysTick->CTRL|=0x01 ; //打开计数器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待
SysTick->CTRL&=~0x01; //关闭计数器
SysTick->VAL =0X00; //清空
}