ESP32 - Micropython ESP-IDF 雙線教程 中斷和定時器 (1)

ESP32 - Micropython ESP-IDF 雙線教程 中斷和定時器

    • ESP32中斷
    • ESP32定時器
    • 歸納
    • ESP32 - Micropython 定時器
      • 示例代碼
      • 代碼介紹
    • ESP32 - IDF 定時器
      • 示例代碼
      • 代碼解釋
      • ESP32-IDF定時器使用介紹

ESP32中的中斷和定時器是兩種重要的硬件特性,它們在嵌入式系統開發中扮演著關鍵角色。以下是關于ESP32中斷和定時器的詳細介紹:
本文無中斷實例代碼,中斷代碼可以在按鍵部分查找

ESP32中斷

1. 中斷概述

中斷是一種硬件機制,用于處理在程序正常執行期間不發生但在特定觸發發生時的事件。ESP32的每個內核最多提供32個中斷槽,用于響應各種外部和內部事件。

2. 中斷類型

  • 硬件中斷:響應外部硬件事件,如GPIO中斷(如按鍵按下時)或觸摸中斷(檢測到觸摸時)。
  • 軟件中斷:響應軟件指令,如定時器中斷(當定時器超時時)或看門狗定時器中斷。

3. ESP32 GPIO中斷

  • 功能:ESP32板上的所有GPIO引腳都可以配置為充當中斷請求輸入。
  • 配置:使用attachInterrupt()函數將中斷附加到GPIO引腳。該函數接受三個參數:GPIO引腳號、中斷服務例程(ISR)函數名和觸發模式。
  • ISR(中斷服務例程):每次GPIO引腳上發生中斷時調用的函數。ISR應該盡可能簡短且快速,因為它們會阻止正常的程序執行。

ESP32定時器

1. 定時器概述

ESP32內置4個64位通用定時器,每個定時器包含一個16位預分頻器和一個64位可自動重新加載的向上/向下計數器。這些定時器可以用于各種時間相關的應用,如事件計時、周期性操作、脈沖寬度調制(PWM)等。

2. 定時器特性

  • 16位預分頻器:用于對APB時鐘進行分頻,產生時基計數器時鐘(TB_clk)。
  • 64位時基計數器:支持向上/向下計數,并可在報警時自動重新加載。
  • 觸發中斷:支持電平觸發和邊沿觸發中斷。

3. 定時器使用

  • 初始化:通過配置相關寄存器來初始化定時器,包括設置預分頻器值、計數方向、中斷使能等。
  • 設置中斷時間:通過配置定時器的計數器和預分頻器來設定中斷觸發的時間間隔。
  • 設置回調函數:當定時器觸發中斷時,可以調用預設的回調函數來執行特定任務。
  • 使能定時器:配置完成后,使能定時器以開始計時。

歸納

  • 中斷:用于處理外部和內部事件,通過中斷服務例程實現快速響應。ESP32的每個內核支持多達32個中斷,可配置GPIO引腳作為中斷源。
  • 定時器:用于計時、計數和生成定時事件。ESP32內置4個64位通用定時器,支持多種觸發方式和中斷機制,適用于各種實時應用。

在ESP32的MicroPython環境中,可以使用machine.Timer類來實現定時器功能。machine.Timer類允許你創建一個或多個定時器,這些定時器可以在指定的時間間隔后執行回調函數。以下是一個使用ESP32-MicroPython實現定時器功能的示例代碼和介紹:

ESP32 - Micropython 定時器

示例代碼

from machine import Timer
import time# 定義一個回調函數,當定時器觸發時被調用
def timer_callback(timer):print("Timer triggered!")# 這里可以添加你想要在定時器觸發時執行的代碼# 創建一個定時器對象,并設置其觸發周期和回調函數
# 第一個參數是定時器編號,通常為0或1,但某些平臺可能支持更多
# 第二個參數是觸發周期,單位為毫秒(ms)
# 第三個參數是定時器模式,machine.Timer.PERIODIC表示周期性觸發
# 第四個參數是回調函數
tim = Timer(0)  # 假設使用定時器0
tim.init(period=1000, mode=Timer.PERIODIC, callback=timer_callback)# 等待一段時間,以便觀察定時器的觸發情況
print("Waiting for timer to trigger...")
time.sleep(5)  # 等待5秒# 停止并刪除定時器
tim.deinit()
print("Timer stopped.")

