我常用的延時函式有3種,一種是空迴圈,一種是使用systick中斷,還有一種是正點原子的延時。
第一種就不做舉例,因為平時不常用。但是一些模組給的參考**的延時函式都會採用這樣的方法,直接用就好了,不做贅述。
第二種方法是採用sistick中斷服務函式。
中斷服務函式。引用定義的全域性變數。
但是,需要注意,因為採用了中斷的方式,要注意中斷優先順序的影響,即修改systick的中斷優先順序。extern u32 timingdelay;
void
systick_handler
(void
)
主函式呼叫上面的函式__static_inline uint32_t my_systick_config
(uint32_t ticks)
產生的延時是以毫秒為單位的。int main()
當延時時間較長時,誤差較小。延時時間較短,誤差較大。void
delay_ms
(u32 ntime)
實測延時5ms,10ms的示波器測量值為6.0ms,11.20ms。
延時256ms,512ms的示波器測量值為260.0ms,510.0ms。
第三種方法是正點原子的延時函式。我將它整理了一下。
這種方法延時比較精準。#include
"stm32f10x.h"
static u8 fac_us=0;
//us延時倍乘數
static u16 fac_ms=0;
//ms延時倍乘數
void
delay_init
(void
)//延時nus
//nus為要延時的us數.
void
delay_us
(u32 nus)
while
((temp&
0x01)&&
!(temp&(1
<<16)
));//等待時間到達
systick->ctrl&
=~systick_ctrl_enable_msk;
//關閉計數器
systick->val =
0x00
;//清空計數器
}//延時nms
//注意nms的範圍
//systick->load為24位暫存器,所以,最大延時為:
//nms<=0xffffff*8*1000/sysclk
//sysclk單位為hz,nms單位為ms
//對72m條件下,nms<=1864
void
delay_ms
(u16 nms)
while
((temp&
0x01)&&
!(temp&(1
<<16)
));//等待時間到達
systick->ctrl&
=~systick_ctrl_enable_msk;
//關閉計數器
systick->val =
0x00
;//清空計數器
}
實測延時256us,512us的示波器測量值為256.0us,512.0us。
STM32三種延時函式
這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。下面的 是在網上搜到的,經測試延時比較精準。粗延時函式,微秒 void delay us u16 time 毫秒級的延時 void delay ms u16 time 2.systick 定...
STM32延時函式的三種方法
微控制器程式設計過程中經常用到延時函式,最常用的莫過於微秒級延時delay us 和毫秒級delay ms 1.普通延時法 這個比較簡單,讓微控制器做一些無關緊要的工作來打發時間,經常用迴圈來實現,不過要做的比較精準還是要下一番功夫。下面的 是在網上搜到的,經測試延時比較精準。粗延時函式,微秒 vo...
STM32延時不同寫法
對於stm32系列的延時函式有著不同的寫法,本章將給大家帶來最簡單的延時到最精準延時函式的各種寫法及原理。在stm32系列中要學會用好systick定時器,這很重要 原理 用c中累加或者累減的方法,到一定條件後就退出。好處 好寫,用for迴圈或者while迴圈,不用去理解各種有關底層硬體的暫存器。壞...