From 18425a4d1727686dcca11d1014757009bf9d4404 Mon Sep 17 00:00:00 2001 From: tianjialong Date: Mon, 20 Feb 2023 09:49:14 +0800 Subject: [PATCH] update --- src/config.c | 112 +++++++++++------------------------------------------------ src/config.h | 8 ++--- src/zflash.c | 38 +++++++++++++------- src/zflash.h | 2 +- 4 files changed, 51 insertions(+), 109 deletions(-) diff --git a/src/config.c b/src/config.c index fe39679..8733c3d 100644 --- a/src/config.c +++ b/src/config.c @@ -12,7 +12,7 @@ #define TAG "CONFIG" -#define flash_write_lenght(type) ((sizeof(type) / 4) + ((sizeof(type) % 4) > 0 ? 1 : 0)) +#define CONFIG_SIZE ((sizeof(config_t) / 4) + ((sizeof(config_t) % 4) > 0 ? 1 : 0)) static config_t s_config; @@ -34,38 +34,7 @@ const uint8_t g_text_buf[] = {"STM32 FLASH TEST"}; #define FLASH_SAVE_ADDR \ 0x08010000 /* 设置FLASH 保存地址(必须为4的整数倍,且其值要大于本代码所占用FLASH的大小 + 0X08000000) */ -// #define INIT_CONFIG(type, name, markname) \ -// type name = 0; \ -// err = nvs_get_##type(s_nvs_handle, markname, &name); \ -// if (err == ESP_OK && !refresh_config) { \ -// s_config.name = name; \ -// } else { \ -// s_is_first_init = true; \ -// ESP_LOGI(TAG, "reconfig config %s", #name); \ -// err = nvs_set_##type(s_nvs_handle, markname, s_config.name); \ -// if (err != ESP_OK) { \ -// ESP_LOGE(TAG, "nvs set %s fail,error %d", #name, err); \ -// } \ -// } - -// #define UPDATE_CONFIG(type, name, markname) \ -// type name = 0; \ -// err = nvs_get_##type(s_nvs_handle, markname, &name); \ -// if (err == ESP_OK) { \ -// if (s_config.name != name) { \ -// err = nvs_set_##type(s_nvs_handle, markname, s_config.name); \ -// if (err != ESP_OK) { \ -// ESP_LOGE(TAG, "nvs set %s fail,error %d", #name, err); \ -// } else { \ -// ESP_LOGI(TAG, "update config %s -> %d", #name, s_config.name); \ -// } \ -// } \ -// } else { \ -// ESP_LOGE(TAG, "nvs_get %s fail %d", #name, err); \ -// } - void config_init() { - uint8_t g_text_rx_buf[sizeof(config_t)]; #if 1 IP4_ADDR((ip4_addr_t *)&s_config.ip, 192, 168, 1, 10); IP4_ADDR((ip4_addr_t *)&s_config.gw, 192, 168, 1, 1); @@ -75,50 +44,14 @@ void config_init() { s_config.mask = 1; // #endif - stmflash_write(FLASH_SAVE_ADDR, (uint32_t *)&s_config, (sizeof(config_t) / 4)); - - // stmflash_write(FLASH_SAVE_ADDR, (uint32_t *)g_text_buf, SIZE); - stmflash_read(FLASH_SAVE_ADDR, (uint32_t *)g_text_rx_buf, (sizeof(config_t) / 4)); - ZLOGI(TAG, "ip:%d\r\n", ((config_t *)g_text_rx_buf)->ip); - ZLOGI(TAG, "gw:%d\r\n", ((config_t *)g_text_rx_buf)->gw); - ZLOGI(TAG, "netmask:%d\r\n", ((config_t *)g_text_rx_buf)->netmask); - ZLOGI(TAG, "localport:%d\r\n", ((config_t *)g_text_rx_buf)->localport); - ZLOGI(TAG, "obtaining_ip_mode:%d\r\n", ((config_t *)g_text_rx_buf)->obtaining_ip_mode); - ZLOGI(TAG, "mask:%d\r\n", ((config_t *)g_text_rx_buf)->mask); - // printf("%s\r\n", g_text_rx_buf); - - // if (stmflash_write_config(STM32_FLASH_BASE, &s_config, flash_write_lenght(config_t)) < 0) { - // ZLOGE(TAG, "flash write config error\r\n"); - // } - - // esp_err_t err = nvs_flash_init(); - - // if (err == ESP_ERR_NVS_NO_FREE_PAGES) { - // ESP_ERROR_CHECK(nvs_flash_erase()); - // err = nvs_flash_init(); - // } - - // if (err != ESP_ERR_NVS_NO_FREE_PAGES) { - // esp_err_t err = nvs_open("app_config", NVS_READWRITE, &s_nvs_handle); - // if (err == ESP_OK) { - // bool refresh_config = false; - // INIT_CONFIG(u32, ip, "ip"); - // INIT_CONFIG(u32, gw, "gw"); - // INIT_CONFIG(u32, netmask, "netmask"); - // INIT_CONFIG(u32, localport, "localport"); - // INIT_CONFIG(u32, sound_report_times, "srt"); - // INIT_CONFIG(u32, obtaining_ip_mode, "oim"); - // INIT_CONFIG(u32, sound_magnification_factors, "smf"); - // } else { - // } - - // } else { - // ESP_LOGE(TAG, "nvs flash init fail %d", err); - // } - // nvs_close(s_nvs_handle); + if (stmflash_write(FLASH_SAVE_ADDR, (uint32_t *)&s_config, CONFIG_SIZE) < 0) { + ZLOGE(TAG, "flash write config error\r\n"); + } + + // config_flash_read(); /*dumpconfig*/ - // config_dump_config(); + config_dump_config(); } bool config_is_first_init() { return s_is_first_init; } void config_dump_config() { @@ -129,22 +62,17 @@ void config_dump_config() { ZLOGI(TAG, "= config netmask: %s", inet_ntoa(s_config.netmask)); ZLOGI(TAG, "= config localport: %u", s_config.localport); } -// void config_update() { -// esp_err_t err = nvs_open("app_config", NVS_READWRITE, &s_nvs_handle); -// if (err == ESP_OK) { -// UPDATE_CONFIG(u32, ip, "ip"); -// UPDATE_CONFIG(u32, gw, "gw"); -// UPDATE_CONFIG(u32, netmask, "netmask"); -// UPDATE_CONFIG(u32, localport, "localport"); -// UPDATE_CONFIG(u32, sound_report_times, "srt"); -// UPDATE_CONFIG(u32, obtaining_ip_mode, "oim"); -// UPDATE_CONFIG(u32, sound_magnification_factors, "smf"); - -// } else { -// } - -// nvs_close(s_nvs_handle); - -// config_dump_config(); -// } + +bool config_update() { + if (stmflash_write(FLASH_SAVE_ADDR, (uint32_t *)&s_config, CONFIG_SIZE) < 0) { + ZLOGE(TAG, "flash write config error\r\n"); + return false; + } + + config_dump_config(); + return true; +} + +void config_flash_read() { stmflash_read(FLASH_SAVE_ADDR, (uint32_t *)&s_config, CONFIG_SIZE); } + config_t *config_get() { return &s_config; } \ No newline at end of file diff --git a/src/config.h b/src/config.h index 2cd08ba..e32b78e 100644 --- a/src/config.h +++ b/src/config.h @@ -1,8 +1,7 @@ #pragma once -#include #include +#include typedef struct { - uint32_t mask; uint32_t obtaining_ip_mode; @@ -15,7 +14,8 @@ typedef struct { } config_t; void config_init(); -void config_update(); +bool config_update(); void config_dump_config(); config_t *config_get(); -bool config_is_first_init() ; +bool config_is_first_init(); +void config_flash_read(); diff --git a/src/zflash.c b/src/zflash.c index 78963f7..06bd237 100644 --- a/src/zflash.c +++ b/src/zflash.c @@ -74,9 +74,11 @@ uint8_t stmflash_get_flash_sector(uint32_t addr) { * @param start_address : 起始地址 (此地址必须为4的倍数!!,否则写入出错!) * @param pbuf : 数据指针 * @param length : 要写入的 字(32位)数(就是要写入的32位数据的个数) - * @retval 无 + * @retval uint8_t : -1 flash 擦除错误,-2 写入异常错误 */ -void stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length) { +int8_t stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length) { + bool err_flash_erase_flag = false; + bool err_exception_flag = false; FLASH_EraseInitTypeDef flasheraseinit; HAL_StatusTypeDef FlashStatus = HAL_OK; @@ -104,6 +106,7 @@ void stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length) { flasheraseinit.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* 电压范围,VCC=2.7~3.6V之间!! */ if (HAL_FLASHEx_Erase(&flasheraseinit, §orerror) != HAL_OK) { + err_flash_erase_flag = true; break; /* 发生错误了 */ } @@ -114,24 +117,35 @@ void stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length) { } } - FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME); /* 等待上次操作完成 */ - - if (FlashStatus == HAL_OK) { - while (waddr < endaddr) /* 写数据 */ - { - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, waddr, *pbuf) != HAL_OK) /* 写入数据 */ + if (!err_flash_erase_flag) { + FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME); /* 等待上次操作完成 */ + if (FlashStatus == HAL_OK) { + while (waddr < endaddr) /* 写数据 */ { - break; /* 写入异常 */ - } + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, waddr, *pbuf) != HAL_OK) /* 写入数据 */ + { + err_exception_flag = true; + break; /* 写入异常 */ + } - waddr += 4; - pbuf++; + waddr += 4; + pbuf++; + } } } FLASH->ACR |= 1 << 10; /* FLASH擦除结束,开启数据fetch */ HAL_FLASH_Lock(); /* 上锁 */ + + if (err_flash_erase_flag) { + return -1; + } + if (err_exception_flag) { + return -2; + } + + return 0; } /** diff --git a/src/zflash.h b/src/zflash.h index b4056a2..e40e781 100644 --- a/src/zflash.h +++ b/src/zflash.h @@ -25,7 +25,7 @@ #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* 扇区11起始地址,128 Kbytes */ uint32_t stmflash_read_word(uint32_t faddr); /* 读出字 */ -void stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length); /* 从指定地址开始写入指定长度的数据 */ +int8_t stmflash_write(uint32_t waddr, uint32_t *pbuf, uint32_t length); /* 从指定地址开始写入指定长度的数据 */ void stmflash_read(uint32_t raddr, uint32_t *pbuf, uint32_t length); /* 从指定地址开始读出指定长度的数据 */ void test_write(uint32_t waddr, uint32_t wdata); /* 测试写入 */