【史上最全面ESP32】軟件中斷與硬件中斷

文章目錄

    • 前言
    • 硬件中斷
      • 硬件中斷概念
      • 硬件中斷的使用
    • 軟件中斷
      • 軟件中斷概念
      • 軟件中斷的使用
    • 總結


前言

ESP32是一款高度集成的芯片,具有強大的中斷處理能力。在ESP32中,我們可以配置所有的GPIO引腳作為硬件中斷源,通過附加它們到相應的中斷服務例程(ISR)來啟用中斷。此外,ESP32還支持軟件中斷,例如定時器溢出時的定時器中斷。

硬件中斷

硬件中斷概念

硬件中斷是響應外部硬件事件而發生的,例如,當檢測到觸摸時發生觸摸中斷,當GPIO引腳的狀態改變時發生GPIO中斷。我們可以使用attachInterrupt()函數在引腳上設置中斷。

硬件中斷的使用

在ESP32中,我們可以使用硬件中斷來響應按鍵事件。以下是一個簡單的示例,說明了如何使用硬件中斷來檢測按鍵按下的事件。

const int buttonPin = 12; // GPIO pin where the button is connected
volatile bool has_interrupted = false;void IRAM_ATTR myInterruptFunction() {has_interrupted = true;
}void setup() {Serial.begin(115200);pinMode(buttonPin, INPUT_PULLUP); // Configure the pin as an input with internal pull-up resistorattachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING); // Configure the interrupt
}void loop() {if(has_interrupted) {Serial.println("Button pressed!");has_interrupted = false;}
}
  • attachInterrupt(digitalPinToInterrupt(buttonPin), myInterruptFunction, RISING);

    • 函數原型void attachInterrupt(uint8_t pin, voidFuncPtr callback, int mode);
    • 作用:將中斷服務例程(ISR)附加到指定的GPIO引腳上。
    • 參數
      • pin:要附加中斷的GPIO引腳編號。
      • callback:中斷發生時調用的函數(ISR)。
      • mode:定義觸發中斷的條件,例如RISING、FALLING、CHANGE等,他們分別表示上升沿觸發,下降沿觸發和改變就觸發。
    • 返回值:無。
  • digitalPinToInterrupt(buttonPin)

    • 函數原型int digitalPinToInterrupt(int pin);
    • 作用:將數字引腳轉換為中斷號,用于attachInterrupt()函數。
    • 參數
      • pin:要轉換的數字引腳編號。
    • 返回值:對應的中斷號。
  • myInterruptFunction()

    • 函數原型void IRAM_ATTR myInterruptFunction();
    • 作用:定義中斷服務例程(ISR),在中斷發生時執行的函數。
    • 參數:無。
    • 返回值:無。
      IRAM_ATTR是一個特殊的屬性,用于指示編譯器將特定的代碼段放置在ESP32的內部RAM(IRAM)中。這是因為ESP32基于哈佛架構,具有兩個總線:一個用于指令,一個用于數據。IRAM是可執行的,并且只能通過4字節對齊的字進行讀取或寫入。

當你在代碼中使用IRAM_ATTR標記時,你正在聲明編譯后的代碼將被放置在名為".dram.text"的段中。這意味著可執行文件不僅有".text"和".data"段,還有其他段。在ESP32啟動時,引導程序會在將控制權交給你的應用程序之前,將".dram.text"段復制到實際的RAM中。然后,RAM被映射到指令區域地址空間(> 0x4000 0000),這意味著可以將控制權傳遞給此代碼(如常規操作),因為代碼位于指令總線地址空間中。

使用IRAM_ATTR的一個主要原因是,當ESP32執行Flash操作(如寫入或擦除)時,需要在RAM中運行的中斷服務例程(ISR)。如果不使用IRAM_ATTR,代碼將被放置在Flash中,而Flash在ESP32上的速度比內部RAM慢。

軟件中斷

軟件中斷概念

軟件中斷是當觸發軟件事件時發生的,例如定時器溢出。我們可以使用ESP32的定時器中斷來執行特定的任務。

軟件中斷的使用

在此之前我們寫過定時器的文章,我們這里就不多贅述:ESP TIMER

