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);  //定时节拍结束
}

---第三部分是---滴答时钟的中断函数---

void TimingDelay_Decrement(void)   //节拍递减---在中断中使用
{
        if (TimingDelay != 0x00)
            TimingDelay--;
}

void SysTick_Handler(void)  //---中断---
{
        TimingDelay_Decrement(); //进一次中断递减一次
}

---第四部分---主函数---

int main(void)
{
        SysTick_Init();   //初始化
        Delay_us(10000);     // 10000 * 10us = 100ms

}


你可能感兴趣的:(stm32,student)