微控制器:stm32f407zet6
軟體版本:stm32cubemx 4.20.1
微控制器韌體包:stm32cube fw_f4 v1.15.0
本**是我於2023年8月參加全國大學生電子設計競賽前做賽前準備時參考網路上部落格的程式**編寫,僅用於學習和交流。希望能給各位讀者些許幫助。
本部落格對於stm32微控制器實現微秒(μs)延時採用的是定時器計數的方法。以stm32f407zet6型號微控制器的tim4為例來進行**展示。
先設定tim4的時鐘源:
stm32f407zet6的tim4的時鐘為apb1的兩倍即84mhz。
設定tim4引數:
因為是微秒延時,所以計數頻率應為f=1/1μs=1mhz。所以預分頻prescaler應為(84/f)-1=83,理論上來說計數週期counter period的設定將影響中斷時長,而微秒延時只是計數並不需要開啟定時器的中斷。但是在實際開發過程中我將counter period設定為0結果延時時間變成隨機時長,因此建議counter period不要設定為0。
微秒延時函式:
void
delay_us
(uint16_t myus)
//基於tim4定時器的μs延時函式
hal_tim_base_stop
(&htim4)
;}
因為我是使用stmcubemx搭建的工程,因此需要將這段延時函式加進tim.c中的 /* user code begin 1 / 和 / user code end 1 / 中,並在tim.h中的 / user code begin prototypes / 和 / user code end prototypes */ 中加上void delay_us(uint16_t );做函式宣告。
接下來,我對這個微秒延時函式做一些解釋說明:
函式功能解釋:
hal_statustypedef hal_tim_base_start(tim_handletypedef *htim) 啟動定時器;
hal_statustypedef hal_tim_base_stop(tim_handletypedef *htim) 關閉定時器;
__hal_tim_setcounter和__hal_tim_getcounter可在標頭檔案stm32_hal_legacy.h中找到定義:
__hal_tim_set_counter 設定計數初值,預設是0;
__hal_tim_get_counter 獲取當前計數值。
stm32微控制器的定時器基本都是16位計數器每次記到0xffff就會過載arr值。因此給定時器應至少賦予初值為0xffff-myus。
為什麼我在定時器基本初值的基礎上還要再「-5」呢?
這是為了防止因中斷打斷延時,造成計數錯誤。
以延時1μs為例:延時1us因而應從0xfffe開始計數,但假設在這過程產生中斷。由於被中斷打斷(此時計數器仍在計數),本因計數至0xffff便停止計數,但由於錯過計數值,並過載arr值,將會導致實際延時(0xffff+1)us。
STM32 HAL庫方式的微秒延時函式
標準庫一般是使用系統嘀嗒定時器來進行微妙級別的延時,而hal庫將systick定時器用做了庫函式的超時定時器,使用的地方非常多,自己修改 使用嘀嗒定時器的話就會引起錯亂。所以此時就需要自己實現乙個微秒級別延時函式。優點 全系列通用,只需要將巨集定義cpu frequency mhz根據時鐘主頻修改即...
STM32 HAL庫學習筆記
1 系統時鐘 一般用stm32cube生成,使用者只需要會用stm32cube就行。2 gpio輸出void led gpio config void 3 gpio輸入void key gpio config void 4 外部中斷void exti key config void void ext...
STM32 HAL庫學習筆記
1 普通函式與 函式的區別 對普通函式的呼叫 呼叫程式發出對普通函式的呼叫後,程式執行立即轉向被呼叫函式執行,直到被呼叫函式執行完畢後,再返 用程式繼續執行。從發出呼叫的程式的角度看,這個過程為 呼叫 等待被呼叫函式執行完畢 繼續執行 對 函式呼叫 呼叫程式發出對 函式的呼叫後,不等函式執行完畢,立...