《ESP32-S3使用指南—IDF版 V1.6》第六章 新建基礎工程

第六章 新建基礎工程

在前面的章節中,我們已經簡要介紹了ESP32-S3的基礎知識和ESP-IDF的基本概念,并詳細闡述了VS Code IDE環境的搭建以及Espressif插件的安裝流程。現在,基于這些前期準備,我們將在本章搭建一個ESP-IDF基礎工程,以后的例程都是基于此基礎例程為模版來編寫的。

本章將分為如下幾個小節:

6.1 搭建基礎工程

6.2 基礎工程的文件架構解析

6.3 樂鑫工程的文件架構解析

6.4 原子工程的文件架構解析

6.5 基礎工程配置

6.1 搭建基礎工程

在VS Code中新建ESP-IDF基礎工程的步驟如下:

1,啟動VS Code并打開命令面板

按下“Ctrl+Shift+P”快捷鍵打開命令面板,并在搜索欄內輸入“新建項目”,如下圖所示:

圖6.1.1 新建項目工程

2,配置工程參數

圖6.1.1回車進入新建工程配置界面,如下圖所示:

圖6.1.2 新建工程界面(下圖是作者配置的參數)
圖6.1.2 新建工程界面(下圖是作者配置的參數)

3,選擇模版工程

配置參數填寫完成后,點擊上圖中的“Choose Template”選項,將進入選擇模版界面。在這個界面上,您會發現許多應用實例可供選擇(這些示例可以在路徑D:\ESP32\Espressif\frameworks\esp-idf-v5.1.2\examples下找到)。為了新建工程,您可以采用某個應用示例作為模版,例如,若以樂鑫Blink跑馬燈實驗為模版,那么新創建的工程將具備LED使用功能。下面作者以sample_project為模版新建工程(因為此工程是樂鑫官方提供的基本模板,所以我們使用此模板來新建工程),如下圖所示:

圖6.1.3 以blink模版新建工程

點擊“Createproject using template sample_project”選項新建工程,點擊完成后在此界面的右下角跳出以下信息,如下所示:

圖6.1.4 是否覆蓋內容

我們點擊“Yes”選項即可完成新建工程。此時VS Code的資源管理器區域內顯示我們的新建工程,如下圖所示:

圖6.1.5 新建00_BASIC工程完成

00_BASIC工程與樂鑫官方提供的sample_project示例是一樣的內容和工程結構,讀者不妨對比一下這兩個工程。

在下小節中,作者將講述00_BASIC工程的文件作用。

6.2 基礎工程的文件架構解析

上圖6.1.5中,.devcontainer 和 .vscode 文件夾在 VS Code 的使用場景中各自扮演著不同的角色。

.devcontainer 文件夾通常與 VS Code 的 Remote - Containers 擴展一起使用,用于定義開發容器環境的配置。這個文件夾包含了用于創建和管理容器化開發環境的所有必需文件。

.vscode 文件夾通常位于項目的根目錄下,用于存放 VS Code 的項目級設置和擴展配置。這個文件夾中的文件不會影響其他用戶或全局的 VS Code 設置,它們只針對當前項目有效在 .vscode 文件夾中,常見的文件包括:

①:settings.json。用于定義項目特定的 VS Code 設置(個性配置和工作環境配置)。

②:tasks.json。用于定義任務,這些任務可以在 VS Code 的終端中運行,或者與編輯器中的其他功能(如代碼片段)結合使用。

③:launch.json。用于配置調試器,包括啟動配置和斷點等。

④:c_cpp_properties.json。這個文件用于定義 C 和 C++ 項目的編譯器路徑、包含路徑、編譯器定義以及其他與 IntelliSense 相關的設置。

上述文件都是VSCode自動生成的,不需要人為去編寫。但是在某種特殊情況下需要人為介入,如代碼調試(需要修改launch.json)、編譯錯誤(需要修改c_cpp_properties.json)和個性配置(需要修改settings.json)等。剩下的文件就是sample_project(00_BASIC)工程的文件結構,如下圖所示:

圖6.2.1 00_BASIC工程的文件結構和說明

樂鑫為開發者提供了最基礎的項目工程,即sample_project。正點原子則以這一工程為模板去編寫其他的應用示例。因此,關于這一基礎工程文件的具體作用,讀者可在第四章的4.4小節中詳細了解。為避免重復,此處不再贅述。

