0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在HAL庫(kù)中用定時(shí)器實(shí)現(xiàn)自定義延時(shí)函數(shù)delay_us()

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:ARM與嵌入式 ? 作者:保生 ? 2022-09-21 10:33 ? 次閱讀

STM32程序從標(biāo)準(zhǔn)庫(kù)移植到HAL庫(kù)的時(shí)候,會(huì)發(fā)現(xiàn)HAL庫(kù)中只有一個(gè)毫秒級(jí)延時(shí)函數(shù)HAL_Delay(),而沒(méi)有微秒級(jí)延時(shí)delay_us(),本文就在HAL庫(kù)中用定時(shí)器實(shí)現(xiàn)這個(gè)delay_us()。

如下圖,找到HAL_Delay()函數(shù)定義的地方,發(fā)現(xiàn)這個(gè)函數(shù)有__weak標(biāo)識(shí),是一個(gè)弱化函數(shù),可以被重寫(xiě)。

3d7cb228-2f57-11ed-ba43-dac502259ad0.png

由于HAL庫(kù)許多地方都使用了HAL_Delay()函數(shù),為了避免惹麻煩建議不重寫(xiě),可以用定時(shí)器自己寫(xiě)一個(gè)延時(shí)函數(shù)。

開(kāi)發(fā)軟件用的STM32CubeIDE,此Cube軟件的使用方法可以參考這篇文章:STM32外部中斷實(shí)例。

項(xiàng)目設(shè)置,勾選后每個(gè)外設(shè)的源文件.c、頭文件.h分別成雙出現(xiàn)。

3d9ce480-2f57-11ed-ba43-dac502259ad0.png

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

3db61ea0-2f57-11ed-ba43-dac502259ad0.png

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

3dcaba90-2f57-11ed-ba43-dac502259ad0.png

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

3ddfd0e2-2f57-11ed-ba43-dac502259ad0.png

3df15600-2f57-11ed-ba43-dac502259ad0.png

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

3e05c11c-2f57-11ed-ba43-dac502259ad0.png

激活TIM7,設(shè)置如下:

預(yù)分頻PSC為71,分頻后TIM7時(shí)鐘為72/(71+1)=1MHz

計(jì)數(shù)模式為向上

計(jì)數(shù)周期為1,就是說(shuō)定時(shí)器一個(gè)周期后就溢出了,而定時(shí)器一個(gè)周期的時(shí)間是定時(shí)器時(shí)鐘頻率的倒數(shù),1/1M,也就是1us。

3e20df74-2f57-11ed-ba43-dac502259ad0.png

生成代碼。

3e382fa8-2f57-11ed-ba43-dac502259ad0.png

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

3e4a4242-2f57-11ed-ba43-dac502259ad0.png

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

3e64afb0-2f57-11ed-ba43-dac502259ad0.png

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

3e741900-2f57-11ed-ba43-dac502259ad0.png

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

3e8d02ee-2f57-11ed-ba43-dac502259ad0.png

編譯代碼。

3ead946e-2f57-11ed-ba43-dac502259ad0.png

下載到開(kāi)發(fā)板可以看到LED每秒亮一次,STM32CubeIDE軟件生成hex文件的方式,請(qǐng)移步此文:STM32單片機(jī)中Hex、Bin文件的區(qū)別與應(yīng)用。



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353775
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3228

    瀏覽量

    114154
  • 延時(shí)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    10003
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6113

