<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 老宇哥帶你玩轉 ESP32:08 硬件定時(shí)器

老宇哥帶你玩轉 ESP32:08 硬件定時(shí)器

發(fā)布人:芯片之大家 時(shí)間:2023-07-04 來(lái)源:工程師 發(fā)布文章

今天我們來(lái)玩兒硬件定時(shí)器。

硬件定時(shí)器概述

ESP32內置4個(gè)64-bit的通用定時(shí)器,每個(gè)定時(shí)器包含一個(gè) 16-bit 預分頻器和一個(gè) 64-bit 可自動(dòng)重新加載向上/向下計數器,定時(shí)器是分為兩組的,每組兩個(gè)。

定時(shí)器有以下特性:

  • 16-bit 時(shí)鐘預分頻器,分頻系數為 2-65536

  • 64-bit 時(shí)基計數器

  • 可配置的向上/向下時(shí)基計數器:增加或減少

  • 暫停和恢復時(shí)基計數器

  • 報警時(shí)自動(dòng)重新加載

  • 當報警值溢出/低于保護值時(shí)報警

  • 軟件控制的即時(shí)重新加載

  • 電平觸發(fā)中斷和邊沿觸發(fā)中斷

每個(gè)定時(shí)器以APB_CLK(80MHz)作為基礎時(shí)鐘,通過(guò)預分頻器(16-bit)進(jìn)行分頻后,產(chǎn)生最終的時(shí)鐘信號,每過(guò)一個(gè)周期,計數器會(huì )向上加一或者向下減一,計數器支持自動(dòng)重新加載和軟件即時(shí)重新加載,計數器達到軟件設定值時(shí)會(huì )觸發(fā)報警事件。

使用定時(shí)器,可以按照一定的頻率自動(dòng)的重復執行我們需要的任務(wù),本示例我們簡(jiǎn)單演示一個(gè)LED燈在定時(shí)器的控制下閃爍的案例。

硬件

SDA硬件連接很簡(jiǎn)單,這里接到IO4

image.png


軟件

初始化定時(shí)器

定時(shí)器使用前需要初始化,第一個(gè)參數為使用哪個(gè)定時(shí)器,這里有4個(gè)定時(shí)器,所以參數可為0,1,2,3;第二個(gè)參數為預分頻數,定時(shí)器時(shí)鐘為80MHz,如果我們這里設置為80,那么每個(gè)計數周期就是1us;第三個(gè)參數為是否向上計數,true為向上,反之亦然。

hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp);

設置定時(shí)器中斷回調函數

第一個(gè)參數為使用哪個(gè)定時(shí)器;第二個(gè)參數為定時(shí)器超時(shí),中斷的回調函數;第三個(gè)參數,如果為true,則報警產(chǎn)生邊緣類(lèi)型中斷。

void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);

設置定時(shí)器的定時(shí)值

第一個(gè)參數為使用哪個(gè)定時(shí)器;第二個(gè)參數為定時(shí)器的定時(shí)值,如果為1000000,每個(gè)計數周期為1us,定時(shí)時(shí)間就是1秒;第三個(gè)參數為是否自動(dòng)重載,選擇true,在定時(shí)時(shí)間到達后會(huì )重復計時(shí)。

void timerAlarmWrite(hw_timer_t *timer, uint64_t interruptAt, bool autoreload);

啟動(dòng)定時(shí)器

啟動(dòng)定時(shí)器后,將開(kāi)始計時(shí)。

bool timerAlarmEnabled(hw_timer_t *timer);

定時(shí)器還有其它函數,都在庫文件中,大家可以在下面兩個(gè)文件中找到相關(guān)源碼。

esp32-hal-timer.h
esp32-hal-timer.c

完整程序

這里我們用一個(gè)例子來(lái)演示一下,定時(shí)器計時(shí)周期設置為1秒,在中斷函數中控制指示燈以1秒為周期閃爍。

#define LED_GPIO 4/* 創(chuàng  )建硬件定時(shí)器 */hw_timer_t * timer = NULL;/* LED 狀態(tài) */byte led_state = LOW; 
void IRAM_ATTR Timer0_Interrupt(){
  led_state = !led_state;
  digitalWrite(LED_GPIO, led_state);
} 
void setup() {
  Serial.begin(115200);
  pinMode(LED_GPIO, OUTPUT); 
  /* 使用定時(shí)器0,1/(80MHZ/80) = 1us ,周期為1us */
  timer = timerBegin(0, 80, true); 
  /* 中斷回調函數為T(mén)imer0_Interrupt */
  timerAttachInterrupt(timer, &Timer0_Interrupt, true); 
  /* 計數Count為1000000,也就是1秒中斷一次,重復計數 */
  timerAlarmWrite(timer, 1000000, true); 
  /* 啟動(dòng)定時(shí)器*/
  timerAlarmEnable(timer);
  Serial.println("timer0 start");
} 
void loop() {
 
}

實(shí)驗效果:


示波器觀(guān)察:

image.png


定時(shí)器使用比較簡(jiǎn)單,當然,在一些不是特別精準的場(chǎng)合,使用一個(gè)硬件定時(shí)器,我們也可以創(chuàng )建軟件定時(shí)器,這樣就可以定義很多個(gè)不同的定時(shí)任務(wù)了,這個(gè)后面遇到案例了我們再展開(kāi)討論。

感謝大家,關(guān)于ESP32的學(xué)習,希望大家Enjoy!


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 硬件

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>