STM32 SysTick 精準(zhǔn)延時(shí) 簡單分析
在設(shè)計(jì)軟件的時(shí)候,有的對(duì)時(shí)序要求比較嚴(yán)格,但是簡單的延時(shí)函數(shù)又不能準(zhǔn)確延時(shí)---STM32中有一個(gè)系統(tǒng)滴答時(shí)鐘是不錯(cuò)的配置---
----第一部分是---向滴答時(shí)鐘寄存器寫初值,也就是要根據(jù)系統(tǒng)頻率來遞減----然后為0 則產(chǎn)生中斷
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); //寫初值成功---則進(jìn)入while死循環(huán)-等待滴答時(shí)鐘的中斷到來
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; //如果向滴答時(shí)鐘寫初值失敗---則關(guān)閉系統(tǒng)滴答時(shí)鐘
}
----第二部分是---延時(shí)函數(shù)----
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;//多少個(gè)基礎(chǔ)節(jié)拍
SysTick_Init(1); //1us
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系統(tǒng)滴答時(shí)鐘---開始計(jì)時(shí)
while(TimingDelay!= 0); //定時(shí)節(jié)拍結(jié)束
}
void Delay_ms(__IO u32 nTime)
{
TimingDelay = nTime;//多少個(gè)基礎(chǔ)節(jié)拍
SysTick_Init(1000); //1ms
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系統(tǒng)滴答時(shí)鐘---開始計(jì)時(shí)
while(TimingDelay!= 0); //定時(shí)節(jié)拍結(jié)束
}
---第三部分是---滴答時(shí)鐘的中斷函數(shù)---
voidTimingDelay_Decrement(void) //節(jié)拍遞減---在中斷中使用
{
if (TimingDelay != 0x00)
TimingDelay--;
}
void SysTick_Handler(void) //---中斷---
{
TimingDelay_Decrement();//進(jìn)一次中斷遞減一次
}
---第四部分---主函數(shù)---
int main(void)
{
SysTick_Init(); //初始化
Delay_us(10000); // 10000 * 10us = 100ms
}