今天我們來玩兒硬件定時(shí)器。
硬件定時(shí)器概述
ESP32內(nèi)置4個(gè)64-bit的通用定時(shí)器,每個(gè)定時(shí)器包含一個(gè) 16-bit 預(yù)分頻器和一個(gè)64-bit 可自動重新加載向上/向下計(jì)數(shù)器,定時(shí)器是分為兩組的,每組兩個(gè)。
定時(shí)器有以下特性:
- 16-bit 時(shí)鐘預(yù)分頻器,分頻系數(shù)為 2-65536
- 64-bit 時(shí)基計(jì)數(shù)器
- 可配置的向上/向下時(shí)基計(jì)數(shù)器:增加或減少
- 暫停和恢復(fù)時(shí)基計(jì)數(shù)器
- 報(bào)警時(shí)自動重新加載
- 當(dāng)報(bào)警值溢出/低于保護(hù)值時(shí)報(bào)警
- 軟件控制的即時(shí)重新加載
- 電平觸發(fā)中斷和邊沿觸發(fā)中斷
每個(gè)定時(shí)器以APB_CLK(80MHz)作為基礎(chǔ)時(shí)鐘,通過預(yù)分頻器(16-bit)進(jìn)行分頻后,產(chǎn)生最終的時(shí)鐘信號,每過一個(gè)周期,計(jì)數(shù)器會向上加一或者向下減一,計(jì)數(shù)器支持自動重新加載和軟件即時(shí)重新加載,計(jì)數(shù)器達(dá)到軟件設(shè)定值時(shí)會觸發(fā)報(bào)警事件。
使用定時(shí)器,可以按照一定的頻率自動的重復(fù)執(zhí)行我們需要的任務(wù),本示例我們簡單演示一個(gè)LED燈在定時(shí)器的控制下閃爍的案例。
硬件
SDA硬件連接很簡單,這里接到IO4
軟件
初始化定時(shí)器
定時(shí)器使用前需要初始化,第一個(gè)參數(shù)為使用哪個(gè)定時(shí)器,這里有4個(gè)定時(shí)器,所以參數(shù)可為0,1,2,3;第二個(gè)參數(shù)為預(yù)分頻數(shù),定時(shí)器時(shí)鐘為80MHz,如果我們這里設(shè)置為80,那么每個(gè)計(jì)數(shù)周期就是1us;第三個(gè)參數(shù)為是否向上計(jì)數(shù),true為向上,反之亦然。
hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp);
設(shè)置定時(shí)器中斷回調(diào)函數(shù)
第一個(gè)參數(shù)為使用哪個(gè)定時(shí)器;第二個(gè)參數(shù)為定時(shí)器超時(shí),中斷的回調(diào)函數(shù);第三個(gè)參數(shù),如果為true,則報(bào)警產(chǎn)生邊緣類型中斷。
void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);
設(shè)置定時(shí)器的定時(shí)值
第一個(gè)參數(shù)為使用哪個(gè)定時(shí)器;第二個(gè)參數(shù)為定時(shí)器的定時(shí)值,如果為1000000,每個(gè)計(jì)數(shù)周期為1us,定時(shí)時(shí)間就是1秒;第三個(gè)參數(shù)為是否自動重載,選擇true,在定時(shí)時(shí)間到達(dá)后會重復(fù)計(jì)時(shí)。
void timerAlarmWrite(hw_timer_t *timer, uint64_t interruptAt, bool autoreload);
啟動定時(shí)器
啟動定時(shí)器后,將開始計(jì)時(shí)。
bool timerAlarmEnabled(hw_timer_t *timer);
定時(shí)器還有其它函數(shù),都在庫文件中,大家可以在下面兩個(gè)文件中找到相關(guān)源碼。
esp32-hal-timer.h
esp32-hal-timer.c
完整程序
這里我們用一個(gè)例子來演示一下,定時(shí)器計(jì)時(shí)周期設(shè)置為1秒,在中斷函數(shù)中控制指示燈以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);
/* 中斷回調(diào)函數(shù)為Timer0_Interrupt */
timerAttachInterrupt(timer, &Timer0_Interrupt, true);
/* 計(jì)數(shù)Count為1000000,也就是1秒中斷一次,重復(fù)計(jì)數(shù) */
timerAlarmWrite(timer, 1000000, true);
/* 啟動定時(shí)器*/
timerAlarmEnable(timer);
Serial.println("timer0 start");
}
void loop() {
}
實(shí)驗(yàn)效果:
示波器觀察:
定時(shí)器使用比較簡單,當(dāng)然,在一些不是特別精準(zhǔn)的場合,使用一個(gè)硬件定時(shí)器,我們也可以創(chuàng)建軟件定時(shí)器,這樣就可以定義很多個(gè)不同的定時(shí)任務(wù)了,這個(gè)后面遇到案例了我們再展開討論。
感謝大家,關(guān)于ESP32的學(xué)習(xí),希望大家Enjoy!
-
分頻器
+關(guān)注
關(guān)注
43文章
448瀏覽量
50087 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2276瀏覽量
95047 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1747瀏覽量
131849 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115442 -
ESP32
+關(guān)注
關(guān)注
18文章
980瀏覽量
17564
發(fā)布評論請先 登錄
相關(guān)推薦
通用硬件定時(shí)器的相關(guān)資料下載
為什么選擇esp_timer定時(shí)器作為esp32首選軟件定時(shí)器呢
ESP32S2硬件定時(shí)器中斷翻轉(zhuǎn)GPIO問題求解
ESP32 開發(fā)筆記(四)LVGL控件學(xué)習(xí) Window 窗口控件 X
![<b class='flag-5'>ESP32</b> 開發(fā)<b class='flag-5'>筆記</b>(四)LVGL控件<b class='flag-5'>學(xué)習(xí)</b> Window 窗口控件 X](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于硬件定時(shí)器的軟件定時(shí)器
![基于<b class='flag-5'>硬件</b><b class='flag-5'>定時(shí)器</b>的軟件<b class='flag-5'>定時(shí)器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 之 ESP-IDF 教學(xué)(三)——通用硬件定時(shí)器(Timer)
![<b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(三)——通用<b class='flag-5'>硬件</b><b class='flag-5'>定時(shí)器</b>(Timer)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記02
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>02](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
[ESP32]學(xué)習(xí)筆記04
![[<b class='flag-5'>ESP32</b>]<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>04](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
SPI主線協(xié)議——ESP32學(xué)習(xí)筆記
![SPI主線協(xié)議——<b class='flag-5'>ESP32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32_PWM學(xué)習(xí)總結(jié)
![<b class='flag-5'>ESP32</b>_PWM<b class='flag-5'>學(xué)習(xí)</b>總結(jié)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP32 單片機(jī)學(xué)習(xí)筆記 - 04 - ADC和定時(shí)器
![<b class='flag-5'>ESP32</b> 單片機(jī)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 04 - ADC和<b class='flag-5'>定時(shí)器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
定時(shí)器學(xué)習(xí)筆記
![<b class='flag-5'>定時(shí)器</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于ESP32的低功耗藍(lán)牙暗室定時(shí)器
![基于<b class='flag-5'>ESP32</b>的低功耗藍(lán)牙暗室<b class='flag-5'>定時(shí)器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論