STM32 SysTick 精准延时 简单分析
扫描二维码
随时随地手机看文章
在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---STM32中有一个系统滴答时钟是不错的配置---
----第一部分是---向滴答时钟寄存器写初值,也就是要根据系统频率来递减----然后为0 则产生中断
void SysTick_Init(uint32_t a) //a-us
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
// if (SysTick_Config(SystemCoreClock / 1000000*a)//写初值----ST3.0.0库版本
if (SysTick_Config(SystemCoreClock / 1000000)*a) //写初值----ST3.5.0库版本
{
while (1); //写初值成功---则进入while死循环-等待滴答时钟的中断到来
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; //如果向滴答时钟写初值失败---则关闭系统滴答时钟
}
----第二部分是---延时函数----
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;//多少个基础节拍
SysTick_Init(1); //1us
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系统滴答时钟---开始计时
while(TimingDelay!= 0); //定时节拍结束
}
void Delay_ms(__IO u32 nTime)
{
TimingDelay = nTime;//多少个基础节拍
SysTick_Init(1000); //1ms
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系统滴答时钟---开始计时
while(TimingDelay!= 0); //定时节拍结束
}
---第三部分是---滴答时钟的中断函数---
voidTimingDelay_Decrement(void) //节拍递减---在中断中使用
{
if (TimingDelay != 0x00)
TimingDelay--;
}
void SysTick_Handler(void) //---中断---
{
TimingDelay_Decrement();//进一次中断递减一次
}
---第四部分---主函数---
int main(void)
{
SysTick_Init(); //初始化
Delay_us(10000); // 10000 * 10us = 100ms
}