目錄
1.? 環境搭建
2.? 創建項目
3.? 調試相關介紹
4.? 代碼編寫
4.1? 包含頭文件
4.2? 引腳配置
4.3? 設置輸出電平
4.4? 延時函數
4.5? 調試
1.? 環境搭建
? ? ? ? 默認已經搭建好環境,如果未搭建好可參考:
ESP32入門開發·Windows平臺下開發環境的搭建-CSDN博客
2.? 創建項目
? ? ? ? 當我們配好環境后,左邊會出現ESP-IDF的圖標,點擊圖標找到新項目向導,選擇框架,這里我只安裝了5.2.3所以就一個:
? ? ? ? 如果沒漢化就找到New Project Wizard(新項目向導):
? ? ? ? 當然除了上述方法,我們也可以按F1或者Shift+Ctrl+P喚醒上方搜索欄,搜索Nuw Project,效果是一樣的:
? ? ? ? 選擇完框架后進入如下界面,①位項目名稱,②是你所要保存的工程路徑(注意ESP-IDF 編譯系統不支持 ESP-IDF 路徑或其工程路徑中帶有空格):
? ? ? ? ③是一些esp32的芯片型號,根據自己芯片進行選擇,這里我使用的是esp32-s3的芯片:
? ? ? ? ④是一些目標芯片的選擇,根據板子的不同這里的東西也不同,根據自己需求選擇:
? ? ? ? ⑤是連接板子的COM口,看看哪個口和板子連接,這個后續可進行更改:
? ? ? ? 設定完后點擊“Choose Template”選擇模版:
? ? ? ? 選擇ESP-IDF:
? ? ? ? 下面都是一些官方示例模版,如果你想要新建一個空白的,直接如圖所示找到sample_project點擊,找到圖示Creat project using template sample_project點擊:
? ? ? ? 此時我們發現新建好了一個空白工程:
????????此時左側的相關文件功能分別為:
文件名 | 功能描述 |
.devcontainer | 和Docker相關的配置文件(系統自動生成,不需要用戶修改) |
.vscode | 和vscode相關的配置文件(系統自動生成,不需要用戶修改) |
build | 編譯項目文件(編譯項目后會自動生成,不需要用戶修改) |
main | 主程序目錄,系統自動生成的代碼 |
CMakeLists.txt | CMake配合文件,用于構建項目編譯環境 |
README.md | 項目說明文檔 |
sdkconfig | SDK配置,在這里可選擇enable/disable某一個模塊 |
? ? ? ? 隨便打一句話,編譯一下看看是否成功:
#include <stdio.h>void app_main(void)
{printf("Hellow esp32!!!\n");
}
? ? ? ? 點擊構建,燒錄和監視按鍵可以發現打印數據:
? ? ? ? 空白項目創建完成。
3.? 調試相關介紹
編號 | 功能介紹 |
1 | 當前項目 |
2 | 當前版本 |
3 | 選擇燒錄方式 |
4 | 選擇燒錄口 |
5 | 芯片設備 |
6 | SDK配置編輯器 |
7 | 清理構建的項目 |
8 | 構建項目 |
9 | 燒錄 |
10 | 監聽 |
11 | 調試 |
12 | 構建,燒錄,監聽 |
13 | 打開ESP-IDF終端 |
14 | 執行自定義任務 |
15 | 問題提示 |
4.? 代碼編寫
? ? ? ? 在代碼開始編寫前,我們最好找到ESP32-IDF相關的編程指南,方便了解引腳功能,編寫代碼:
快速入門 - ESP32-S3 - — ESP-IDF 編程指南 v5.5 文檔
? ? ? ? 找打GPIO相關的章節:
? ? ? ? 代碼就用上面創建的工程在里面來添加把。
4.1? 包含頭文件
? ? ? ? 想要調用GPIO口相關API函數需要將其頭文件包含進來:
#include "driver/gpio.h"
4.2? 引腳配置
? ? ? ? 這里我們可以參考STM32的引腳配置方便理解一些,我們在使能STM32的引腳時需要將引腳掛載到對應總線上使能時鐘,然后對GPIO口其中的一些數據進行配置,將配置好的變量傳給相關參數:
/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啟GPIOA的時鐘//使用各個外設前必須開啟時鐘,否則對外設的操作無效/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引腳,賦值為第0號引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //將賦值后的構體變量傳遞給GPIO_Init函數//函數內部會自動根據結構體的參數配置相應寄存器//實現GPIOA的初始化
? ? ? ? ESP32的GPIO口使能大同小異,不過需要注意一點的是,STM32 采用的是傳統的 ARM Cortex-M 系列架構,其外設(包括 GPIO)通常掛在不同的總線上,需要單獨使能對應總線的時鐘才能操作外設,這是為了降低功耗。但是ESP32 的外設時鐘管理機制不同,其 GPIO 等常用外設的時鐘在芯片上電后默認是使能的,不需要用戶手動開啟。
? ? ? ? 因此這里我們只要定義結構體變量,并且賦值即可,這里我們需要調用 gpio_config_t 函數:
// 配置GPIO引腳gpio_config_t io_conf;io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 設置要配置的引腳io_conf.mode = GPIO_MODE_OUTPUT;// 設置為輸出模式io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉電阻io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉電阻io_conf.intr_type = GPIO_INTR_DISABLE;// 中斷模式不使用式不使用
解釋:
? ? ? ? 第一行代碼結構體聲明沒少好說的,引腳配置,在 ESP32-IDF 的gpio_config_t結構體中,pin_bit_mask采用位掩碼(bitmask) 方式來指定需要配置的 GPIO 引腳,其中的位掩碼設計思路:
- 每個 bit 代表一個 GPIO 引腳,bit 位置與 GPIO 編號對應
- 當某個 bit 被設置為 1 時,表示需要配置對應的 GPIO 引腳
- 例如:1ULL << GPIO_NUM_0 表示只配置 GPIO0
- 若要同時配置多個引腳,可以這樣寫:(1ULL << GPIO_NUM_0) | (1ULL << GPIO_NUM_2) | (1ULL << GPIO_NUM_4)
ULL表示無符號長整型(64 位),確保在移位操作時不會發生溢出。
如果要同時配置 GPIO0、GPIO2 和 GPIO4,代碼可以寫成:
io_conf.pin_bit_mask = (1ULL << GPIO_NUM_0) | (1ULL << GPIO_NUM_2) | (1ULL << GPIO_NUM_4);
? ? ? ? 對于模式配置,根據需求,使能就是ENABLE,失能就是DISABLE,這里就配置一個輸出其他都不要,因此全是DISABLE,可以自己跳轉到定義查看:
? ? ? ? 配置完后將參數寫入,調用函數 gpio_config :
? ? ? ? 其實除了缺了個使能這里和STM32差不多:
#include <stdio.h>
#include "driver/gpio.h"void app_main(void)
{// 配置GPIO引腳gpio_config_t io_conf;io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 設置要配置的引腳io_conf.mode = GPIO_MODE_OUTPUT;// 設置為輸出模式io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉電阻io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉電阻io_conf.intr_type = GPIO_INTR_DISABLE;// 中斷模式不使用// 配置GPIOgpio_config(&io_conf);
}
4.3? 設置輸出電平
? ? ? ? 我們知道在STM32當中是通過 GPIO_ResetBits 和?GPIO_SetBits 來控制電平的高低的:
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為低電平Delay_ms(500); //延時500msGPIO_SetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為高電平Delay_ms(500); //延時500ms
? ? ? ? 在ESP32-IDF當中,是通過?gpio_set_level 來控制的:
gpio_set_level(GPIO_NUM_1, 1); // 設置GPIO0為高電平
? ? ? ? 此時的代碼:
#include <stdio.h>
#include "driver/gpio.h"void app_main(void)
{// 配置GPIO引腳gpio_config_t io_conf;io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 設置要配置的引腳io_conf.mode = GPIO_MODE_OUTPUT;// 設置為輸出模式io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉電阻io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉電阻io_conf.intr_type = GPIO_INTR_DISABLE;// 中斷模式不使用// 配置GPIOgpio_config(&io_conf);gpio_set_level(GPIO_NUM_1, 1); // 設置GPIO0為高電平
}
4.4? 延時函數
? ? ? ? 這里我使用FreeRTOS的延時函數,因此需要將FreeRTOS頭文件引入進來:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
? ? ? ? 調用延時函數 vTaskDelay 延時500ms:
vTaskDelay(500/portTICK_PERIOD_MS); // 延時500毫秒,portTICK_PERIOD_MS是FreeRTOS的時間基數(通常為1ms)
? ? ? ? 此時完整代碼:
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"void app_main(void)
{// 配置GPIO引腳gpio_config_t io_conf;io_conf.pin_bit_mask = (1ULL << GPIO_NUM_1); // 設置要配置的引腳io_conf.mode = GPIO_MODE_OUTPUT;// 設置為輸出模式io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 禁用下拉電阻io_conf.pull_up_en = GPIO_PULLUP_DISABLE;// 禁用上拉電阻io_conf.intr_type = GPIO_INTR_DISABLE;// 中斷模式不使用// 配置GPIOgpio_config(&io_conf);while (1){gpio_set_level(GPIO_NUM_1, 1); // 設置GPIO0為高電平 printf("LED_ON!!!\r\n"); vTaskDelay(500/portTICK_PERIOD_MS); // 延時500毫秒,portTICK_PERIOD_MS是FreeRTOS的時間基數(通常為1ms)gpio_set_level(GPIO_NUM_1, 0); // 設置GPIO0為高電平 printf("LED_OFF!!!\r\n"); vTaskDelay(500/portTICK_PERIOD_MS); // 延時500毫秒,portTICK_PERIOD_MS是FreeRTOS的時間基數(通常為1ms)}
}
4.5? 調試
? ? ? ? 下載調試看一下:
? ? ? ? 可以看到燈閃爍,數據也交替打印:
? ? ? ? 這里放不了視頻,就只能通過Printf打印來看了,等之后研究研究,更多使用可以參考下方鏈接。
ESP32入門開發·Windows平臺下開發環境的搭建-CSDN博客
ESP32學習筆記_時光の塵的博客-CSDN博客