STM32程序從標準庫移植到HAL庫的時候,會發現HAL庫中只有一個毫秒級延時函數HAL_Delay(),而沒有微秒級延時delay_us(),本文就在HAL庫中用定時器實現這個delay_us()。
如下圖,找到HAL_Delay()函數定義的地方,發現這個函數有__weak標識,是一個弱化函數,可以被重寫。
由于HAL庫許多地方都使用了HAL_Delay()函數,為了避免惹麻煩建議不重寫,可以用定時器自己寫一個延時函數。
開發軟件用的STM32CubeIDE,此Cube軟件的使用方法可以參考這篇文章:STM32外部中斷實例。
項目設置,勾選后每個外設的源文件.c、頭文件.h分別成雙出現。
我用的是ISP編程,選擇的是Serial Wire。
配置外部高速時鐘。
為了觀察效果,開一個LED,它在PC0管腳,低電平點亮。
本實例用到了TIM7,它掛在APB1上,時鐘為72MHz。
激活TIM7,設置如下:
預分頻PSC為71,分頻后TIM7時鐘為72/(71+1)=1MHz
計數模式為向上
計數周期為1,就是說定時器一個周期后就溢出了,而定時器一個周期的時間是定時器時鐘頻率的倒數,1/1M,也就是1us。
生成代碼。
在tim.c的用戶代碼區添加如下代碼。
在tim.h的user code處添加如下引用代碼,其中HAL_Delay_us()是微秒級延時函數,HAL_Delay_ms()是毫秒級延時函數。
main.c中添加如下代碼,測試效果。
上面代碼連續用了13個延時函數,是為了湊夠1秒方便觀察。另外延時函數的參數是uint16_t,無符號短整型,數值范圍為0~65535,數值超限會報錯,如下圖。
編譯代碼。
下載到開發板可以看到LED每秒亮一次,STM32CubeIDE軟件生成hex文件的方式,請移步此文:STM32單片機中Hex、Bin文件的區別與應用。
審核編輯:劉清
-
STM32
+關注
關注
2276文章
10947瀏覽量
359158 -
定時器
+關注
關注
23文章
3259瀏覽量
115884 -
延時函數
+關注
關注
0文章
25瀏覽量
10086 -
HAL庫
+關注
關注
1文章
121瀏覽量
6477
原文標題:STM32的HAL庫實現自定義延時函數delay_us(),文末附代碼
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32C031C6在按鍵中斷處理程序中使用HAL_Delay()延時函數,程序則無法運行怎么解決?
think-cell:自定義think-cell(四)

GD32VF103使用核內部timer定時器實現延時函數,為什么系統時鐘要除以4?
STM32CUBEMX(5)--自定義紅外NEC解碼,定時器TIM捕獲方式
如何在IDF框架中使用自定義的靜態庫和動態庫?
如何使用定時器寫一個延時函數?
TSMaster 自定義 LIN 調度表編程指導

評論