读写FLASH
1. 简述
STM32的写FLASH相对简单,直接读即可,写FLASH相对复杂。首先看STM32的内存大小和分配。
用到的HAL库函数:
- HAL_StatusTypeDef HAL_FLASH_Unlock(void);
- HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
- HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
- HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
- HAL_StatusTypeDef HAL_FLASH_Lock(void);
复制代码
2. 读写FLASH代码- #define STM32_FLASH_BASE 0x08000000
- /* 获取扇区号 */
- static uint8_t bsp_flash_get_sector(uint32_t addr)
- {
- if (addr < ADDR_FLASH_SECTOR_1) return FLASH_SECTOR_0;
- else if (addr < ADDR_FLASH_SECTOR_2) return FLASH_SECTOR_1;
- else if (addr < ADDR_FLASH_SECTOR_3) return FLASH_SECTOR_2;
- else if (addr < ADDR_FLASH_SECTOR_4) return FLASH_SECTOR_3;
- else if (addr < ADDR_FLASH_SECTOR_5) return FLASH_SECTOR_4;
- else if (addr < ADDR_FLASH_SECTOR_6) return FLASH_SECTOR_5;
- else if (addr < ADDR_FLASH_SECTOR_7) return FLASH_SECTOR_6;
- else if (addr < ADDR_FLASH_SECTOR_8) return FLASH_SECTOR_7;
- else if (addr < ADDR_FLASH_SECTOR_9) return FLASH_SECTOR_8;
- else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;
- else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;
- return FLASH_SECTOR_11;
- }
- /* 读FLASH */
- uint32_t bsp_flash_read(uint32_t addr)
- {
- return *(__IO uint32_t*)(addr);
- }
- /* 写FLASH */
- void bsp_flash_write(uint32_t addr)
- {
- FLASH_EraseInitTypeDef f;
- uint32_t sector_error=0;
- uint32_t start_addr = addr;
- uint32_t end_addr = start_addr + (size * 4);
-
- /* 1. 判断地址合法 */
- if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;
-
- /* 2. 解锁 */
- HAL_FLASH_Unlock();
-
- /* 3. 擦除 */
- if (addr < 0x1FFF0000)
- {
- while (addr < end_addr)
- {
- if (hal_flash_read(addr) != 0XFFFFFFFF)
- {
- f.TypeErase = FLASH_TYPEERASE_SECTORS;
- f.Sector = hal_flash_get_sector(addr);
- f.NbSectors = 1;
- f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
- if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;
- }
- else addr += 4;
- FLASH_WaitForLastOperation(50000);
- }
- }
-
- /* 4. 写入 */
- addr = start_addr;
- while (addr < end_addr)
- {
- if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;
- addr += 4;
- data++;
- }
-
- /* 5. 上锁 */
- HAL_FLASH_Lock();
- }
复制代码
————————————————
版权声明:lljwork2021
|