본문으로 바로가기

[ESP-IDF][ble_hid_device_demo][3] 프로젝트 간략 분석

category ESP32 2023. 12. 13. 12:07

: ble_hid_device_demo 프로젝트는 기본적으로 파티션관련  "Single facttory app, no OTA" 로
  설정이 되어  있는데 커스텀 파티션 테이블을  사용하게 변경해 보겠습니다.

 

▶ Visual Studio Code를이용해 프로젝트 열기

  ==> 생략

▶ ESP-IDF SDK Configuration Editor (menuconfig) 선택

   :  Partition Table 항목 찾기 및 custom partition 사용하게 변경하기

    → 변경전 Partition Table 내용

 

→ Partion Table 항목을 "Custom partition table CSV" 로 변경후

     Custom partition CSV fie 항목에  "partition_hid.csv" 추가하기   < 파일이름은 적합한 이름으로 넣어주세요.

 

▶ spiffs 프로젝트안의 partitions_example.csv 파일을 복사해
     프로젝트 루트에 partition_hid.csv 로 변경 저장하기

 

   → partitions_example.csv 내용은 다음과 같습니다. (일부 수정했습니다.)

 

▶ Project 빌드하기

 *  Executing task: ninja  

[1/4] cd /home/xxx/Project/esp32/uc500_remo...ect/esp32/uc500_remote/build/uc500_remote.bin
     uc500_remote.bin binary size 0xebd80 bytes. 
     Smallest app partition is 0x100000 bytes. 0x14280 bytes (8%) free.
[2/4] Performing build step for 'bootloader'
[1/1] cd /home/xxx/Project/esp32/uc500_remote/build/bootloader/esp-idf/esptool_py 
       && /home/xxx/.espressif/python_env/idf5.1_py3.10_env/bin/python 
          /home/xxx/esp/esp-idf/components/partition_table/check_sizes.py 
             --offset 0x8000 bootloader 0x0 
             /home/xxx/Project/esp32/uc500_remote/build/bootloader/bootloader.bin
Bootloader binary size 0x5340 bytes. 0x2cc0 bytes (35%) free.

 

▶  idf.py partition-table 을 이용해 변경 상태 확인하기

     : 마지막 storage 항목이 추가가 되어 있으면 정상입니다.

$ idf.py partition-table
Executing action: partition-table
Running ninja in directory /home/xxx/Project/esp32/uc500_remote/build
Executing "ninja partition-table"...
[1/1] cd /home/xxx/Project/esp32/uc500_remote/build/esp-idf/partition_table && /us...ho 
"*******************************************************************************
         "Partition table binary generated. Contents:
 *******************************************************************************
# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1536K,
storage,data,spiffs,0x190000,448K,
*******************************************************************************

Partition Table build complete. To flash, run this command:
/home/xxx/.espressif/python_env/idf5.1_py3.10_env/bin/python 
   ../../../esp/esp-idf/components/esptool_py/esptool/esptool.py 
     -p /dev/ttyACM0 
     -b 460800 
     --before default_reset 
     --after hard_reset 
     --chip esp32c6  
     write_flash 0x8000 build/partition_table/partition-table.bin
or run 'idf.py -p /dev/ttyACM0 partition-table-flash'

 

 

▶  spiffs 파티션에 데이타 쓰기

  → Init SPIFFS

     : esp_vfs_spiffs_register() 함수 사용하기   

 esp_vfs_spiffs_conf_t conf = {
      .base_path = "/spiffs",
      .partition_label = NULL,
      .max_files = 9,
      .format_if_mount_failed = true
    };

    ret = esp_vfs_spiffs_register(&conf);

 

 →Check SPIFFS

    : esp_spiffs_check() 함수 사용

 

 →Open file

  : fopen() 함수 사용하기 

 FILE* f = fopen("/spiffs/name.dat", "r");		// read
    if (f == NULL) {
        ESP_LOGW(HID_DEMO_TAG, "Failed to load name.dat.");
		f = fopen("/spiffs/name.dat", "w");		// write
	    if (f == NULL) {
	        ESP_LOGE(HID_DEMO_TAG, "Failed to create 'name.dat' for writing.");
			return ;
	    }else{        	
			fclose(f);
	    }		
    }else{
	    fclose(f);
    }

 

 →Write file

  :  fopen()에서 오픈한 파일에 데이타 저장하기

    f = fopen("/spiffs/name.dat", "w");  // write
    fprintf(f, "Hello World!\n");
    fclose(f);
    ESP_LOGI(TAG, "File written");

 

 → Read file

    : fgets() 사용하기

    f = fopen("/spiffs/name.dat", "r");		// for reading
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for reading");
        return;
    }
    char line[64];
    fgets(line, sizeof(line), f);   <----
    fclose(f);

 

 →Close file

  : fclose() 함수 사용하기

 

 → unmount 파티션

   : spiffs 파티션을 미사용시 언마운트 해 줍니다.

    esp_vfs_spiffs_unregister(conf.partition_label);

 

 

 

 

 

 

반응형