6.3 調試相關工具介紹

在6.1小節中,作者已經在VS Code環境下新建一個00_BASIC工程,下面我們重點來講解VS Code軟件提供用戶調試相關的工具有哪些,如下所示:

圖6.3.1 調試相關工具

1,選擇串口(插頭):即連接開發板的下載串口號,VS會列出當前連接電腦的所有串口讓你選擇,這個會記錄,再新打開VSCode不用重新選擇,開發過程中盡量不要更換USB線的電腦插口,否則串口號會變。

2,選擇目標芯片:對應idf命令idf.pyset-target xxxx。即你當前這個工程是要下載到什么芯片上面,如ESP32 S2,S3,C2,C3等等,工程要與芯片相匹配,這個選擇是寫入當前工程配置的,一般不用更改,工程下配置文件基本已經選擇好的。

3,選擇當前工程目錄(文件夾):也不用修改,一般打開工程時會默認操作都在這個工程目錄下。

4,工程配置菜單(齒輪):對應idf命令idf.pymenuconifg,用來配置當前工程的一些設置,配置項非常多,建議使用到再修改。一般代碼工程都是配置好的,且不用修改。

5,清除工程(垃圾桶):清除工程編譯文件,一般用于壓縮拷貝工程文件時用到,清除后工程目錄占用空間會占用非常小,KB級,編譯后為百MB級,還有一些編譯過程中奇奇怪怪的問題也可以先清除編譯后再編譯。

6,編譯工程(圓柱體):編譯當前工程,只是編譯,沒有下載功能。

7,選擇下載模式(五角星):一般都是選擇串口UART方式下載。

8,下載(閃電):下載編譯好的固件到設備芯片上,這里只是下載,沒有編譯功能,修改代碼后要先編譯再點這個下載,所做的修改才有效。

9,串口監控(小電視):打開與設備連接的串口,打印設備串口信息。

10,編譯/下載/監控(一團火):最常用的一個,它將編譯下載和打開串口監控做在了一起,點一次全部搞定。

11,打開命令行:打開命令行窗口,且會定位在當前項目路徑下,可以執行idf的一些命令。

12,執行自定義任務:不使用。

13,工程的錯誤與警告提示。

以上是ESP-IDF插件提供的調試工具,一般我們只用到1、2、4、5、6和8即可完成程序開發。ESP32-S3有兩種下載方式。首先是USB串口下載,這種方式主要用于代碼下載,但無法用于代碼調試。另一種則是JTAG(USB口)下載,它不僅能用于下載代碼,還支持代碼調試。接下來,作者將詳細解釋這兩種下載方式。

6.3.1 串口下載

下面,作者以6.1小節新建工程(00_BASIC)為例,簡單講解一下工程的下載流程,如下流程所示。

①:使用USB線的Type-C接口連接DNESP32S3開發板的USB串口,并USB A口連接到電腦,使得電腦與開發板建立連接。

②:在設備管理器中,查看USB串口的端口號,并在VS Code軟件左下角調試區域設置端口號(插頭)。

③:點擊“Set Espressif Device Target”選擇目標芯片,這里我們選擇ESP32-S3.

④:選擇“select flash Method”下載方式(五角星),如UART或者JTAG

⑤:點擊“Full Clean”擦除工程(垃圾桶)。

⑥:點擊“Build Project”編譯工程(圓柱形)。

⑦:編譯完成后,點擊“ESP-IDF: Flash Device”下載代碼(閃電)。

編譯工程成功后,工程目錄下出現build文件夾,這個文件夾是由ESP-IDF編譯器生產的文件,如log、固件、map等下載和調試文件。如下圖所示:

圖6.3.1.1 編譯輸出文件(部分截圖)

編譯完成后,VSCode軟件底部的Build Output窗口會輸出編譯信息,如下圖所示:

圖6.3.1.2 編譯00_BASIC工程

由上圖可以看到,當出現以上信息后便證明工程編譯成功,這個過程可能會持續2~3分鐘,快的話1分鐘也是可以的(電腦配置越高,編譯就越快),請您耐心等待。

上圖中也可以查到本次編譯的許多信息,這里介紹終端界面下的幾個重要信息:

