<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于STM32的計數與延時

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-12 11:20 ? 次閱讀

Ⅰ關于STM32的計數和延時

在STM32中,具有計數(或計時)功能的模塊基本都能實現延時功能。如:系統滴答SysTick、定時器TIM、實時時鐘RTC、看門狗WDG。

精確延時一般使用定時器TIM即可實現。當然,是否精確,取決于你的主頻(也就是晶振)是否準確,如果主頻精確,那么實現的延時也一定精確。

一般來說,常溫下實現us微秒級的延時,誤差還是挺小的(應該說挺精確)。拿F407,主頻168M來說,可以實現幾十ns納秒的延時,如果選用高精度的晶振,誤差還是很小的。

總結:想要TIM定時器實現高精確的延時,就需要高精度的晶振。主頻精確,那么延時就精確。

ⅡSTM32的TIM定時器

STM32的定時器有3類:

高級定時器Advanced control Timer

通用定時器General purpose Timer

基本定時器BasicTimer

STM32的這三種定時器都能實現最基本的定時計數功能。差異在于它們的功能多少不一樣,從結構圖一目了然,下面以STM32F4為例,給大家展示一下F4三類定時器的結構圖:

高級定時器

通用定時器

基本定時器

相信大家看了上面3種結構圖,心里大概應該明白它們的差異存在哪些地方。具體差異可以參看手冊中的“主要特性”,里面詳細講述了其中的功能和特性。

重要提示:

1.定時器的位數有16位和32位之分,詳見數據手冊。

2.定時器有多少個,以及是TIM幾,同樣見數據手冊。如下圖STM32F411就只有8個定時器,沒有基本定時器。

ⅢSTM32定時器計數延時原理

上面3種定時器(高級、通用和基本)都能實現計數延時的功能,我們以最簡單的基本定時器為例,還是參看著結構圖來說明:

1.來自RCC的時鐘,參看RCC時鐘樹,一般是SystemCoreClock或者SystemCoreClock/2, 如STM32F429的就是(180M/2)。

2.分頻CK_PSC之后就是計數器CK_CNT的計數頻率。

如分頻值位9,則計數頻率為1M. (180M / 2 /9= 10M).

3.實現1us計數:

上面1秒計數10M個數,那么我計10個數,就是1us的時間。只需要在自動重載寄存器ARR中填充10 - 1即可。

代碼分析:

紅定義

//計數時鐘(相當于1秒鐘計數10M次個脈沖) #define TIM6_COUNTER_CLOCK 10000000 //預分頻值 #define TIM6_PRESCALER_VALUE (SystemCoreClock/2/TIM6_COUNTER_CLOCK - 1) //定時周期(計數滿10個算一個周期,也就是1us) #define TIM6_PERIOD_TIMING (10 - 1)

配置

