當前位置:編程學習大全網 - 編程語言 - stm32中Delay()函數延時的時間是怎麽計算的

stm32中Delay()函數延時的時間是怎麽計算的

單片機編程過程中經常用到延時函數,最常用的莫過於微秒級延時delay_us(

)和毫秒級delay_ms(

)。1.普通延時法這個比較簡單,讓單片機做壹些無關緊要的工作來打發時間,經常用循環來實現,不過要做的比較精準還是要下壹番功夫。下面的代碼是在網上搜到的,經測試延時比較精準。//粗延時函數,微秒

void delay_us(u16 time)

{

u16 i=0;

while(time--)

{

i=10; //自己定義

while(i--) ;

}

}

//毫秒級的延時

void delay_ms(u16 time)

{

u16 i=0;

while(time--)

{

i=12000; //自己定義

while(i--) ;

}

}2.SysTick 定時器延時CM3 內核的處理器,內部包含了壹個SysTick

定時器,SysTick 是壹個24 位的倒計數定時器,當計到0 時,將從RELOAD

寄存器中自動重裝載定時初值。只要不把它在SysTick

控制及狀態寄存器中的使能位清除,就永不停息。SysTick 在STM32

的參考手冊裏面介紹的很簡單,其詳細介紹,請參閱《Cortex-M3 權威指南》。

這裏面也有兩種方式實現:a.中斷方式

如下,定義延時時間time_delay,SysTick_Config()定義中斷時間段,在中斷中遞減time_delay,從而實現延時。

volatile unsigned long time_delay; //

延時時間,註意定義為全局變量

//延時n_ms

void delay_ms(volatile unsigned long nms)

{

//SYSTICK分頻--1ms的系統時鐘中斷

if (SysTick_Config(SystemFrequency/1000))

{

while (1);

}

time_delay=nms;//讀取定時時間

while(time_delay);

SysTick->CTRL=0x00; //關閉計數器

SysTick->VAL =0X00; //清空計數器

}

//延時nus

void delay_us(volatile unsigned long nus)

{

//SYSTICK分頻--1us的系統時鐘中斷

if (SysTick_Config(SystemFrequency/1000000))

{

while (1);

}

time_delay=nus;//讀取定時時間

while(time_delay);

SysTick->CTRL=0x00; //關閉計數器

SysTick->VAL =0X00; //清空計數器

} //在中斷中將time_delay遞減。實現延時void

SysTick_Handler(void)

{

if(time_delay)

time_delay--;

  • 上一篇:尚品宅配2020年半年度董事會經營評述
  • 下一篇:誰能告訴我力控組態軟件的腳本編輯器是用什麽語言寫的?
  • copyright 2024編程學習大全網