STM32程序從標(biāo)準(zhǔn)庫移植到HAL庫的時(shí)候,會(huì)發(fā)現(xiàn)HAL庫中只有一個(gè)毫秒級(jí)延時(shí)函數(shù)HAL_Delay(),而沒有微秒級(jí)延時(shí)delay_us(),本文就在HAL庫中用定時(shí)器實(shí)現(xiàn)這個(gè)delay_us()。
如下圖,找到HAL_Delay()函數(shù)定義的地方,發(fā)現(xiàn)這個(gè)函數(shù)有__weak標(biāo)識(shí),是一個(gè)弱化函數(shù),可以被重寫。

由于HAL庫許多地方都使用了HAL_Delay()函數(shù),為了避免惹麻煩建議不重寫,可以用定時(shí)器自己寫一個(gè)延時(shí)函數(shù)。
開發(fā)軟件用的STM32CubeIDE,此Cube軟件的使用方法可以參考這篇文章:STM32外部中斷實(shí)例。
項(xiàng)目設(shè)置,勾選后每個(gè)外設(shè)的源文件.c、頭文件.h分別成雙出現(xiàn)。

我用的是ISP編程,選擇的是Serial Wire。

配置外部高速時(shí)鐘。

為了觀察效果,開一個(gè)LED,它在PC0管腳,低電平點(diǎn)亮。


本實(shí)例用到了TIM7,它掛在APB1上,時(shí)鐘為72MHz。

激活TIM7,設(shè)置如下:
預(yù)分頻PSC為71,分頻后TIM7時(shí)鐘為72/(71+1)=1MHz
計(jì)數(shù)模式為向上
計(jì)數(shù)周期為1,就是說定時(shí)器一個(gè)周期后就溢出了,而定時(shí)器一個(gè)周期的時(shí)間是定時(shí)器時(shí)鐘頻率的倒數(shù),1/1M,也就是1us。

生成代碼。

在tim.c的用戶代碼區(qū)添加如下代碼。

在tim.h的user code處添加如下引用代碼,其中HAL_Delay_us()是微秒級(jí)延時(shí)函數(shù),HAL_Delay_ms()是毫秒級(jí)延時(shí)函數(shù)。

main.c中添加如下代碼,測(cè)試效果。

上面代碼連續(xù)用了13個(gè)延時(shí)函數(shù),是為了湊夠1秒方便觀察。另外延時(shí)函數(shù)的參數(shù)是uint16_t,無符號(hào)短整型,數(shù)值范圍為0~65535,數(shù)值超限會(huì)報(bào)錯(cuò),如下圖。

編譯代碼。

下載到開發(fā)板可以看到LED每秒亮一次,STM32CubeIDE軟件生成hex文件的方式,請(qǐng)移步此文:STM32單片機(jī)中Hex、Bin文件的區(qū)別與應(yīng)用。
審核編輯:劉清
-
STM32
+關(guān)注
關(guān)注
2309文章
11162瀏覽量
373404 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123586 -
延時(shí)函數(shù)
+關(guān)注
關(guān)注
0文章
25瀏覽量
10371 -
HAL庫
+關(guān)注
關(guān)注
1文章
121瀏覽量
7628
原文標(biāo)題:STM32的HAL庫實(shí)現(xiàn)自定義延時(shí)函數(shù)delay_us(),文末附代碼
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
CW32系統(tǒng)滴答SysTick定時(shí)器詳解
rt-thread軟件定時(shí)器大家一般怎么用?
電能質(zhì)量監(jiān)測(cè)裝置可自定義監(jiān)測(cè)時(shí)段嗎?
實(shí)現(xiàn)一個(gè)嵌入式的軟件定時(shí)器
Cortex-M內(nèi)核中的精確延時(shí)的方法
使用系統(tǒng)定時(shí)器SysTick來實(shí)現(xiàn)精確延時(shí)微秒和毫秒函數(shù)
軟硬件協(xié)同技術(shù)分享 - 任務(wù)劃分 + 自定義指令集
采用匯編指示符來使用自定義指令
在rtthread的main函數(shù)里用HAL_Delay函數(shù)不起作用是哪里的問題?
KiCad 中的自定義規(guī)則(KiCon 演講)
在HAL庫中用定時(shí)器實(shí)現(xiàn)自定義延時(shí)函數(shù)delay_us()
評(píng)論