①:Used staticIRAM:為了與 ESP32-S3 目標兼容,保留了這些選項,當前讀取為54146 bytes(.text size + .vectors size)

②:.text size:文本占用空間大小(53119bytes)

③:.vectorssize:矢量大小(1027bytes)

④:Used statD/IRAM:這是內部 RAM 的總使用量,靜態 DRAM .data + .bss 的總和,以及應用程序用于可執行代碼的靜態 IRAM(指令 RAM)。可用大小是運行時作為堆內存可用的 DRAM 的估計量(由于元數據開銷和實現限制,以及 ESP-IDF 在啟動期間完成的堆分配,啟動時的實際可用堆將低于此值)。

⑤:.data size:是靜態分配的 RAM,在啟動時分配給非零值。這在運行時使用 RAM (DRAM),并且還使用二進制文件中的空間。

⑥:.bss size:是靜態分配的 RAM,在啟動時分配為零。這在運行時使用 RAM(DRAM),但不使用二進制文件中的任何空間。

⑦:Used Flashsize:這表示項目在編譯后將使用的Flash內存的大小,但不包括DRAM和IRAM的使用量。

⑧:.text:這部分用于表示.text的Flash大小。

⑨:.rodata:這部分用于表示.rodata的Flash大小。

⑩:Total imagesize:是二進制文件的預估總大小。

編譯成功后,點擊圖6.3.1閃電圖標就可以把編譯出來的可執行文件燒錄至ESP32S3開發板上,如下圖所示:

圖6.3.1.3 下載程序至開發板中

6.3.2 JTAG下載與調試

本小節的內容是參考樂鑫ESP-IDF編程指南的JTAG 調試章節。

ESP32-S3內置JTAG電路,因此無需額外芯片即可實現調試功能。通過簡單地將USB線連接到其D+/D-引腳,即可輕松完成下載與調試操作。利用JTAG接口,開發人員能夠運用開源工具OpenOCD對ESP32-S3進行調試。OpenOCD專為嵌入式系統開發和調試設計,可連接到目標硬件的調試接口(如JTAG或SWD),支持調試、固件燒寫等硬件相關任務。根據樂鑫官方資料,JTAG下載提供兩種方式:一種為直接利用內置的JTAG電路進行調試;另一種則是借助樂鑫官方推出的ESP-PROG調試器,它集成了自動下載固件、串口通信以及JTAG在線調試等多項功能。此外,在VSCode中安裝OpenOCD時,它會自動為我們配置好所需環境,使得我們可以直接使用內置的JTAG電路和VS Code中的OpenOCD來下載與調試ESP32-S3芯片,進一步簡化了開發流程。

1,前期準備

JTAG下載與調試之前,我們必須修改launch.json和settings.json這兩個文件。其中launch.json文件用來配置調試器。

①:進入樂鑫官方提供的VSCode調試配置文件launch.json網址。在該網址下,有詳細的說明指導我們如何根據使用JATG調試器或使用VS Code進行調試,來相應地修改launch.json的內容。由于我們選擇使用VS Code進行調試,因此launch.json的修改內容如下。

{

? ? "version": "0.2.0",

? ? "configurations": [

? ?? ?{

? ?? ? "name": "GDB",

? ?? ? "type": "cppdbg",

? ?? ? "request": "launch",

? ?? ? "MIMode": "gdb",

? ?? ? "miDebuggerPath": "${command:espIdf.getXtensaGdb}",

? ?? ? "program": "${workspaceFolder}/build/${command:espIdf.getProjectName}.elf",

? ?? ? "windows": {

? ?? ?? ?"program": "${workspaceFolder}\\build\\${command:espIdf.getProjectName}.elf"

? ?? ? },

? ?? ? "cwd": "${workspaceFolder}",

? ?? ? "environment": [{ "name": "PATH", "value": "${config:idf.customExtraPaths}" }],

? ?? ? "setupCommands": [

? ?? ?? ?{ "text": "targetremote :3333" },

? ?? ?? ?{ "text": "set remote hardware-watchpoint-limit2"},

? ?? ?? ?{ "text": "mon resethalt" },

? ?? ?? ?{ "text": "thbapp_main" },

? ?? ?? ?{ "text": "flushregs" }

? ?? ? ],

? ?? ? "externalConsole": false,

? ?? ? "logging": {

? ?? ?? ?"engineLogging": true

? ?? ? }

? ?? ?}

? ? ]

}