代碼介紹

  1. 導入必要的模塊:從machine模塊中導入Timer類,并導入time模塊以便使用time.sleep()函數。

  2. 定義回調函數:創建一個名為timer_callback的函數,該函數將在定時器觸發時被調用。在這個示例中,回調函數只是簡單地打印一條消息,但你可以在這里添加任何你想要在定時器觸發時執行的代碼。

  3. 創建和配置定時器:使用Timer類創建一個定時器對象(在這個例子中,我們假設使用定時器0)。然后,使用init()方法配置定時器的參數。這些參數包括定時器的觸發周期(以毫秒為單位)、定時器模式(在這個例子中,我們使用Timer.PERIODIC來設置定時器周期性觸發)以及回調函數。

  4. 等待定時器觸發:為了觀察定時器的觸發情況,我們在主程序中添加了一個簡單的等待循環,使用time.sleep(5)讓程序暫停5秒鐘。在這段時間內,你應該能夠看到定時器每隔1秒觸發一次,并打印出"Timer triggered!"的消息。

  5. 停止和刪除定時器:在等待結束后,我們調用deinit()方法來停止并刪除定時器。這將釋放與定時器相關的資源,并停止定時器的觸發。

請注意,具體的定時器編號(在Timer()構造函數中作為第一個參數傳遞)可能因硬件平臺和MicroPython版本而異。在某些平臺上,可能只能使用特定的定時器編號,或者可能有更多的定時器可用。因此,在實際應用中,請參考使用的開發板和MicroPython版本的文檔來了解可用的定時器編號和限制。

ESP32 - IDF 定時器

示例代碼

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/timer.h"
#include "esp_log.h"#define TIMER_GROUP 0
#define TIMER_IDX   0
#define TIMER_INTERVAL_MS 1000  // 定時器間隔為1秒static const char *TAG = "timer_example";// 定時器回調函數
static void IRAM_ATTR timer_group0_handler(void *arg)
{// 這里可以添加定時器觸發時需要執行的代碼ESP_LOGI(TAG, "Timer handler triggered");
}void app_main(void)
{// 初始化定時器timer_config_t config = {.alarm_en = true,.auto_reload = true,.divider = TIMER_BASE_CLK / 1000, // 計數器時鐘分頻系數.counter_dir = TIMER_COUNT_UP,.intr_type = TIMER_INTR_LEVEL,.intr_enable = true,};// 配置定時器timer_init(TIMER_GROUP, TIMER_IDX, &config);// 設置定時器超時時間timer_set_counter_value(TIMER_GROUP, TIMER_IDX, 0x00000000ULL);timer_set_alarm_value(TIMER_GROUP, TIMER_IDX, TIMER_INTERVAL_MS * config.divider);// 安裝定時器中斷服務例程timer_isr_register(TIMER_GROUP, &timer_group0_handler, NULL, ESP_INTR_FLAG_IRAM, NULL);// 啟動定時器timer_start(TIMER_GROUP, TIMER_IDX);// 主循環,在這里可以添加其他任務while (1) {// ...vTaskDelay(pdMS_TO_TICKS(1000)); // 延時1秒,保持主循環運行}
}

代碼解釋

  1. 頭文件引入:引入了FreeRTOS和ESP-IDF中用于定時器的頭文件。

  2. 宏定義:定義了定時器組(TIMER_GROUP)、定時器索引(TIMER_IDX)和定時器間隔(TIMER_INTERVAL_MS)。

  3. 日志標簽:定義了日志標簽TAG,用于在日志輸出中標識此示例。

  4. 定時器回調函數:定義了timer_group0_handler函數,該函數在定時器觸發時被調用。使用IRAM_ATTR屬性確保該函數位于IRAM中,因為中斷服務例程需要快速響應。

  5. app_main函數:這是ESP32應用的主入口函數。

    • 定時器初始化:使用timer_config_t結構體配置定時器,包括是否啟用鬧鐘、是否自動重載、計數器時鐘分頻系數、計數方向、中斷類型和是否啟用中斷。

    • 配置定時器:調用timer_init函數來根據配置初始化定時器。

    • 設置定時器超時時間:使用timer_set_counter_value設置計數器的初始值,使用timer_set_alarm_value設置鬧鐘值(即定時器觸發的時間)。

    • 安裝定時器中斷服務例程:使用timer_isr_register函數將中斷服務例程與定時器關聯起來。

    • 啟動定時器:調用timer_start函數啟動定時器。

    • 主循環:使用FreeRTOS的vTaskDelay函數保持主循環運行,并可以添加其他任務。

