STM32 Flash 读写

it2025-07-23  9

目录

环境1. 资料2. 代码

环境

Keil : μVision V5.31.0.0Toolchain: MDK-ARM Plus Version: 5.31.0.0STM32 CubeMx: Version 6.1

1. 资料

这里使用的芯片Flash大小为 32 Kbyte,Page 大小为 1 Kbyte, Sector 大小为 4 个 Page。

2. 代码

#define HAL_FLASH_PAGE_COUNT 1 #define HAL_FLASH_PAGE_START (32 - HAL_FLASH_PAGE_COUNT) #define HAL_FLASH_PAGE_SIZE (1024) #define HAL_FLASH_SIZE (HAL_FLASH_PAGE_COUNT * HAL_FLASH_PAGE_SIZE) #define HAL_FLASH_PAGE_ADDR (FLASH_BANK1_END - HAL_FLASH_SIZE) #define HAL_FLASH_WORD_SIZE (10)//(HAL_FLASH_SIZE >> 1) // It needs to be configured according to the stack size /*********************************************************************************/ /************************************************************************************************** * @fn hal_falsh_write * * @brief write data to flash * * @param index: base on 0, max = HAL_FLASH_WORD_SIZE * data: pointer * size: number of byte to write * * @return None */ void hal_falsh_write(uint16_t index, const uint16_t data[], uint16_t size) { uint16_t n = 0, flash_cache[HAL_FLASH_WORD_SIZE]; assert_param(index < HAL_FLASH_WORD_SIZE); // update falsh to cache for( n = 0; n < HAL_FLASH_WORD_SIZE; n++) { flash_cache[n] = *(__IO uint16_t*)(HAL_FLASH_PAGE_ADDR + n * 2); } // move data to cache for( n = 0; n < size; n++) { flash_cache[index + n] = data[n]; } HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef f; f.TypeErase = FLASH_TYPEERASE_PAGES; f.PageAddress = HAL_FLASH_PAGE_ADDR; f.NbPages = 1; uint32_t PageError = 0; HAL_IWDG_Refresh(&hiwdg); HAL_FLASHEx_Erase(&f, &PageError); for(n = 0; n < HAL_FLASH_WORD_SIZE; n++) { HAL_IWDG_Refresh(&hiwdg); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, HAL_FLASH_PAGE_ADDR + (n * 2), flash_cache[n]); } HAL_FLASH_Lock(); } /************************************************************************************************** * @fn hal_falsh_write_addr * * @brief write data to flash * * @param addr: base on 0, max = HAL_FLASH_SIZE, half word: 0,2,4... * data: pointer * size: number of byte to write * * @return None */ void hal_falsh_write_addr(uint32_t addr, uint16_t data) { FLASH_EraseInitTypeDef f; assert_param((HAL_FLASH_PAGE_ADDR + addr) < FLASH_BANK1_END); HAL_FLASH_Unlock(); f.TypeErase = FLASH_TYPEERASE_PAGES; f.PageAddress = HAL_FLASH_PAGE_ADDR; f.NbPages = 1; uint32_t PageError = 0; HAL_FLASHEx_Erase(&f, &PageError); HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, HAL_FLASH_PAGE_ADDR + addr, data); HAL_FLASH_Lock(); } /************************************************************************************************** * @fn hal_falsh_read * * @brief read data from flash * * @param index: base on 0, max = HAL_FLASH_WORD_SIZE, * data: pointer * size: number of byte to write * * @return number of read */ uint16_t hal_falsh_read(uint16_t index, uint16_t *data, uint16_t size) { uint16_t n = 0; assert_param(index < HAL_FLASH_WORD_SIZE); for(n = 0; n < size; n++) { *data = *(__IO uint16_t*)(HAL_FLASH_PAGE_ADDR + (index + n) * 2); data++; } return n; }
最新回复(0)