0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

[esp32教程]2、按鍵中斷

板凳說 ? 來源:板凳說 ? 作者:板凳說 ? 2023-05-05 09:04 ? 次閱讀

esp32的按鍵中斷

0、前期準(zhǔn)備

1、參考上一篇文章搭建好esp32環(huán)境

2、準(zhǔn)備好一塊esp32開發(fā)開發(fā)板(本作者使用了esp32c3作為開發(fā)平臺)

1、知識儲備

消息隊列:在RTOS中,常用于任務(wù)之間或者是中斷與任務(wù)之間的數(shù)據(jù)交換。具有特點是:先入入先出,類似我們平時排隊進園區(qū)旅游,排在前面總是首先進入里面。
FreeRTOS中,消息隊列用的函數(shù)有以下幾個:
  • 用于創(chuàng)建消息隊列

? xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize )

? 參數(shù)如下:

uxQueueLength:隊列最大長度
uxItemSize:數(shù)據(jù)體的數(shù)據(jù)大小,注意:隊列中每個數(shù)據(jù)體的大小必須要保存一致
  • 用于讀取消息隊列

? portBASE_TYPE xQueueReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait )

? 參數(shù)如下:

pxQueue:隊列句柄,其值為xQueueCreate放回值,類型為:xQueueHandle
    pvBuffer:數(shù)據(jù)指針用于指向出隊的數(shù)據(jù)地址
    xTicksToWait:任務(wù)中斷并等待隊列中可用空間的最大時間。若設(shè)置為0且隊列為空時,調(diào)用立刻返回。如果要設(shè)置具體時間可以用(時間/portTICK_RATE_MS)公式來獲取具體時間。又若設(shè)置為( portMAX_DELAY) 將導(dǎo)致任務(wù)阻塞
  • 用于寫入消息隊列

? portBASE_TYPE xQueueSendFromISR(xQueueHandle pxQueue,const void *pvItemToQueue,portBASE_TYPE *pxHigherPriorityTaskWoken);

? 參數(shù)如下:

pxQueue:隊列句柄,其值為xQueueCreate放回值,類型為:xQueueHandle
    pvItemToQueue:要存入隊列的數(shù)據(jù)的指針,數(shù)據(jù)類型要和xQueueCreate初始化的數(shù)據(jù)類型一樣
    pxHigherPriorityTaskWoken:如果數(shù)據(jù)入隊使任務(wù)解鎖,并且解鎖的任務(wù)的優(yōu)先級高于當(dāng)前運行任務(wù)的優(yōu)先級xQueueSendFromISR將設(shè)置*pxHigherPriorityTaskWokenpdTRUE 。如果xQueueSendFromISR()設(shè)置這個值到 pdTRUE,那么在中斷退出的時候?qū)M行任務(wù)切換。
ESP32中斷

? ESP32-C3芯片具有硬件濾波器,可去除輸入GPIO中不需要的毛刺脈沖,這有助于減少中斷的錯誤觸發(fā)。

中斷函數(shù)介紹

  • 中斷服務(wù)注冊函數(shù)

? esp_err_t gpio_install_isr_service( int intr_alloc_flags )

? 函數(shù)說明

? 使用該函數(shù),ISR服務(wù)將提供全局GPIO的ISR,并通過gpio_isr_handler_add()函數(shù)注冊各個引腳處理程序

? 參數(shù)如下:

intr_alloc_flags:中斷的類型
  • GPIO中斷注冊函數(shù)

? esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num,gpio_isr_t isr_handler,void * args )

? 函數(shù)說明

? 用于為相應(yīng)的GPIO引腳添加中斷處理函數(shù)

? 參數(shù)如下:

gpio_num:GPIO引腳號
    isr_handler:中斷處理函數(shù)名
    args:往中斷函數(shù)傳遞的參數(shù)

2、新建工程

idf.py create-project project_led # 新建工程
cd project_key
idf.py set-target esp32c3 # 設(shè)置工程使用的芯片

3、查看原理圖確定按鍵控制引腳

key.png

經(jīng)查閱原理圖,確定led的引腳為gpio_19,讀者需根據(jù)自身開發(fā)板來修改引腳

4、編寫程序

#include 

#include 
#include 
#include 

#include 

#define KEY_PIN GPIO_NUM_9
static QueueHandle_t key_queue = NULL;

static void IRAM_ATTR key_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;
    xQueueSendFromISR(key_queue, &gpio_num, NULL);
}

void app_main(void)
{
    uint32_t gpio_num;
    //配置模式 輸入 下降沿觸發(fā)中斷
    gpio_config_t cfg = {
        .mode = GPIO_MODE_INPUT,
        .pin_bit_mask = 1ULL << KEY_PIN,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLUP_DISABLE,
        .intr_type = GPIO_INTR_POSEDGE,
    };

    gpio_config(&cfg);
    //創(chuàng)建消息隊列、注冊中斷函數(shù)
    key_queue = xQueueCreate(10, sizeof(uint32_t));
    gpio_install_isr_service(0);
    gpio_isr_handler_add(KEY_PIN, key_isr_handler, (void *)KEY_PIN);

    while (pdTRUE)
    {
        //
        if (xQueueReceive(key_queue, &gpio_num, portMAX_DELAY))
        {
            printf("key is down\\\\\\\\n");
        }
    }
    
}

5、編譯下載

