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

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

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

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

CHANBAEK ? 來(lái)源:上下求索電子er ? 作者:上下求索電子er ? 2023-10-25 15:31 ? 次閱讀

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)嘀嗒定時(shí)器來(lái)進(jìn)行微妙級(jí)別的延時(shí),而HAL庫(kù)將SysTick定時(shí)器用做了庫(kù)函數(shù)的超時(shí)定時(shí)器,使用的地方非常多,自己修改代碼使用嘀嗒定時(shí)器的話(huà)就會(huì)引起錯(cuò)亂,所以此時(shí)就需要自己實(shí)現(xiàn)一個(gè)us級(jí)別延時(shí)函數(shù)。

這里介紹一種使用定時(shí)器設(shè)計(jì)us級(jí)延時(shí)函數(shù)的方法。

思路:我們將定時(shí)器設(shè)置為1MHZ的計(jì)數(shù)頻率,這樣定時(shí)器計(jì)一個(gè)數(shù)就是1us,我們就可以通過(guò)定時(shí)器計(jì)數(shù)值得知計(jì)時(shí)時(shí)間。

以使用TIM1為例,這里我們采用STM32F103內(nèi)部8MHz晶振,故需要設(shè)置預(yù)分頻系數(shù)PSC為8-1=7。同時(shí)配置PA1為GPIO輸出模式,之后用于測(cè)試延時(shí)函數(shù)的效果。

圖片
Untitled

編寫(xiě)微秒延時(shí)函數(shù):

/* USER CODE BEGIN PD */
#define DLY_TIM_Handle (&htim1)  // Timer handle
/* USER CODE END PD */

/* USER CODE BEGIN PFP */
void delay_us(uint16_t nus);
/* USER CODE END PFP */

/* USER CODE BEGIN 4 */
void delay_us(uint16_t nus)
{ 
 __HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);  // set the counter value a 0
 __HAL_TIM_ENABLE(DLY_TIM_Handle);          // start the counter
  // wait for the counter to reach the us input in the parameter
 while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus);
 __HAL_TIM_DISABLE(DLY_TIM_Handle);         // stop the counter
}
/* USER CODE END 4 */

編寫(xiě)微秒延時(shí)函數(shù)測(cè)試程序,使PA1高低電平間隔100us轉(zhuǎn)換一次:

/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
    delay_us(100);
  }
  /* USER CODE END 3 */

燒錄程序,通過(guò)邏輯分析儀觀察PA1電平變化:

圖片

圖片

可以看到PA1高電平持續(xù)時(shí)間和低電平持續(xù)時(shí)間都和符合100us的預(yù)設(shè),延時(shí)效果較好。