②:在settings.json文件下找到"idf.openOcdConfigs"配置選項,我們把該選項的內容修改為一下內容。

"idf.openOcdConfigs": [

? ? "interface/ftdi/esp32_devkitj_v1.cfg",

? ? "target/esp32.cfg"

],

修改為:

"idf.openOcdConfigs": [

? ? "board/esp32s3-builtin.cfg",

],

到了這里,我們已經配置VSCode OpenOCD完成,下面作者來講解使用JTAG下載與調試操作。

③:cpp_properties.json文件下添加以下紅色內容,解決編譯過程中總會出現某些文件無法找到頭文件的錯誤信息提醒(有時會是警告)。

{

? ? "configurations": [

? ?? ? {

? ?? ?? ???"name": "ESP-IDF",

? ?? ?? ???"includePath": [

? ?? ?? ?? ?? ? "${config:idf.espIdfPath}/components/**",

? ?? ?? ?? ?? ? "${config:idf.espIdfPathWin}/components/**",

? ?? ?? ?? ?? ? "${config:idf.espAdfPath}/components/**",

? ?? ?? ?? ?? ? "${config:idf.espAdfPathWin}/components/**",

? ?? ?? ?? ?? ? "${config:idf.espAdfPathWin}/components/**",

? ?? ?? ?? ?? ? "${workspaceFolder}/**"

? ?? ?? ???],

? ?? ?? ???"browse": {

? ?? ?? ?? ?? ? "path": [

? ?? ?? ?? ?? ?? ???"${config:idf.espIdfPath}/components",

? ?? ?? ?? ?? ?? ???"${config:idf.espIdfPathWin}/components",

? ?? ?? ?? ?? ?? ???"${config:idf.espAdfPath}/components/**",

? ?? ?? ?? ?? ?? ???"${config:idf.espAdfPathWin}/components/**",

? ?? ?? ?? ?? ?? ???"${workspaceFolder}"

? ?? ?? ?? ?? ? ],

? ?? ?? ?? ?? ? "limitSymbolsToIncludedHeaders": false

? ?? ?? ???},

/* 解決 browse.path 中未找到包含文件 */

? ?? ?? ???"configurationProvider":"ms-vscode.cmake-tools"??

? ?? ? }

? ? ],

? ? "version": 4

}

2,JTAG下載程序

JTAG下載程序流程如下:

使用USB線的Type-C接口連接DNESP32S2開發板左下角的USB口,并USB A口連接到電腦,使得電腦與開發板建立連接。

l??設置USB JTAG接口的端口號(電腦自動識別)。

l??選擇“select flash Method”下載方式(五角星),這里我們選擇JTAG下載。

l??點擊“Full Clean”擦除工程(垃圾桶)。

l??點擊“Build Project”編譯工程(圓柱形)。

編譯成功后,點擊“FlashDevice”下載程序至開發板中,此時,VSCode提示是否運行OpenOCD,如下圖所示:

圖6.3.2.1 運行OpenOCD

下載成功后,VS Code右下角提示如下信息。

圖6.3.2.2 提示下載成功

3,JTAG調試

JTAG調試非常簡單,先把代碼下載至開發板,然后點擊“運行與調試”,如下圖所示:

圖6.3.2.3 點擊運行與調試

打開運行與調試界面如下圖所示:

圖6.3.2.4 點擊運行調試

此時,系統執行到我們剛剛定義的斷電處,如下圖所示:

圖6.3.2.5 調試效果

在上圖中,右上角提供了用于調試代碼的選項。由于這些功能在學習MDK時都有所涉及并經常使用,因此作者在此不再過多介紹這些調試選項。

4,調試方法

下面,作者簡單介紹一下VSCode調試方法,例如變量怎么加載至監視,反匯編如何打開等實用操作。

變量監控:

打開調試時,選擇某個變量右鍵選擇“添加到監視”,如下圖所示:

圖6.3.2.6 變量添加到監視器中

此時,運行與調試界面顯示該變量的當前數值,如下圖所示:

圖6.3.2.7 監視變量和監視CPU寄存器

