天天看點

ESP32 中的那些坑一、nvs_get_str()函數二、存儲空間不足三、GPIO12四、ESP32 屏蔽bootloader資訊

一、nvs_get_str()函數

NVS nvs_get_str

函數原型:

esp_err_t nvs_get_str (nvs_handle handle, const char* key, char* out_value, size_t* length);

坑:

length這個參數奇葩得很,如果out_value的值為NIULL,它将傳回鍵所對應字元串的長度(含\0),而如果out_value非NULL,則将其當作out_value的長度與字元串長度比較,如果該值小于字元串長度,就會傳回ESP_ERR_NVS_INVALID_LENGTH

如果錯誤地将required_size單純認為是所讀字元串,并使用如下調用方式會讀到錯誤的資料:

正确姿勢:

size_t required_size;
nvs_get_str(my_handle, "server_name", NULL, &required_size);
char* server_name = malloc(required_size);
nvs_get_str(my_handle, "server_name", server_name, &required_size);
           

教訓:

nvs.h檔案裡面明确的說明了這一點,是以說,在使用函數前還是得仔細讀讀函數注釋。

二、存儲空間不足

分區表 1310720

問題:

就開了個藍牙和WiFi,才寫了幾行代碼,還沒幹别的呢,怎麼就97%了?ESP32你行不行啊?

ESP32 中的那些坑一、nvs_get_str()函數二、存儲空間不足三、GPIO12四、ESP32 屏蔽bootloader資訊

可是ESP-WROOM-32不是4MB的flash嗎?程式存儲空間最大值怎麼才1M多點?

坑:

arduino中的ESP32預設分區表隻給了1.2MB給APP,而ESP-IDF也隻給了1MB給APP

正确姿勢:

Arduino

arduino裡改變分區表非常友善:工具->Partition Scheme

ESP32 中的那些坑一、nvs_get_str()函數二、存儲空間不足三、GPIO12四、ESP32 屏蔽bootloader資訊

這裡應該結合自己的闆子上的SPI FLASH大小和所需功能選擇合适的分區表,筆者的ESP32的FLASH有4MB大,對檔案系統沒有要求,為了應對可能存在的開發需求,選了個最大的"Huge APP"。選好後重新編譯下載下傳就完成了。

ESP-IDF

大緻講一下流程:

1、在…\esp\components\partition_table目錄下找到partitions_singleapp.csv檔案,複制一份到工程目錄下,重命名一下以免混淆,(比如my_partitions.csv)打開改檔案,将對應内容修改如下:

# Espressif ESP32 Partition Table
# Name,   Type, SubType, Offset,  Size
nvs,      data, nvs,     0x9000,  0x6000
phy_init, data, phy,     0xf000,  0x1000
factory,  app,  factory, 0x10000, 3M
           

2、打開ESP-IDF Command Prompt,cd到工程目錄,idf.py menuconfig->Partition Table->Partition Tabl->Custom partition table CSV->ESC->修改名稱為my_partitions.csv

ESP32 中的那些坑一、nvs_get_str()函數二、存儲空間不足三、GPIO12四、ESP32 屏蔽bootloader資訊

3、重新編譯下載下傳即可

參考資料:

樂鑫官方文檔

【IoT】分區表(Partition Tables):ESP32 FLASH 分區功能簡析

三、GPIO12

==HSPI ==

python espefuse.py -p COM25 set_flash_voltage 3.3V

四、ESP32 屏蔽bootloader資訊

上電時,GPIO15接地