| 读写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
 
 
 
 
 |