對於stm32系列的延時函式有著不同的寫法,本章將給大家帶來最簡單的延時到最精準延時函式的各種寫法及原理。
在stm32系列中要學會用好systick定時器,這很重要
原理:用c中累加或者累減的方法,到一定條件後就退出。
好處:好寫,用for迴圈或者while迴圈,不用去理解各種有關底層硬體的暫存器。
壞處:延時不精準,誤差大,讓cpu持續空跑,大大浪費cpu資源。
void delay(uint16 i)
#endif
for(int j=0;j在32中,使用定時器的地方很多,所以對於32中各種稀缺的外設資源極其珍貴,用好各種外設對於小白來說是關鍵的一步。
原理:採用c中累加原理,選定某一定時器,通過計數器來產生中斷。
好處:可達到精準延時,但會使cpu在定時器中持續累加或累減,占用cpu資源。
這裡隨便舉的乙個例子
void tim4_init(u16 ar,u16 rs)
void tim4_irqhandler(void)
}
關於滴答定時器,我的理解為可以替代所有的定時器中有關涉及到時間的問題配置,可以讓定時器更好的配合其他功能使用,而定時器中的計數器暫存器可以用於pid之類,更好的控制精度。
在此處介紹兩種有關systcik定時器的使用方法
(1).同樣運用cpu持續在滴答定時器進行計數
void
delay_us
(u32 i)817
while
((temp&
0x01)&&
(!(temp&(1
<<16)
)));
//等待時間到達
18 systick->ctrl=0;
//關閉計數器
19 systick->val=0;
//清空計數器
20}
void
delay_ms
(u32 i)817
while
((temp&
0x01)&&
(!(temp&(1
<<16)
)));
//等待時間到達
18 systick->ctrl=0;
//關閉計數器
19 systick->val=0;
//清空計數器
20}
(2).systick定時器自動計數,到達預初始值後產生中斷,cpu進行響應處理事件。
void systick_init(void)
}
其中systick_config()的引數意思為要計數到多少產生乙個中斷,換句話說就是多少ms/us產生中斷
關於計算ms/us的問題,可以用時間與頻率的計算公式
fosc=1/t t=1/fosc ,fosc為系統的頻率
如果stm32時鐘頻率為:72mhz,每次的時間為:t=1/72mhz。1秒鐘為:1/(每次的時間)=1/(1/72mhz)=72 000 000次。1mhz是:1000 000
反過來講。systick_config(72000)代表:72000(1/72mhz)=1/1000=1(ms)。即定時為1ms。
如果需要1s則,可以通一設定乙個全域性變數,然後定初值得為1000,這樣,每個systick中斷一次,這個全域性變數減1,減到0,即systick中斷1000次,時間
為:1ms1000=1s。從而實現1s的定時。
關於程式上的涉及延時或定時,則需採用乙個外部的全域性變數
volatile uint32_t number;
有關volatile的作用,若有不知道的,請自行回看c基礎知識。
void
delay_ms
(uint16_t ntime)
此時還需要在有關延時檔案中進行宣告extern
最後,中斷函式編寫
void
systick_handler
(void
)}
此時要注意的是需要更改韌體庫中自帶的systick中斷函式,將其注釋。 STM32精確延時
前面用 stm32 的gpio 模擬液晶驅動 時序時遇到乙個問題,就是怎樣產生一段較為精確的延時。通常產生一小段延時的方法就是利用乙個遞增或者遞減迴圈進行軟體延時。例 void delay void 我在使用 mplab ide 進行pic 微控制器的開發時,mplab 提供了乙個 watch 跑錶...
stm32延時函式的三種寫法
我常用的延時函式有3種,一種是空迴圈,一種是使用systick中斷,還有一種是正點原子的延時。第一種就不做舉例,因為平時不常用。但是一些模組給的參考 的延時函式都會採用這樣的方法,直接用就好了,不做贅述。第二種方法是採用sistick中斷服務函式。中斷服務函式。引用定義的全域性變數。extern u...
stm32延時一分鐘 STM32精確延時
stm32 精確延時的實現方法 前面用stm32 的gpio 模擬液晶驅動時序時遇到乙個問題,就是怎樣產生一段較為精確的延時。通常產生一小段延時的方法就是 利用乙個遞增或者遞減迴圈進行軟體延時。例 void delay void int i 0x0ff while i 我在使用 mplab ide進...