原文標(biāo)題:STM32的HAL庫(kù)實(shí)現(xiàn)自定義延時(shí)函數(shù)delay_us(),文末附代碼

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CUBEMX(5)--自定義紅外NEC解碼,定時(shí)器TIM捕獲方式

    */ HAL_TIM_Base_Start_IT(&htim1);//啟動(dòng)定時(shí)器 HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//
    發(fā)表于 09-05 16:19

    如何使用定時(shí)器寫(xiě)一個(gè)延時(shí)函數(shù)?

    不用中斷,就是單純一個(gè)用作延時(shí)函數(shù),寫(xiě)了一個(gè)下午也沒(méi)搞明白,可能我理解出錯(cuò)了 void delay_us(int us) { timer_config_t
    發(fā)表于 06-14 06:03

    HAL庫(kù)開(kāi)啟定時(shí)器中斷時(shí)會(huì)卡死程序的原因?

    當(dāng)開(kāi)啟定時(shí)器中斷時(shí)候,開(kāi)啟定時(shí)器時(shí)會(huì)卡死程序,調(diào)試,全速運(yùn)行卡死-HAL_TIM_Base_Start_IT函數(shù),單步調(diào)試發(fā)現(xiàn)卡死
    發(fā)表于 04-16 07:12

    HarmonyOS開(kāi)發(fā)實(shí)例:【自定義Emitter】

    使用[Emitter]實(shí)現(xiàn)事件的訂閱和發(fā)布,使用[自定義彈窗]設(shè)置廣告信息。
    的頭像 發(fā)表于 04-14 11:37 ?928次閱讀
    HarmonyOS開(kāi)發(fā)實(shí)例:【<b class='flag-5'>自定義</b>Emitter】

    STM32蜂鳴器音樂(lè)播放實(shí)例教程

    開(kāi)啟定時(shí)器TIM7,是為了寫(xiě)延時(shí)函數(shù)HAL_Delay_us()。具體過(guò)程請(qǐng)移步此文:STM32的HAL
    發(fā)表于 03-26 14:19 ?1877次閱讀
    STM32蜂鳴器音樂(lè)播放實(shí)例教程

    STM32L0使用延時(shí)函數(shù)使PWM波形移相,延時(shí)函數(shù)不起作用的原因?

    ); delay_us(20); HAL_TIM_PWM_Start( htim2, TIM_CHANNEL_2); 但是定時(shí)器2的2通道輸出PWM波并沒(méi)有發(fā)生延時(shí)變化,這是為什么?
    發(fā)表于 03-21 06:23

    AvR單片機(jī)1us延時(shí)函數(shù)數(shù)怎么寫(xiě)

    在編寫(xiě)AvR單片機(jī)的1us延時(shí)函數(shù)之前,我們首先需要了解幾個(gè)關(guān)鍵概念。 單片機(jī)的延時(shí)函數(shù)是通過(guò)控制
    的頭像 發(fā)表于 12-26 14:02 ?993次閱讀

    博途用戶(hù)自定義庫(kù)的使用

    博途官方提供了很多庫(kù),比如:基本函數(shù)庫(kù)、通信庫(kù)、安全庫(kù)、驅(qū)動(dòng)庫(kù)等等,用戶(hù)可以使用庫(kù)中的
    的頭像 發(fā)表于 12-25 10:08 ?789次閱讀
    博途用戶(hù)<b class='flag-5'>自定義</b><b class='flag-5'>庫(kù)</b>的使用

    stm32delay函數(shù)怎么寫(xiě)

    STM32的延時(shí)函數(shù)可以使用SysTick定時(shí)器來(lái)實(shí)現(xiàn)。SysTick定時(shí)器是一個(gè)24位的計(jì)數(shù)
    的頭像 發(fā)表于 12-21 17:53 ?2114次閱讀

    HAL庫(kù)常用函數(shù)匯總

    1,系統(tǒng)函數(shù)HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定時(shí)器生成的系統(tǒng)延遲函數(shù)參數(shù):
    的頭像 發(fā)表于 11-29 08:00 ?2763次閱讀
    <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>常用<b class='flag-5'>函數(shù)</b>匯總

    OFF延時(shí)和ON延時(shí)定時(shí)器的區(qū)別

    機(jī)械定時(shí)繼電器和延時(shí)定時(shí)器用于延時(shí)電路控制觸點(diǎn)的打開(kāi)或閉合。它們的工作方式與控制繼電器類(lèi)似,主要區(qū)別在于定時(shí)繼電器中的特定觸點(diǎn)設(shè)計(jì)為在線(xiàn)圈通
    的頭像 發(fā)表于 11-21 17:50 ?2073次閱讀

    定時(shí)器設(shè)計(jì)實(shí)現(xiàn)

    返回ITimer類(lèi)型的共享指針。其中ITimer類(lèi)中定義了start和stop方法,用于啟動(dòng)或停止當(dāng)前定時(shí)器。 TimerManager還有一個(gè)內(nèi)部類(lèi)TimerMessageQueue用于實(shí)現(xiàn)
    的頭像 發(fā)表于 11-08 16:50 ?535次閱讀

    STM32如何使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)?

    STM32如何使用定時(shí)器實(shí)現(xiàn)微秒(us)級(jí)延時(shí)? STM32微控制中,可以使用
    的頭像 發(fā)表于 11-06 11:05 ?5640次閱讀

    延時(shí)函數(shù)有幾個(gè)指令周期?

    大俠們,使用51單片時(shí)候,使用的12M的晶振,使用延時(shí)函數(shù) void delay(int i) { while(i--); } 這個(gè)函數(shù)
    發(fā)表于 11-06 06:53

    STM32基于HAL庫(kù)實(shí)現(xiàn)微秒延時(shí)

    HAL只提供了ms級(jí)的延時(shí),但有些特殊場(chǎng)景,比如與通信速率較慢的設(shè)備通信時(shí),會(huì)需要用到us級(jí)延時(shí)。STM32標(biāo)準(zhǔn)庫(kù)一般是使用系統(tǒng)嘀嗒
    的頭像 發(fā)表于 10-25 15:31 ?5084次閱讀
    STM32基于<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>實(shí)現(xiàn)</b>微秒<b class='flag-5'>延時(shí)</b>