聲明:本文內(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)注

    2257

    文章

    10826

    瀏覽量

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

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113665
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1172

    瀏覽量

    51510
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

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

    關(guān)注

    1

    文章

    114

    瀏覽量

    6030
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 HAL庫(kù)微秒延時(shí)

    STM32HAL庫(kù)微秒(μs)延時(shí)
    發(fā)表于 08-24 07:19

    如何利用SysTick實(shí)現(xiàn)微秒延時(shí)函數(shù)?

    怎么實(shí)現(xiàn)STM32 HAL庫(kù)微秒延時(shí)函數(shù)? 如何利用SysTick
    發(fā)表于 11-25 08:06

    怎么實(shí)現(xiàn)STM32CubeIDE HAL庫(kù)微秒us的延時(shí)Delay?

    怎么實(shí)現(xiàn)STM32CubeIDE HAL庫(kù)微秒us的延時(shí)Delay?
    發(fā)表于 11-25 07:40

    HAL庫(kù)如何實(shí)現(xiàn)us延時(shí)?

    stm32HAL庫(kù)實(shí)現(xiàn)us延時(shí)方法HAL_Delay()源碼為ms級(jí)別的
    發(fā)表于 01-17 07:53

    HAL庫(kù)微秒級(jí)的延時(shí)實(shí)現(xiàn)

    目錄前言一、代碼和使用二、使用和驗(yàn)證1.引入頭文件2.初始化3.使用和驗(yàn)證總結(jié)前言接觸HAL庫(kù)差不多兩年了,一直苦于HAL庫(kù)沒(méi)有自帶微秒級(jí)的
    發(fā)表于 01-20 07:49

    STM32標(biāo)準(zhǔn)庫(kù)改為HAL庫(kù)的程序實(shí)現(xiàn)

    標(biāo)準(zhǔn)庫(kù)占絕大多數(shù),自己買(mǎi)的板子跟的資料也一般是標(biāo)準(zhǔn)庫(kù),HAL庫(kù)很少,不過(guò)要是使用STM32CubeMx配置,那么就是使用的
    發(fā)表于 11-22 11:23 ?3.4w次閱讀

    STM32單片機(jī)使用定時(shí)器中斷方式實(shí)現(xiàn)毫秒級(jí)延時(shí)的設(shè)計(jì)

    因?yàn)?b class='flag-5'>STM32 HAL庫(kù)中僅有對(duì)HAl_Delay()毫秒級(jí)的延時(shí),為實(shí)現(xiàn)精確的
    發(fā)表于 06-04 14:55 ?1.1w次閱讀
    <b class='flag-5'>STM32</b>單片機(jī)使用定時(shí)器中斷方式<b class='flag-5'>實(shí)現(xiàn)</b>毫秒級(jí)<b class='flag-5'>延時(shí)</b>的設(shè)計(jì)

    通用定時(shí)器實(shí)現(xiàn)STM32單片機(jī)微秒級(jí)延時(shí)函數(shù)

    一、前言在實(shí)際應(yīng)用中,經(jīng)常用到延時(shí)函數(shù),而HAL庫(kù)延時(shí)函數(shù)是毫秒級(jí)的,雖然可以自行修改,但該函數(shù)使用的地方較多,修改不慎可能會(huì)引起其他問(wèn)題,所以本文使用一個(gè)定時(shí)器,
    發(fā)表于 11-24 18:51 ?20次下載
    通用定時(shí)器<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>STM32</b>單片機(jī)<b class='flag-5'>微秒</b>級(jí)<b class='flag-5'>延時(shí)</b>函數(shù)

    STM32CubeMX 配置STM32F407 實(shí)現(xiàn)HAL庫(kù)延時(shí)微妙方案

    STM32CubeMX 配置STM32F407 實(shí)現(xiàn)HAL庫(kù)延時(shí)微妙方案
    發(fā)表于 11-24 20:51 ?20次下載
    <b class='flag-5'>STM32</b>CubeMX 配置<b class='flag-5'>STM32</b>F407 <b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>延時(shí)</b>微妙方案

    stm32HAL庫(kù)實(shí)現(xiàn)us延時(shí)方法

    stm32HAL庫(kù)實(shí)現(xiàn)us延時(shí)方法HAL_Delay()源碼為ms級(jí)別的
    發(fā)表于 01-17 09:32 ?5次下載
    <b class='flag-5'>stm32</b>之<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>實(shí)現(xiàn)</b>us<b class='flag-5'>延時(shí)</b>方法

    STM32 HAL 庫(kù)延時(shí)函數(shù) HAL_Delay 解析

    HAL 庫(kù)有提供延時(shí)函數(shù),只不過(guò)它只能實(shí)現(xiàn)簡(jiǎn)單的毫秒級(jí)別延時(shí),沒(méi)有實(shí)現(xiàn) us 級(jí)別
    發(fā)表于 01-17 09:48 ?8次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>HAL</b> <b class='flag-5'>庫(kù)</b><b class='flag-5'>延時(shí)</b>函數(shù) <b class='flag-5'>HAL</b>_Delay 解析

    STM32HAL庫(kù)微秒延時(shí)(μs)

    STM32HAL庫(kù)微秒(μs)延時(shí)
    發(fā)表于 01-18 10:39 ?48次下載
    <b class='flag-5'>STM32HAL</b><b class='flag-5'>庫(kù)</b><b class='flag-5'>微秒</b><b class='flag-5'>延時(shí)</b>(μs)

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

    STM32程序從標(biāo)準(zhǔn)庫(kù)移植到HAL庫(kù)的時(shí)候,會(huì)發(fā)現(xiàn)HAL庫(kù)中只有一個(gè)毫秒級(jí)
    的頭像 發(fā)表于 09-21 10:33 ?9925次閱讀

    STM32 HAL庫(kù)的功能和使用方法 STM32 HAL庫(kù)和標(biāo)準(zhǔn)庫(kù)的區(qū)別

    HAL(Hardware Abstraction Layer)是指硬件抽象層,是一種封裝底層硬件接口驅(qū)動(dòng)的編程庫(kù)。在嵌入式系統(tǒng)中,HAL庫(kù)可以更加方便地
    發(fā)表于 08-08 18:21 ?3673次閱讀

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

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