總結

ESP32的中斷處理能力非常強大,無論是硬件中斷還是軟件中斷,都可以幫助我們更有效地管理和控制硬件設備,提高系統的實時性和響應速度。通過理解和掌握ESP32的中斷機制,我們可以更好地利用這款芯片的強大功能,為我們的項目帶來更多可能性。

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

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

相關文章

JFlash讀取和燒錄加密stm32程序

JFlash讀取和燒錄加密stm32程序 安裝后JFlash所在的目錄:C:\Program Files\SEGGER\JLink 一、燒寫加密程序 1、打開C:\Program Files\SEGGER\JLink目錄,找到JFlash.exe,雙擊它,就可以打開該執行程序。見下圖: 2、選擇“Create …

代碼隨想錄算法訓練營第三十天 | 01背包問題 二維 01背包問題 一維 416. 分割等和子集

46. 攜帶研究材料(第六期模擬筆試) 題目描述 小明是一位科學家,他需要參加一場重要的國際科學大會,以展示自己的最新研究成果。他需要帶一些研究材料,但是他的行李箱空間有限。這些研究材料包括實驗設備、文獻資料和…

無題:天選之子?

1. 從一個人說起:孤獨信 原名獨孤如愿,字期彌頭云中郡(今內蒙古自治區和林格爾縣)人,鮮卑族西魏、北周(南北朝)時期名將,八柱國之一北塞俊郎,容儀俊美,善于騎射獨孤側帽&#xff1a…

SQL語法(DQL):SELECT 多表查詢之子查詢

1、子查詢 定義:如果某一個SQL語句A包含了一個查詢Select語句B,稱B叫做子查詢,稱A叫做主查詢,A帶有子查詢語句目的:提高代碼復用性,間接提高代碼開發效率分類: 條件子查詢:將子查詢…

開發指南042-產生待辦

整個平臺待辦是統一處理的&#xff0c;各業務微服務需要產生待辦時調用系統API <dependency><groupId>org.qlm</groupId><artifactId>qlm-api</artifactId><version>1.0-SNAPSHOT</version> </dependency> Autowired privat…

Nature Renderer 2022(植被渲染工具插件)

渲染大量詳細的植被。 自然渲染器通過替換Unity的默認地形細節和樹系統來提高植被渲染的質量。一切都適用于現有數據:使用相同的草地、植被和樹木,并保留現有地形。我們只是升級您的渲染器。 Unity驗證的解決方案 Nature Renderer受到25000多名開發人員的信任,是Unity驗證的…

Llama-2 vs. Llama-3:利用微型基準測試(井字游戲)評估大模型

編者按&#xff1a; 如何更好地評估和比較不同版本的大語言模型&#xff1f;傳統的學術基準測試固然重要&#xff0c;但往往難以全面反映模型在實際應用場景中的表現。在此背景下&#xff0c;本文作者別出心裁&#xff0c;通過讓 Llama-2 和 Llama-3 模型進行井字游戲對決&…

【JavaScript腳本宇宙】無處不在的JavaScript庫:解析音視頻處理與實時通信技術

JavaScript庫大揭秘&#xff1a;音視頻、互動體驗與實時通信 前言 在當今互聯網時代&#xff0c;JavaScript已經成為前端開發中不可或缺的一部分。隨著Web技術的不斷發展&#xff0c;出現了許多優秀的JavaScript庫&#xff0c;為開發者提供了豐富的工具和資源。本文將介紹幾個…

STM32智能機器人手臂控制系統教程

目錄 引言環境準備智能機器人手臂控制系統基礎代碼實現&#xff1a;實現智能機器人手臂控制系統 4.1 數據采集模塊 4.2 數據處理與控制算法 4.3 通信與網絡系統實現 4.4 用戶界面與數據可視化應用場景&#xff1a;機器人手臂管理與優化問題解決方案與優化收尾與總結 1. 引言 …

Linux系統中磁盤管理LVM與掛載

Linux系統中磁盤管理LVM與掛載 本文以屬于Linux系統基本概念&#xff0c;如果以查找教程教程&#xff0c;解決問題為主&#xff0c;只需要查看本文后半部分。如需要系統性學習請查看本文前半部分。 本文操作極容易導致主機無法自動重啟&#xff0c;請慎重操作。操作前務必要進…

