一本精品热在线视频,久久免费视频分类,精品婷婷乱码久久久久久蜜桃,在线可以免费观看的Av

<mark id="vd61v"><dl id="vd61v"></dl></mark>
    <sub id="vd61v"><ol id="vd61v"></ol></sub>

  • <sub id="vd61v"><ol id="vd61v"></ol></sub>
    "); //-->

    博客專欄

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

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

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

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

    硬件定時(shí)器概述

    ESP32內(nèi)置4個(gè)64-bit的通用定時(shí)器,每個(gè)定時(shí)器包含一個(gè) 16-bit 預(yù)分頻器和一個(gè) 64-bit 可自動(dòng)重新加載向上/向下計(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)重新加載

    • 當(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í)鐘信號(hào),每過一個(gè)周期,計(jì)數(shù)器會(huì)向上加一或者向下減一,計(jì)數(shù)器支持自動(dòng)重新加載和軟件即時(shí)重新加載,計(jì)數(shù)器達(dá)到軟件設(shè)定值時(shí)會(huì)觸發(fā)報(bào)警事件。

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

    硬件

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

    image.png


    軟件

    初始化定時(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ù)為是否自動(dòng)重載,選擇true,在定時(shí)時(shí)間到達(dá)后會(huì)重復(fù)計(jì)時(shí)。

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

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

    啟動(dòng)定時(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); 
      /* 啟動(dòng)定時(shí)器*/
      timerAlarmEnable(timer);
      Serial.println("timer0 start");
    } 
    void loop() {
     
    }

    實(shí)驗(yàn)效果:


    示波器觀察:

    image.png


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

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


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



    關(guān)鍵詞: 硬件

    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