#include "bsp_flash.h" #include "main.h" #include "string.h" static uint32_t ger_sector(uint32_t address); /** * @brief erase flash * @param[in] address: flash address * @param[in] len: page num * @retval none */ /** * @brief 擦除flash * @param[in] address: flash 地址 * @param[in] len: 页数量 * @retval none */ void flash_erase_address(uint32_t address, uint16_t len) { FLASH_EraseInitTypeDef flash_erase; uint32_t error; flash_erase.Sector = ger_sector(address); flash_erase.TypeErase = FLASH_TYPEERASE_SECTORS; flash_erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; flash_erase.NbSectors = len; HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(&flash_erase, &error); HAL_FLASH_Lock(); } /** * @brief write data to one page of flash * @param[in] start_address: flash address * @param[in] buf: data point * @param[in] len: data num * @retval success 0, fail -1 */ /** * @brief 往一页flash写数据 * @param[in] start_address: flash 地址 * @param[in] buf: 数据指针 * @param[in] len: 数据长度 * @retval success 0, fail -1 */ int8_t flash_write_single_address(uint32_t start_address, uint32_t *buf, uint32_t len) { static uint32_t uw_address; static uint32_t end_address; static uint32_t *data_buf; static uint32_t data_len; HAL_FLASH_Unlock(); uw_address = start_address; end_address = get_next_flash_address(start_address); data_buf = buf; data_len = 0; while (uw_address <= end_address) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,uw_address, *data_buf) == HAL_OK) { uw_address += 4; data_buf++; data_len++; if (data_len == len) { break; } } else { HAL_FLASH_Lock(); return -1; } } HAL_FLASH_Lock(); return 0; } /** * @brief write data to some pages of flash * @param[in] start_address: flash start address * @param[in] end_address: flash end address * @param[in] buf: data point * @param[in] len: data num * @retval success 0, fail -1 */ /** * @brief 往几页flash写数据 * @param[in] start_address: flash 开始地址 * @param[in] end_address: flash 结束地址 * @param[in] buf: 数据指针 * @param[in] len: 数据长度 * @retval success 0, fail -1 */ int8_t flash_write_muli_address(uint32_t start_address, uint32_t end_address, uint32_t *buf, uint32_t len) { uint32_t uw_address = 0; uint32_t *data_buf; uint32_t data_len; HAL_FLASH_Unlock(); uw_address = start_address; data_buf = buf; data_len = 0; while (uw_address <= end_address) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,uw_address, *data_buf) == HAL_OK) { uw_address += 4; data_buf++; data_len++; if (data_len == len) { break; } } else { HAL_FLASH_Lock(); return -1; } } HAL_FLASH_Lock(); return 0; } /** * @brief read data for flash * @param[in] address: flash address * @param[out] buf: data point * @param[in] len: data num * @retval none */ /** * @brief 从flash读数据 * @param[in] start_address: flash 地址 * @param[out] buf: 数据指针 * @param[in] len: 数据长度 * @retval none */ void flash_read(uint32_t address, uint32_t *buf, uint32_t len) { memcpy(buf, (void*)address, len *4); } /** * @brief get the sector number of flash * @param[in] address: flash address * @retval sector number */ /** * @brief 获取flash的sector号 * @param[in] address: flash 地址 * @retval sector号 */ static uint32_t ger_sector(uint32_t address) { uint32_t sector = 0; if ((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0)) { sector = FLASH_SECTOR_0; } else if ((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1)) { sector = FLASH_SECTOR_1; } else if ((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2)) { sector = FLASH_SECTOR_2; } else if ((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3)) { sector = FLASH_SECTOR_3; } else if ((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4)) { sector = FLASH_SECTOR_4; } else if ((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5)) { sector = FLASH_SECTOR_5; } else if ((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6)) { sector = FLASH_SECTOR_6; } else if ((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7)) { sector = FLASH_SECTOR_7; } else if ((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8)) { sector = FLASH_SECTOR_8; } else if ((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9)) { sector = FLASH_SECTOR_9; } else if ((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10)) { sector = FLASH_SECTOR_10; } else if ((address < ADDR_FLASH_SECTOR_12) && (address >= ADDR_FLASH_SECTOR_11)) { sector = FLASH_SECTOR_11; } else { sector = FLASH_SECTOR_11; } return sector; } /** * @brief get the next page flash address * @param[in] address: flash address * @retval next page flash address */ /** * @brief 获取下一页flash地址 * @param[in] address: flash 地址 * @retval 下一页flash地址 */ uint32_t get_next_flash_address(uint32_t address) { uint32_t sector = 0; if ((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0)) { sector = ADDR_FLASH_SECTOR_1; } else if ((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1)) { sector = ADDR_FLASH_SECTOR_2; } else if ((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2)) { sector = ADDR_FLASH_SECTOR_3; } else if ((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3)) { sector = ADDR_FLASH_SECTOR_4; } else if ((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4)) { sector = ADDR_FLASH_SECTOR_5; } else if ((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5)) { sector = ADDR_FLASH_SECTOR_6; } else if ((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6)) { sector = ADDR_FLASH_SECTOR_7; } else if ((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7)) { sector = ADDR_FLASH_SECTOR_8; } else if ((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8)) { sector = ADDR_FLASH_SECTOR_9; } else if ((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9)) { sector = ADDR_FLASH_SECTOR_10; } else if ((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10)) { sector = ADDR_FLASH_SECTOR_11; } else /*(address < FLASH_END_ADDR) && (address >= ADDR_FLASH_SECTOR_23))*/ { sector = FLASH_END_ADDR; } return sector; }