火熱夏季:浦語*書生InternLM大模型實戰闖關-入門島之Linux基礎知識

一、ssh鏈接與端口映射并運行hello_wold.py 1.創建開發機 InternStudio創建開發機 2.進入開發機 3.Ssh鏈接開發機 powerShell終端ssh鏈接開發機。 4.創建一個hello_world.py文件web demo 5.運行web demo 6.端口映射 7.本地瀏覽器打開web 二、 VSCODE 遠程連接開發機并創建一個…

【最強八股文 -- 計算機網絡】【快速版】TCP 與 UDP 頭部格式

目標端口和源端口: 應該把報文發給哪個進程包長度: UDP 首部的長度跟數據的長度之和校驗和: 為了提供可靠的 UDP 首部和數據而設計&#xff0c;接收方使用檢驗和來檢查該報文段中是否出現差錯 源端口號和目的端口號: 用于多路復用/分解來自或送到上層應用的數據。告訴主機報文段…

[機器學習]-人工智能對程序員的深遠影響——案例分析

機器學習和人工智能對未來程序員的深遠影響 目錄 機器學習和人工智能對未來程序員的深遠影響1. **自動化編碼任務**1.1 代碼生成1.2 自動調試1.3 測試自動化 2. **提升開發效率**2.1 智能建議2.2 項目管理 3. **改變編程范式**3.1 數據驅動開發 4. **職業發展的新機遇**4.1 AI工…

數字統計

import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的區別// 注意 while 處理多個 caseint a in.nextInt();i…

基于深度學習的點云平滑

基于深度學習的點云平滑是一種利用深度學習模型處理和優化三維點云數據以消除噪聲并提升平滑度的方法。該技術在自動駕駛、機器人導航、3D重建和計算機圖形學等領域有著廣泛應用。以下是關于這一領域的系統介紹&#xff1a; 1. 任務和目標 點云平滑的主要任務是從帶有噪聲和粗…

【計算機畢業設計】基于Springboot的足球青訓俱樂部管理系統【源碼+lw+部署文檔】

包含論文源碼的壓縮包較大&#xff0c;請私信或者加我的綠色小軟件獲取 免責聲明&#xff1a;資料部分來源于合法的互聯網渠道收集和整理&#xff0c;部分自己學習積累成果&#xff0c;供大家學習參考與交流。收取的費用僅用于收集和整理資料耗費時間的酬勞。 本人尊重原創作者…

Day66 代碼隨想錄打卡|回溯算法篇---分割回文串

題目&#xff08;leecode T131&#xff09;&#xff1a; 給你一個字符串 s&#xff0c;請你將 s 分割成一些子串&#xff0c;使每個子串都是 回文串。返回 s 所有可能的分割方案。 方法&#xff1a;本題是一個分割回文串的問題&#xff0c;是回溯算法的另一類問題。 針對一個字…

前端面試題日常練-day82 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 在Sass中&#xff0c;以下哪個功能用于創建一個混合器&#xff08;Mixin&#xff09;&#xff1f; a) include b) loop c) function d) component Sass中的嵌套規則可以幫助實現以下哪個目的&#xf…

英偉達今年在華銷售額預計將達120億美元、MiniMax創始人:三年后才會出現“殺手級”AI應用

ChatGPT狂飆160天&#xff0c;世界已經不是之前的樣子。 更多資源歡迎關注 1、英偉達今年在華銷售額預計將達120億美元 芯片咨詢公司SemiAnalysis報告預估&#xff0c;今年英偉達有望在中國銷售價值約120億美元的人工智能芯片。黃仁勛曾表示&#xff0c;希望借助新的芯片使得…

【算法】十進制轉換為二進制

目的&#xff1a;將十進制轉換為二進制 思路&#xff1a; 首先我們手算的情況是通過求余數算出進制數&#xff0c;同樣代碼也是通過做除法和求余數的方式&#xff0c;除法是得出下一次的被除數&#xff0c;而求余數是得到進制數 代碼&#xff1a; #include<stdio.h>/…