void TIM6_Configuration(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM6時基單元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PRESCALER_VALUE; //預分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式 TIM_TimeBaseStructure.TIM_Period = TIM6_PERIOD_TIMING; //定時周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //時鐘分頻因子 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能"更新"中斷 }

如果需要中斷,則開啟1us中斷。

定時器阻塞延時

void TIM6_Nus(uint16_t Times){ TIM_Cmd(TIM6, ENABLE); //啟動定時器 while(Times--) { while(TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == RESET); //等待計數完成 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除標志 } TIM_Cmd(TIM6, DISABLE); //關閉定時器 }

以上代碼,之前有分享過類似的,在下載區 STM32F417_第一階段里面。

提示:

1.這類阻塞延時,僅供學習其原理使用,請結合實際項目修改代碼。

2.可以通過定時中斷 + 讀取計數器的值來獲取精確的時間。

比如:1ms中斷一次,同時,計數累加。獲取計數值 +累計值也能得出精確延時。 (當然,中斷不能太頻繁), 此原理,適用于其他SysTick,RTC等具有計數功能的模塊。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 延時
    +關注

    關注

    0

    文章

    106

    瀏覽量

    25252
  • STM32
    +關注

    關注

    2245

    文章

    10685

    瀏覽量

    349486
  • Tim
    Tim
    +關注

    關注

    0

    文章

    80

    瀏覽量

    17729
  • 計數
    +關注

    關注

    1

    文章

    56

    瀏覽量

    20002
收藏 人收藏

    評論

    相關推薦

    stm32cubemx的HAL_Delay()函數,當HAL_GetTick()的計數正好要溢出時,是不是延時就不準了?

    (); while((HAL_GetTick() - tickstart) < Delay) { } } 這里使用這個延時函數有沒有這種情況,當HAL_GetTick()的計數正好要溢出時,是不是延時就不準了?
    發表于 05-09 06:20

    FreeRtos能否直接讀取Rtos的系統時鐘計數器來實現延時統計,改如何讀取呢?

    關于200~300uS的延時 1 能否直接讀取Rtos的 系統時鐘計數器來 實現延時統計,改如何讀取呢? 2 通過獨立的定時器中斷來實現,這樣感覺有點麻煩,好處是比較嚴謹,但是代碼
    發表于 04-29 08:40

    AvR單片機1us延時函數數怎么寫

    是單片機中的一個特殊寄存器,它可以以特定的頻率進行計數,并在計數達到一定值時觸發中斷。 對于AvR單片機來說,我們可以利用定時器的計數器來實現微秒級的延時。AvR單片機常見的定時器有T
    的頭像 發表于 12-26 14:02 ?476次閱讀

    stm32delay函數怎么寫

    STM32延時函數可以使用SysTick定時器來實現。SysTick定時器是一個24位的計數器,它可以在每個時鐘周期自動減少計數值,直到計數
    的頭像 發表于 12-21 17:53 ?963次閱讀

    STM32的向上計數模式如何產生計數器溢出事件?

    STM32的向上計數模式的自動加載值是指定時器計數器的最大計數值。當計數器達到這個值時,它會回滾到0并繼續
    的頭像 發表于 12-13 10:22 ?734次閱讀

    簡述STM32定時器的計數器模式

    STM32的向上計數模式是指定時器的計數器從0開始計數,直到達到自動加載值(TIMx_ARR),然后重新從0開始計數,并產生一個
    的頭像 發表于 12-13 10:09 ?2439次閱讀

    如何使RC延時電路無延時呢?

    如何使RC延時電路無延時呢? RC延時電路是一種常見的電子電路,用于在電路中引入一個可控的時間延遲。然而,有時候我們可能需要使RC延時電路無延時
    的頭像 發表于 11-20 17:05 ?629次閱讀

    ADC模數轉換器的延時原理

    ADC模數轉換器的延時原理主要與其內部的采樣和保持電路、比較器、計數器等有關。以下是一般的ADC轉換延時過程:
    的頭像 發表于 11-16 15:59 ?504次閱讀

    STM32如何使用定時器實現微秒(us)級延時?

    STM32如何使用定時器實現微秒(us)級延時? 在STM32微控制器中,可以使用定時器實現微秒級延時。具體來說,可以使用定時器的計數器和自
    的頭像 發表于 11-06 11:05 ?3683次閱讀

    關于STM32WL LSE 添加反饋電阻后無法起振問題

    關于STM32WL LSE 添加反饋電阻后無法起振問題
    的頭像 發表于 10-25 16:48 ?417次閱讀
    <b class='flag-5'>關于</b><b class='flag-5'>STM32</b>WL LSE 添加反饋電阻后無法起振問題

    STM32基于HAL庫實現微秒延時

    HAL只提供了ms級的延時,但有些特殊場景,比如與通信速率較慢的設備通信時,會需要用到us級延時。STM32標準庫一般是使用系統嘀嗒定時器來進行微妙級別的延時,而HAL庫將SysTic
    的頭像 發表于 10-25 15:31 ?2214次閱讀
    <b class='flag-5'>STM32</b>基于HAL庫實現微秒<b class='flag-5'>延時</b>

    關于STM32CubeIDE鏈接腳本的小問題

    電子發燒友網站提供《關于STM32CubeIDE鏈接腳本的小問題.pdf》資料免費下載
    發表于 09-20 11:25 ?0次下載
    <b class='flag-5'>關于</b><b class='flag-5'>STM32</b>CubeIDE鏈接腳本的小問題

    HK32MCU應用筆記(五)| 關于應用HK32F030延時效率問題

    HK32MCU應用筆記(五)| 關于應用HK32F030延時效率問題
    的頭像 發表于 09-18 11:00 ?440次閱讀

    STM32單片機的延時原理和延時函數方法

    當涉及到單片機編程時,延時是一項常見但關鍵的任務。在許多應用中,我們需要控制程序暫停一段時間,以實現精確的時間控制或協調不同設備之間的操作。本文將以STM32為例,介紹關于單片機的延時
    發表于 08-09 09:13 ?1.2w次閱讀

    單片機兩大延時方法總結

    實現延時通常有兩種方法:一種是硬件延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟件延時,這種方法
    發表于 06-14 09:19 ?2543次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>