esp32 flash 사용
20237 단어 ESP32_wifi
1. 소프트웨어:esp-idf-v3.1.32, 하드웨어: ESP32 3, 공식 링크: 3.1: 링크 1 3.2: 다운로드 2 링크3
2, 어떻게 사용
2.1 csv 플래시 섹션 테이블, 섹션 상황
sp32flash는 공식적으로 정해진 양식으로 원하는 nvs의 크기 형식을 정의할 수 있습니다. # Name, Type, SubType, Offset, Size, Flags 두 개의ota는 총 4M 크기로 설정할 수 있습니다.
# Name, Type, SubType, Offset, Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, , 0x4000,
otadata, data, ota, , 0x2000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 0x140000,
ota_0, app, ota_0, , 0x140000,
ota_1, app, ota_1, , 0x140000,
user_save,data,nvs, , 8k, //
2.2 .h 파일
사용자가 저장해야 할 데이터는 자신이 정의한 구조체에 놓고, 저장해야 할 것은 안에 놓아 저장한다
#define in_flash_data_h_
#include
#include
typedef struct
{
uint8_t ble_adv_name[30];
uint8_t compay_name[30]; // s
} STU_USER;
extern STU_USER user_para;
void user_read_flash(void);
void delay_ms(uint32_t set_ms);
void task_write_user_data(void);
#endif
2.3 .c 파일
주요 함수는 읽기 함수, 쓰기 함수,
#include
#include "esp_partition.h"
#include "esp_log.h"
#include "in_flash_data.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
static const char *TAG = "user_flash";
// ------------------------
STU_USER user_para;
static uint8_t save_user_data_enbale =0;
// flash ----------
void user_read_flash(void)
{
// Find the partition map in the partition table
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "user_save");
assert(partition != NULL);
static uint8_t read_data[sizeof(STU_USER)+2];
memset(read_data, 0xFF, sizeof(read_data));
uint8_t err =0xff;
// 1: read
err=esp_partition_read(partition, 0, read_data, sizeof(read_data));
if(err!=0)
{
ESP_LOGI(TAG, "user flash read ----1111%d",err);
}
// 2: ---- flash
if((read_data[0]==0xAA)&&(read_data[1]==0xAA))
{
esp_log_buffer_hex(TAG, read_data,sizeof(read_data));
memcpy(user_para.ble_adv_name,read_data+2,sizeof(read_data)-2);
}
else
{
//
save_user_data_enbale =1;
memcpy(user_para.ble_adv_name,"MK113",strlen("Snifx"));
memcpy(user_para.compay_name,"MOKO TECHNOLOGY LTD.",strlen("MOKO TECHNOLOGY LTD."));
}
}
/*********************************/
//
void task_write_user_data(void)
{
uint8_t save_head[2]={0xAA,0XAA};
uint8_t buf[sizeof(STU_USER)];
uint8_t err=0xff;
if(save_user_data_enbale==0) return;
save_user_data_enbale =0;
// step 1: flash id
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "user_save");
//
assert(partition != NULL);
// step 2: flash
err=esp_partition_erase_range(partition, 0, partition->size);
if(err!=0)
{
ESP_LOGI(TAG, "user flash erase range ----%d",err);
}
// step 3:
memcpy(buf,user_para.ble_adv_name,sizeof(STU_USER));
// step 4:write save head flash , , flash
err = esp_partition_write(partition, 0,save_head,sizeof(save_head));
if(err!=0)
{
ESP_LOGI(TAG, "user flash write header ----1111%d",err);
}
err = esp_partition_write(partition, 2,buf,sizeof(STU_USER));
if(err!=0)
{
ESP_LOGI(TAG, "user flash write datas ----2222%d",err);
}
ESP_LOGI(TAG, "user flash write");
}
void delay_ms(uint32_t set_ms)
{
vTaskDelay(set_ms / portTICK_PERIOD_MS);
}