概述
读写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();
}
最后
以上就是落寞石头为你收集整理的STM32-OTA(三)读写FLASH读写FLASH的全部内容,希望文章能够帮你解决STM32-OTA(三)读写FLASH读写FLASH所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复