#編譯
idf.py build
#燒錄以及查看日志,使用ctrl+] 可以退出監(jiān)視窗口
idf.py -p /dev/ttyUSB0 flash monitor

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62181
  • 按鍵中斷
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    6448
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    971

    瀏覽量

    17276
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32-C2 ESP8684芯片AT固件使用

    ESP32-C2 ESP8684芯片AT固件使用
    的頭像 發(fā)表于 07-27 13:48 ?3719次閱讀
    <b class='flag-5'>ESP32-C2</b> <b class='flag-5'>ESP</b>8684芯片AT固件使用

    ESP32模組的主要特性

    ●?ESP32-WROOM-32D ●?ESP32-WROOM-32U ●?ESP32-SOLO-1 模組 ●?ESP32-WROVER ●?ES
    發(fā)表于 11-04 14:54 ?4011次閱讀

    ESP32開發(fā)套件 ESP32-DevKitC

    ,具備豐富的外設(shè)和優(yōu)化的引腳布局,助力用戶快速實現(xiàn)產(chǎn)品開發(fā),它有4MB Flash,有I/O,USB以及按鍵、LED ? 支持 Wi-Fi 藍牙連接 ESP32-DevKitC 是一款基于 ESP32
    的頭像 發(fā)表于 01-06 16:55 ?8416次閱讀

    ESP32 開發(fā)之旅② Arduino For ESP32說明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫3.與ESP8266庫類比3.1 WiFi ——
    發(fā)表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開發(fā)之旅② Arduino For <b class='flag-5'>ESP32</b>說明

    ESP32ESP-IDF 教學(xué)(三)——通用硬件定時器(Timer)

    ESP32ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時器(Timer)】文章目錄ESP32ESP-IDF 學(xué)習(xí)筆記(三)【通用硬件定時器(Timer)】通用硬件定時器(Ti
    發(fā)表于 11-26 11:36 ?37次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(三)——通用硬件定時器(Timer)

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)

    使用簡介二、使用 UART 收發(fā)數(shù)據(jù)1、設(shè)置 UART 參數(shù)① 單步法(結(jié)構(gòu)體法)② 分步法2、分配引腳,安裝驅(qū)動二、使用 UART 事件三、自定義 UART 中斷一、ESP32 的 UART 概覽
    發(fā)表于 11-26 13:21 ?44次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(九)—— 串口通信(UART)

    [ESP32]學(xué)習(xí)筆記02

    [ESP32學(xué)習(xí)筆記02]使用ViusalStudio2017開發(fā)ESP32按鍵輸入檢測前言一、安裝Visual Studio 2017二、配置開發(fā)環(huán)境1.安裝ViusalGDB2.
    發(fā)表于 12-03 17:36 ?23次下載
    [<b class='flag-5'>ESP32</b>]學(xué)習(xí)筆記02

    esp32學(xué)習(xí)之按鍵檢測gpio中斷

    esp32學(xué)習(xí)之gpio中斷前言流程選定gpiogpio配置設(shè)置回調(diào)函數(shù)注冊中斷處理程序前言最近在做一個按鍵檢測,按鍵檢測有兩種方法,一種是
    發(fā)表于 12-04 16:21 ?14次下載
    <b class='flag-5'>esp32</b>學(xué)習(xí)之<b class='flag-5'>按鍵</b>檢測gpio<b class='flag-5'>中斷</b>

    ESP32系列芯片的規(guī)格

    ESP32是一款2.4GHz Wi-Fi和藍牙組合芯片,采用TSMC超低功耗40nm設(shè)計技術(shù)它旨在實現(xiàn)最佳功率和射頻性能,顯示出魯棒性、多功能性和靈活性在各種應(yīng)用和電源場景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    發(fā)表于 04-25 16:21 ?7次下載

    ESP32 S2 SOLO/ESP32 S2 SOLO U技術(shù)規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《ESP32 S2 SOLO/ESP32 S2 SOLO U技術(shù)規(guī)格書.pdf》資料免費下載
    發(fā)表于 09-23 14:57 ?0次下載
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> SOLO/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> SOLO U技術(shù)規(guī)格書

    ESP32 S2 WROVER/ESP32 S2 WROVER I技術(shù)規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《ESP32 S2 WROVER/ESP32 S2 WROVER I技術(shù)規(guī)格書.pdf》資料免費下載
    發(fā)表于 09-23 11:48 ?2次下載
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROVER/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROVER I技術(shù)規(guī)格書

    ESP32 S2 WROOM/ESP32 S2 WROOM I技術(shù)規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《ESP32 S2 WROOM/ESP32 S2 WROOM I技術(shù)規(guī)格書.pdf》資料免費下載
    發(fā)表于 09-23 11:31 ?4次下載
    <b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROOM/<b class='flag-5'>ESP32</b> S<b class='flag-5'>2</b> WROOM I技術(shù)規(guī)格書

    ESP32C2如何使用AT固件

    ESP32C2如何使用AT固件
    的頭像 發(fā)表于 12-12 13:58 ?3088次閱讀
    <b class='flag-5'>ESP32C2</b>如何使用AT固件

    ESP32-C2 8684 AT固件

    ESP32-C2模組 ESP8684芯片 智能家居設(shè)備開發(fā)模組
    的頭像 發(fā)表于 07-03 13:41 ?867次閱讀
    <b class='flag-5'>ESP32-C2</b>  8684  AT固件

    如何使用MicroPython和ESP32來編寫按鍵程序?

    首先,我們需要將LED燈、電阻和開關(guān)、ESP32連接起來。
    的頭像 發(fā)表于 11-08 12:35 ?1890次閱讀
    如何使用MicroPython和<b class='flag-5'>ESP32</b>來編寫<b class='flag-5'>按鍵</b>程序?