#include "xs_flash.h" #include "xs_log.h" #include #include #include static uint32_t* _rawstartadd; static uint32_t* _defaultdata; static uint32_t _rawsize; static bool _is_first_run = false; static bool _xs_check_raw_data() { uint32_t checksum = 0; ZLOGI("flash", "_rawstartadd[0] = %x", _rawstartadd[0]); if (_rawstartadd[0] != FLASH_MASK_VAL) { return false; } for (uint32_t i = 0; i < _rawsize - 1; i++) { checksum += _rawstartadd[i]; } if (checksum != _rawstartadd[_rawsize - 1]) { return false; } return true; } static HAL_StatusTypeDef _flash_erase(void) { HAL_StatusTypeDef status; uint32_t sector_error_point; FLASH_EraseInitTypeDef flash_erase_structer = { // .TypeErase = FLASH_TYPEERASE_SECTORS, // .Sector = FLASH_EARSE_SECTOR, // .NbSectors = 1, // .VoltageRange = FLASH_VOLTAGE_RANGE_3 // }; HAL_FLASH_Unlock(); // 解锁 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); // 清除一些错误标志 status = HAL_FLASHEx_Erase(&flash_erase_structer, §or_error_point); if (status != HAL_OK) { ZLOGE("flash", "erase error"); } HAL_FLASH_Lock(); // 上锁 return status; } /******************************************************************************* * EXTERN * *******************************************************************************/ void xs_flash_init(uint32_t* rawstartadd, uint32_t* defaultdata, uint32_t rawsize) { _rawstartadd = rawstartadd; _defaultdata = defaultdata; _rawsize = rawsize; // 读取flash数据 memcpy(_rawstartadd, (uint32_t*)(FLASH_START_ADD), _rawsize); // 校验数据 if (_xs_check_raw_data()) { return; } _is_first_run = true; xs_flash_factory_reset(); // 初始化flash数据 } bool xs_flash_is_first_run(void) { return _is_first_run; } uint32_t xs_compute_checksum(uint32_t* data, uint32_t size) { uint32_t checksum = 0; for (uint32_t i = 0; i < size; i++) { checksum += data[i]; } return checksum; } bool xs_flash_factory_reset(void) { memcpy(_rawstartadd, _defaultdata, _rawsize * 4); xs_flash_flush(); return true; } bool xs_flash_flush(void) { _rawstartadd[0] = FLASH_MASK_VAL; _rawstartadd[_rawsize - 1] = xs_compute_checksum(_rawstartadd, _rawsize - 1); _flash_erase(); HAL_FLASH_Unlock(); // 解锁 HAL_StatusTypeDef status; for (uint32_t i = 0; i < _rawsize; i++) { status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADD + i * 4, _rawstartadd[i]); if (status != HAL_OK) { ZLOGE("flash", "write error"); } } HAL_FLASH_Lock(); // 上锁 return true; }