esp32的按鍵中斷
0、前期準備
1、參考上一篇文章搭建好esp32環境
2、準備好一塊esp32開發開發板(本作者使用了esp32c3作為開發平臺)
1、知識儲備
消息隊列:在RTOS中,常用于任務之間或者是中斷與任務之間的數據交換。具有特點是:先入入先出,類似我們平時排隊進園區旅游,排在前面總是首先進入里面。
在FreeRTOS中,消息隊列用的函數有以下幾個:
- 用于創建消息隊列
? xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize )
? 參數如下:
uxQueueLength:隊列最大長度
uxItemSize:數據體的數據大小,注意:隊列中每個數據體的大小必須要保存一致
- 用于讀取消息隊列
? portBASE_TYPE xQueueReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait )
? 參數如下:
pxQueue:隊列句柄,其值為xQueueCreate放回值,類型為:xQueueHandle
pvBuffer:數據指針用于指向出隊的數據地址
xTicksToWait:任務中斷并等待隊列中可用空間的最大時間。若設置為0且隊列為空時,調用立刻返回。如果要設置具體時間可以用(時間/portTICK_RATE_MS)公式來獲取具體時間。又若設置為( portMAX_DELAY) 將導致任務阻塞
- 用于寫入消息隊列
? portBASE_TYPE xQueueSendFromISR(xQueueHandle pxQueue,const void *pvItemToQueue,portBASE_TYPE *pxHigherPriorityTaskWoken);
? 參數如下:
pxQueue:隊列句柄,其值為xQueueCreate放回值,類型為:xQueueHandle
pvItemToQueue:要存入隊列的數據的指針,數據類型要和xQueueCreate初始化的數據類型一樣
pxHigherPriorityTaskWoken:如果數據入隊使任務解鎖,并且解鎖的任務的優先級高于當前運行任務的優先級xQueueSendFromISR將設置*pxHigherPriorityTaskWoken到 pdTRUE 。如果xQueueSendFromISR()設置這個值到 pdTRUE,那么在中斷退出的時候將會進行任務切換。
ESP32中斷
? ESP32-C3芯片具有硬件濾波器,可去除輸入GPIO中不需要的毛刺脈沖,這有助于減少中斷的錯誤觸發。
中斷函數介紹
- 中斷服務注冊函數
? esp_err_t gpio_install_isr_service( int intr_alloc_flags )
? 函數說明
? 使用該函數,ISR服務將提供全局GPIO的ISR,并通過gpio_isr_handler_add()函數注冊各個引腳處理程序
? 參數如下:
intr_alloc_flags:中斷的類型
- GPIO中斷注冊函數
? esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num,gpio_isr_t isr_handler,void * args )
? 函數說明
? 用于為相應的GPIO引腳添加中斷處理函數
? 參數如下:
gpio_num:GPIO引腳號
isr_handler:中斷處理函數名
args:往中斷函數傳遞的參數
2、新建工程
idf.py create-project project_led # 新建工程
cd project_key
idf.py set-target esp32c3 # 設置工程使用的芯片
3、查看原理圖確定按鍵控制引腳
經查閱原理圖,確定led的引腳為gpio_19,讀者需根據自身開發板來修改引腳
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;
//配置模式 輸入 下降沿觸發中斷
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);
//創建消息隊列、注冊中斷函數
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+] 可以退出監視窗口
idf.py -p /dev/ttyUSB0 flash monitor
審核編輯:湯梓紅
-
FreeRTOS
+關注
關注
12文章
484瀏覽量
62143 -
按鍵中斷
+關注
關注
0文章
15瀏覽量
6445 -
ESP32
+關注
關注
18文章
971瀏覽量
17201
發布評論請先 登錄
相關推薦
評論