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è)置*pxHigherPriorityTaskWoken到 pdTRUE 。如果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、查看原理圖確定按鍵控制引腳
經(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
審核編輯:湯梓紅
-
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62181 -
按鍵中斷
+關(guān)注
關(guān)注
0文章
15瀏覽量
6448 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17276
發(fā)布評論請先 登錄
相關(guān)推薦
評論