ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁
生活随笔
收集整理的這篇文章主要介紹了
ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、前言
- 二、VSCODE + ESP-IDF
- 2.1、快速創建項目
- 2.2、選擇串口通道,ESP芯片型號
- 三、代碼
- 3.1、main.c
- 3.1.1、頭文件
- 3.1.2、全局變量
- 3.1.3、app_main( )函數
- 3.2、實驗代碼
- 四、相關API
- 4.1、gpio_reset_pin(gpio_num_t gpio_num)
- 4.2、gpio_set_direction(gpio_num_t gpio_num,gpio_mode_t mode)
- 4.3、gpio_set_level(gpio_num_t gpio_num, uint32_t level)
- 4.4、vTaskDelay(const TickType_t xTicksToDelay)
一、前言
我使用的硬件:
嵌入式軟件開發從來都不是從hello world開始,而是從GPIO驅動LED閃爍開始。
本次實驗的目的是使用GPIO26與GPIO27各驅動一個LED燈,以300ms的時間間隔閃爍。
ESP-IDF Monitor打印出來的調試信息:
需要注意??:
二、VSCODE + ESP-IDF
2.1、快速創建項目
2.2、選擇串口通道,ESP芯片型號
創建項目模塊成功,代碼成功被編譯。
三、代碼
3.1、main.c
3.1.1、頭文件
- ESP-IDF是基于freertos的SDK,所以需要包含FreeRTOS.h頭文件與task.h頭文件。
- 使用ESP_LOGI( )函數打印一些調試信息,所以包含esp_log.h頭文件。
- 使用GPIO,所以包含driver/gpio.h。
3.1.2、全局變量
3.1.3、app_main( )函數
- 第一步通過gpio_reset_pin( )函數初始化引腳。
- 第二步通過gpio_set_direction( )函數將對應的GPIO口設置為輸出。
- 第三步通過gpio_set_level( )函數將電平輸出到pin腳上。
3.2、實驗代碼
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h"static uint8_t s_led_state = 0; static const char *TAG = "first_example";void app_main(void) {ESP_LOGI(TAG, "Example configured to blink GPIO LED!");/* 復位GPIO的狀態 */gpio_reset_pin(26);gpio_reset_pin(27);/* 設置GPIO為輸出模式 */gpio_set_direction(26,GPIO_MODE_OUTPUT);gpio_set_direction(27,GPIO_MODE_OUTPUT);while(1){ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");gpio_set_level(26,s_led_state); /* GPIO26輸出電平 */gpio_set_level(27,s_led_state); /* GPIO27輸出電平 */s_led_state = !s_led_state; /* 取反LED的狀態 */vTaskDelay(300 / portTICK_PERIOD_MS); /* 延時300ms */} }四、相關API
esp官方網址:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/gpio.html
4.1、gpio_reset_pin(gpio_num_t gpio_num)
這個函數用于重置mcu引腳的狀態,值得注意的是引腳被重置后會使能“上拉”。
4.2、gpio_set_direction(gpio_num_t gpio_num,gpio_mode_t mode)
這個函數用于設置mcu引腳的功能(輸入或者輸出,或者即是輸入又是輸出)。
4.3、gpio_set_level(gpio_num_t gpio_num, uint32_t level)
gpio_set_level(GPIO_NUM_16,0); //gpio16輸出低電平 gpio_set_level(GPIO_NUM_16,1); //gpio16輸出高電平4.4、vTaskDelay(const TickType_t xTicksToDelay)
沒有學習過rtos的同學可以認為它是一個延時函數。學過rtos的同學其實知道它會啟動rtos的調度器,將CPU的執行權交給其他線程,等待一段時間后回來繼續執行代碼。
至于為什么以下代碼會延時300ms,是因為freeRTOS的滴答定時器的頻率被設置為1000Hz。
vTaskDelay(300 / portTICK_PERIOD_MS); /* 延時300ms */總結
以上是生活随笔為你收集整理的ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农产品加工进销存单_农产品进销存ERP—
- 下一篇: 谷歌浏览器调用本地exe_无需修改前端和