在圖6.3.2.6中,我們可以打開“反匯編視圖”,用戶可以查看程序的反匯編指令,理解程序的執行流程,以及分析程序的結構和邏輯,如下圖所示:

圖66.3.2.8 反匯視圖查看函數地址

除了上述的調試方法,大家還需親自動手實踐,才能真正理解VS Code的調試流程。請注意,在使用VS Code對ESP32進行調試時,可能會遇到一些問題。例如,如果調試失敗,可能是因為需要先使用JTAG接口下載程序才能進行調試。另外,調試結束后,有時需要重新編譯代碼才能再次成功調試。最后,調試過程中可能會出現不穩定的情況,如自動斷開,這可能是由于VS Code的OpenOCD與ESP32-S3芯片內置的JTAG連接不穩定所致。為了解決這些問題,建議使用樂鑫官方的JTAG調試器。

6.4 原子工程的文件架構解析

在講解正點原子ESP32工程架構之前,我們先了解一下樂鑫ESP32工程的工程架構,如下所示:

圖6.4.1 樂鑫ESP32工程文件架構

從上圖可以清晰地看出,除了components文件夾外,該工程架構與我們在6.1小節中新建的架構是一致的。components文件夾主要用于存放第三方驅動庫和開發者編寫的驅動庫。然而,如果我們采用類似于樂鑫ESP32的工程架構進行開發,這可能會導致我們的工程架構變得相當混亂。因此,正點原子采取了一個不同的做法,將開發者編寫的驅動文件整理到components文件夾下的BSP文件夾中。此外,我們還簡化了CMakeLists.txt文件的管理,通過保留一個CMakeLists.txt文件,就能夠加載多個驅動庫,從而提高了工程的整潔性和可維護性。

下圖是正點原子ESP32工程的架構。

圖6.4.2 正點原子ESP32文件架構

從上圖中我們可以清晰地觀察到,正點原子將所有開發者編寫的程序驅動都統一地放置在BSP文件夾下。為了對這些程序驅動實施高效的統一管理,它引入了一個CMakeLists.txt文件。這種做法的顯著優勢在于,當需要創建新的驅動文件時,我們無需像樂鑫ESP32工程那樣,為每一個驅動代碼都單獨創建一個CMakeLists.txt文件。相反,我們只需使用一個CMakeLists.txt文件即可完成所有相關操作,極大地簡化了整個開發流程。接下來,我們將深入探究我們提供的CMakeLists.txt文件,其代碼內容如下:

①? ?源文件路徑,指本目錄下的所有代碼驅動

set(src_dirs

? ?? ?? ???IIC

? ?? ?? ???LCD

? ?? ?? ???LED

? ?? ?? ???SPI

? ?? ?? ???XL9555

? ?? ?? ???KEY

? ?? ?? ???24CXX

? ?? ?? ???ADC

? ?? ?? ???AP3216C

? ?? ?? ???QMA6100P)

②? ?頭文件路徑,指本目錄下的所有代碼驅動

set(include_dirs

? ?? ?? ???IIC

? ?? ?? ???LCD

? ?? ?? ???LED

? ?? ?? ???SPI

? ?? ?? ???XL9555

? ?? ?? ???KEY

? ?? ?? ???24CXX

? ?? ?? ???ADC

? ?? ?? ???AP3216C

? ?? ?? ???QMA6100P)

③? ?設置依賴庫

set(requires

? ?? ?? ???driver

? ?? ?? ???fatfs

? ?? ?? ???esp_adc

? ?? ?? ???esp32-camera

? ?? ?? ???newlib

? ?? ?? ???esp_timer)

④? ?注冊組件到構建系統的函數

idf_component_register(SRC_DIRS ${src_dirs}INCLUDE_DIRS

${include_dirs} REQUIRES ${requires})

⑤? ?設置特定組件編譯選項的函數

component_compile_options(-ffast-math -O3-Wno-error=format=-Wno-format)

? ? -ffast-math:允許編譯器進行某些可能減少數學運算精度的優化,以提高性能。

? ? -O3:這是一個優化級別選項,指示編譯器盡可能地進行高級優化以生成更高效的代碼。

? ? -Wno-error=format:這將編譯器關于格式字符串不匹配的警告從錯誤降級為警告。

? ? -Wno-format:這將完全禁用關于格式字符串的警告。

