esp32 flash 사용

20237 단어 ESP32_wifi
1. 플랫폼 기반
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);
}

좋은 웹페이지 즐겨찾기