STM32 進階教程 3 -  軟件實現高精度延時 1

前言

軟件工程師在在實際項目開發過程中,軟件延時想必或多或少都有接觸過,諸如delay_s(x); delay_ms(x);delay_us(x)等類型的延時函數大家也一定見過或自已曾經實現過,本節給大家介紹一種在STM32 MCU平臺上實現高精度(小於1us)軟件延時的方法。本節介紹的高精度度軟件延時方法以STM32 MCU特有的sysTime 定時器主基礎,延時度度高,移植性強,通用性好。

 

示例詳解

基於硬件平臺: STM32F10C8T6最小系統板, MCU 的型號是 STM32F103c8t6, 使用stm32cubemx 工具自動產生的配置工程,使用KEIL5編譯代碼。

 

 

本示例所用的最小系統板原理圖:

 

    1. 關於CUBEMX工具及KEIL工具的操作將不再細講,如果還有不熟悉的可以查看之前的教程文檔。下面直接介紹工程配置:

 

 

      1. 系統時鐘樹

      1. 定時器配置

      1. 引腳配置

      1. 中斷配置(保持默認)

    1. 工程代碼
      1. 將事先準備好的delay.c和delay.h文件加到工程中,

Delay.h文件放在INC文件夾下即可。

      1. 在main.c 中加入如下圖所示代碼:

 

    1. 編譯工程,下載程序看效果:PC13引腳產生週期爲100us 佔空比爲50%的方波信號,同時可以看到LED是常的,通過邏輯分析儀工具,可以看到PC13引腳上的波形:

 

細心的同學可能會發現延時50us實際上差不多是51us,周其也接近102us,這多出來的時間是哪裏來的呢,其實這個多出來的時間是程序調用時間,比如調用delay_us()這個函數其自身是需要一定的時間的,還有HAL_GPIO_WritePin這個函數的調用其實是需要時間的。可以把HAL_GPIO_WritePin函數改成寄存器操作方式來實現可以看到時間小也0.2us左右。

通過上面的實例,我們已成功實現us級精度延時,雖然實際延時時會多設定的長一點點,但這已經可以滿足絕大多數的軟件延時用應需求。在delay.c中除了有delay_us函數外,還有delay_ms(),下面具體來講解一下delay.c的原理及實現:

如上圖所示,Delay.c代碼量相當少,只有30多行,裏面有三個函數delay_init,delay_us及delay_ms,在使用delay_us及delay_ms之前,有兩個先要條件:

一、STM32 MCU的系統定時器開啓了且其定時中斷時間決定了delay_us()的支持的最大輸入值,即nus有效的最大值;

二、delay_init函數已被執行過一次,delay_init函數會自動獲取MCU的工作主時鐘,並根據主時鐘計算出一些函數給delay_us使用,如果調用delay_us函數前未先調用delay_init函數,則delay_us按當前時鐘是72MHZ條件下執行。

      如上圖,所示,本Delay.C的delay_ms直接調用HAL_Delay()來實現,當然也可以使用下delay_us()來實現,具體實現如上圖中屏蔽部分代碼!!另外還有一點,本示例給的delay_us在延時1或2us時不夠準確,下一節將續續給大家介紹高精度延時的實現,同時下一節將會解決延時1或2us時不夠準確的問題。

 

OK,本期實驗完成!下期見!同時如果大家有什麼疑問或是有想了解的其它內容,也歡迎大家留言!!最後喜歡這個公衆號的同學們記得加關注了,會有不定期技術乾貨推出!!

文中源碼資料下載,在公衆號裏給十三發消息:

下載|STM32進階教程 3

 

關注十三公衆號

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章