在開發過程中,④和⑤是固定不變的設定。而①和②的確定則依賴于項目所需的驅動文件數量。如果當前目錄下缺少某個特定的驅動文件(例如LED驅動文件),但在CMakeLists.txt文件中卻指定了需要編譯該LED驅動文件,那么在系統編譯時將會遇到以下錯誤:

圖6.4.3 未發現LED驅動文件

此時,需要我們添加LED驅動文件,并且清除編譯工程文件才能再一次編譯工程。

③表示驅動程序需要依賴的庫,例如CAMERA驅動程序,它依賴的是esp32-camera這一個攝像頭驅動庫。下圖是CMakeLists.txt未添加依賴庫的錯誤提示。

圖6.4.4 未添加依賴庫的提示錯誤(CAMERA驅動程序未添加依賴庫)

6.5 基礎工程配置

在第三章節中,我們得知正點原子是以ATK-MWS3S模組作為主控,該模組的設計參考了樂鑫的ESP32-S3-WOOD-1的N16R8型號,因此它與樂鑫產品可實現P2P兼容。然而,在6.1小節新建工程時,我們并未立刻適配這款模組的內部資源,例如時鐘頻率是否設定為240MHz、Flash配置是否為16MB,以及PSRAM的模式是否為OCT和8MB等。這些參數需要由開發者自行配置,否則我們的工程只能使用樂鑫的默認配置進行開發,這樣模組便無法充分發揮其應有的性能。下面,作者將逐步引導讀者進行基礎工程的配置,確保其與正點原子發布的DNESP32S3開發板的主控模組內部資源相匹配。配置流程如下:

1,使用VS Code打開6.1小節新建的工程,并點擊左下角齒輪(ESP-IDF: SDK Configuration Editor (menuconfig))進去menuconfig菜單配置界面,如下圖所示:

圖6.5.1 進入menuconfig配置界面

關于menuconfig配置界面的具體內容,作者將在后續的章節中進行詳細講解。目前,我們的主要目標是配置與ATK-MWS3S模組相匹配的資源。

2,在上圖“Search parameter”搜索框下輸入“Flash”進去flash配置界面,配置內容如下所示:

圖6.5.2 配置Flash資源

上圖中的①“FlashSPI mode”支持四種不同的 SPIflash 訪問模式,它們分別為DIO、DOUT、QIO 和 QOUT。下面我們來看一下這幾種模式到底有哪些區別,這些模式的對比如下表所示:

表6.5.1 四種SPI模式的對比

從上表可知,QIO模式的速率為最快,所以我們把基礎工程的Flash SPI mode設置為QIO。

上圖中的②“FlashSPI speed”提供了120、80、40和20MHz的配置選項。在選擇具體速度時,我們需要考慮Flash和PSRAM的SPI接口共享情況。為了優化模組性能,我們最好將flash和PSRAM的SPI速率設置為一致,這樣分時訪問這兩個存儲設備時,就不必切換時鐘頻率了。鑒于PSRAM的SPI速率最高可設置為80MHz,因此我們將flash的SPI速率也設置為80MHz,以確保最佳性能。

上圖的③是根據模組掛載的flash來確定的,這里我們選擇16MB大小,是毫無爭議的。

3,在搜索框中輸入“Partition Table”來設置分區表。分區表的主要功能是將flash劃分為多個功能各異的區域,包括存儲啟動文件、代碼區域和文件系統區域等子分區,以滿足不同的應用需求。后續章節將詳細解釋分區表的作用和配置方法。下圖是基礎工程分區表配置參數。

圖6.5.3 配置分區表

上圖中,我們選擇“Custompartition table CSV”自定義分區表,然后設置分區表的名稱為partitions-16MiB.csv。稍后我們會設置分區表各個子分區的管理大小。

4,在搜索框中輸入“PSRAM”來設置PSRAM參數,配置參數如下圖所示:

圖6.5.4 設置PSRAM參數

上圖的①選項是基于模組內部芯片的選擇來確定的。為了正確配置,讀者可以查閱《esp32-s3-wroom-1_wroom-1u_datasheet_cn》數據手冊的第三頁。在該頁中,我們可以看到ESP32-S3-WROOM-1-N16R8模組所掛載的PSRAM使用的是Octal SPI模式。因此,在配置過程中,我們應該選擇“Octal Mode PSRAM”這一選項。

