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