Skip to content

Chapter 7: NVS Parameter Persistence ​

📂 Example Code: 07_nvs

7.1 Key Points ​

  • ESP-IDF NVS Flash concepts: namespace, key, and value
  • Storing and loading PID parameters
  • Default values when NVS data is missing
  • Updating parameters without recompiling firmware

7.2 Course Content ​

NVS stores small key-value data in flash. In the OSRCORE examples, it is used for PID parameters and other runtime settings. After tuning parameters through a serial interface or debug command, the values can be saved and restored after reboot.

7.3 Basic Learning ​

NVS Concepts ​

NVS organizes data by namespace. Each namespace contains keys. Values can be integers, strings, binary blobs, or floating-point values stored as raw bytes.

Common steps:

  1. Initialize NVS flash.
  2. Open a namespace.
  3. Read or write values.
  4. Commit writes.
  5. Close the handle.

Typical PID Parameter Set ​

ParameterMeaning
kpProportional gain
kiIntegral gain
kdDerivative gain
target_speedDesired speed

7.4 Program Study ​

Initialize NVS:

c
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
    ESP_ERROR_CHECK(nvs_flash_erase());
    ESP_ERROR_CHECK(nvs_flash_init());
}

Open a namespace and read parameters:

c
nvs_handle_t handle;
ESP_ERROR_CHECK(nvs_open("pid", NVS_READWRITE, &handle));

size_t len = sizeof(pid_params_t);
esp_err_t err = nvs_get_blob(handle, "params", &params, &len);
if (err == ESP_ERR_NVS_NOT_FOUND) {
    params.kp = 1.0f;
    params.ki = 0.0f;
    params.kd = 0.0f;
}

Write and commit parameters:

c
ESP_ERROR_CHECK(nvs_set_blob(handle, "params", &params, sizeof(params)));
ESP_ERROR_CHECK(nvs_commit(handle));
nvs_close(handle);

7.5 Summary ​

NVS makes runtime tuning practical. Instead of hard-coding PID parameters, the firmware can store tuned values in flash and load them automatically after each reboot.


Built for OSRCORE robot development board.