上圖的②選項選擇最該的速率即可,并且與Flash SPI速率一致。

5,在搜索框中輸入“CPU frequency”來設置CPU的時鐘頻率,如下圖所示:

圖6.5.5 配置CPU主頻

6,在搜索框中輸入“FreeRTOS”來配置系統節拍時鐘(tick clock)的頻率。默認情況下,“configTICK_RATE_HZ”的值為100,意味著節拍時鐘的周期為10ms。因此,調用vTaskDelay(1000)將會導致延時10秒。為了提高定時精度和方便性,建議將該值設置為1000,這樣節拍時鐘的周期就變為1ms,從而使得vTaskDelay(1000)代表延時1秒。如下圖所示:

圖6.5.6 配置系統節拍時鐘(tick clock)的頻率

7,配置分區表各個子分區,我們按下“Ctrl+Shift+P”快捷鍵打開命令面板,并在搜索欄內輸入“打開分區表編輯器”,按以下圖配置各個分區的管理大小。

圖6.5.7 設置分區表

首先我們按下“Add NewRow”選項添加子分區條目,然后設置條目的類型、偏移和大小,最后按下“Save”選項保存退出。

至此,我們已經完成了工程配置,確保其與DNESP32S3開發板所搭載的ATK-MWS3S模組的內部資源相匹配。現在,我們可以利用這個工程在DNESP32S3開發板上進行開發工作。下面我們來看一下當前工程架構,如下圖所示:

圖6.5.8 正點原子ESP32S3基礎工程架構

上圖中的sdkconfig.old是之前的基礎工程所使用的舊版系統配置文件,用于記錄之前的配置信息。而當前的sdkconfig則是系統最新生成的系統配置文件,包含了最新的配置設置。此外,partitions-16MiB.csv是系統配置保存后自動生成的分區表文件,該文件可供用戶查看,以便了解當前的分區配置情況。這些文件共同構成了ESP32開發環境的配置體系。

接下來,作者在app_main函數中編寫了代碼,以獲取DNESP32S3開發板上ATK-MWS3S模組的內部資源信息。這些信息包括時鐘頻率、flash大小以及PSRAM大小等。具體的代碼實現如下所示:

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "nvs_flash.h"

#include "esp_system.h"

#include "esp_chip_info.h"

#include "esp_psram.h"

#include "esp_flash.h"

/**

*@brief? ?? ? 程序入口

*@param

*@retval? ?? ?無

*/

void app_main(void)

{

? ?esp_err_t ret;

? ? uint32_t flash_size;

? ?esp_chip_info_t chip_info;? ?? ?? ?? ?? ?? ? /* 定義芯片信息結構體變量 */

? ? ret=nvs_flash_init();? ?? ?? ?? ?? ?? ?? ? /* 初始化NVS */

if (ret == ESP_ERR_NVS_NO_FREE_PAGES

|| ret ==ESP_ERR_NVS_NEW_VERSION_FOUND)

? ? {

? ?? ? ESP_ERROR_CHECK(nvs_flash_erase());

? ?? ? ret =nvs_flash_init();

? ? }

? ?esp_flash_get_size(NULL, &flash_size);? ?? ?? ? /* 獲取FLASH大小 */

? ?esp_chip_info(&chip_info);

printf("內核:cup數量%d\n",chip_info.cores);? ???/* 獲取CPU內核數并顯示 */

/* 獲取FLASH大小并顯示 */

printf("FLASHsize:%ld MB flash\n",flash_size / (1024 * 1024));

/* 獲取PARAM大小并顯示 */

? ?printf("PSRAMsize: %d bytes\n", esp_psram_get_size());? ?? ???

? ? while(1)

? ? {

? ?? ? printf("Hello-ESP32\r\n");

? ?? ? vTaskDelay(1000);

? ? }

}

上述代碼是獲取DNESP32S3開發板上ATK-MWS3S模組的內部資源信息,并打印到監控器上。首先我們編譯基礎工程,然后下載至開發板中,最后打開監控器查看串口打印內容,如下圖所示:

圖6.5.9 打印內部資源信息

在以后的例程中,我們是以這個基礎工程來延申擴展,所以本章節的內容非常重要,望讀者好好理解。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容