ESP32-IDF定時器使用介紹

ESP32-IDF提供了硬件定時器的API,允許配置和使用ESP32的定時器硬件。每個定時器組包含多個定時器,可以配置定時器的各種參數,如分頻系數、計數方向、中斷類型等。

使用ESP32-IDF的定時器,需要:

  1. 配置定時器:使用timer_config_t結構體配置定時器的參數。

  2. 初始化定時器:調用timer_init函數初始化定時器。

  3. 設置定時器超時時間:使用`timer_set_counter_value

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17355.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

系統思考—戰略沙盤推演咨詢服務

今日與JSTO團隊一起學習了《戰略沙盤推演咨詢服務》。通過沙盤體驗,我深刻感受到組織與戰略就像一張皮的正反兩面。在轉型過程中,即使戰略非常明確,團隊成員由于恐懼和顧慮,往往不愿意挑戰新的業務,從而難以實現戰略目…

VasDolly圖形工具-Android多渠道打包福利

簡介 基于騰訊VasDolly最新版本3.0.6的圖形界面衍生版本,旨在更好的幫助開發者構建多渠道包 使用 下載并解壓工具包,找到Startup腳本并雙擊啟動圖形界面(注意:本地需安裝java環境) 渠道格式說明 txt文件&#xff…

音頻鏈接抓取技術在Lua中的實現

前言 隨著數字音樂的普及,越來越多的用戶選擇在線音樂平臺來享受音樂。網易云音樂作為國內領先的音樂服務平臺,不僅提供了豐富的音樂資源,還擁有獨特的社交屬性,吸引了大量的用戶。在眾多的音樂服務中,音頻鏈接的抓取…

Qt | QTabBar 類(選項卡欄)

01、上節回顧 Qt | QStackedLayout 類(分組布局或棧布局)、QStackedWidget02、簡介 1、QTabBar類直接繼承自 QWidget。該類提供了一個選項卡欄,該類僅提供了一個選項卡, 并沒有為每個選項卡提供相應的頁面,因此要使選項卡欄實際可用,需要自行為每個選項卡設置需要顯示的頁…

【面試題】JavaScript基礎高頻面試(上)

1、簡述JavaScript中map和foreach的區別? map和forEach都是JavaScript數組的迭代方法,但它們之間存在一些關鍵區別。 1. 返回值:map方法會返回一個新的數組,這個新數組是由原數組通過某個函數處理后的結果組成的。而forEach方法…

Ubuntu18.04 重裝/升級 eigen 教程

目錄 一、Eigen 1.1 ubuntu 查看 eigen 版本 1.2 卸載 老版本 eigen 二、安裝 eigen 3.4.0 2.1 配置安裝 2.2 查看版本 一、Eigen 1.1 ubuntu 查看 eigen 版本 $ dpkg -l | grep eigen1.2 卸載 老版本 eigen sudo updatedb locate eigen3會獲得一堆輸出,其…

springboot整合Kafka的快速使用教程

目錄 一、引入Kafka的依賴 二、配置Kafka 三、創建主題 1、自動創建(不推薦) 2、手動動創建 四、生產者代碼 五、消費者代碼 六、常用的KafKa的命令 Kafka是一個高性能、分布式的消息發布-訂閱系統,被廣泛應用于大數據處理、實時日志分析等場景。Spring B…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(二十一)- 微服務(1)

微服務 1.認識微服務 SpringCloud底層是依賴于SpringBoot的,并且有版本的兼容關系,如下: 2. 服務拆分 需求 : 把訂單信息和用戶信息一起返回 從訂單模塊向用戶模塊發起遠程調用 , 把查到的結果一起返回 步驟 &…

多態(難的起飛)

注意 virtual關鍵字: 1、可以修飾原函數,為了完成虛函數的重寫,滿足多態的條件之一 2、可以菱形繼承中,去完成虛繼承,解決數據冗余和二義性 兩個地方使用了同一個關鍵字,但是它們互相一點關系都沒有 虛函…

JAVASE總結一

1、 2、引用也可以是成員變量(實例變量),也可以是局部變量;引用數據類型,引用, 我們是通過引用去訪問JVM堆內存當中的java對象,引用保存了java對象的內存地址,指向了JVM堆內存當中…

ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制(PWM)(1)

ESP32 - Micropython ESP-IDF 雙線教程 脈寬調制(PWM) PWM 的基本原理PWM 的應用PWM 的優點PWM 的實現方式ESP32-micropython 中的 PWM 功能使用 micropython 控制 PWM 的代碼示例代碼介紹 ESP32-IDF 中的 PWM 功能1. 初始化配置函數2. 引腳綁定函數3. 占…

常見算法200個(5):快速排序(快排)

JS實現快速排序 1.快速排序思路: 選擇數組中的一個值作為基準,將數組中小于該值的數置于該數之前,大于該值的數置于該數之后,接著對該數前后的兩個數組進行重復操作直至排序完成。 2.代碼實現: function quick(arr)…

使用 Snort 進行入侵檢測

使用 Snort 進行入侵檢測 Snort 是一種流行的開源入侵檢測系統。您可以在http://www.snort.org/上獲取它。Snort 分析流量并嘗試檢測和記錄可疑活動。Snort 還能夠根據其所做的分析發送警報。 Snort 安裝 在本課中,我們將從源代碼安裝。此外,我們不會安…

2024 前端面試每日1小時

三日 1. 如何理解Vue的模板編譯原理 Vue的模板編譯實際就是將模板字符串通過解析、優化和代碼生成等步驟轉換為渲染函數的過程。這個過程中,AST扮演了非常重要的角色,它用樹形結構描述了模板的內容和結構,是編譯過程的核心數據結構&#xff…

MySQL——適合不適合創建索引的情況

那些情況適合創建索引 1、字段的數值具有唯一性的限制 索引本身可以起到約束的作用,比如唯一索引、主鍵索引都是可以起到唯一性約束的,因此在我們的數據表中,如果某個字段是唯一性的,就可以直接創建唯一性索引,或者主…

Nodejs 爬蟲 案例

1.安裝: npm install cheerio npm install axios2.介紹: 2.1 cheerio 特點和用途描述: HTML解析和操作:Cheerio 可以將 HTML 字符串加載到內存中,并將其轉換為一個可操作的 DOM 樹結構,從而可以方便地對…

AURIX TC3xx單片機介紹-啟動過程介紹1

從各個域控制器硬件解決方案來看,MPU可能來自多個供應商,有瑞薩,有NXP等,但對于MCU來說,基本都采用英飛凌TC3xx。 今天我們就來看一下TC3xx的啟動過程,主要包含如下內容: uC上電過程中,會經過一個上電時序,從復位狀態“脫離”出來;Boot Firmware是復位后第一個執行的…

使用 Effect 同步-09

有些組件需要與外部系統同步。例如,你可能希望根據 React state 控制非 React 組件、設置服務器連接或在組件出現在屏幕上時發送分析日志。Effects 會在渲染后運行一些代碼,以便可以將組件與 React 之外的某些系統同步。 簡單理解,就是需要操…

Python實現對Word文檔內容出現“重復標題”進行自動去重(4)

前言 本文是該專欄的第4篇,后面會持續分享Python辦公自動化干貨知識,記得關注。 在本專欄上一篇文章《Python實現對Word文檔內容出現“重復標題”進行自動去重(3)》中,筆者有詳細介紹使用python對word文檔內容的目標文本進行自動去重。只不過本文要介紹的“去重方法”與上…

計算機專業必考之計算機指令設計格式

計算機指令設計格式 例題: 1.設相對尋址的轉移指令占3個字節,第一字節為操作碼,第二,第三字節為相對偏移量, 數據在存儲器以低地址為字地址的存放方式。 每當CPU從存儲器取出一個字節時候,自動完成&…