HWD32F407-HAL_FLASH

(1)HWD32F407上的嵌入式FLASH有2M,支持单双bank,默认是单bank,常用的也是单bank,双bank较少使用;

 

(2)单bank和双bank有各自的下载算法,在单bank模式下需要使用单bank下载算法,在双bank模式下需要使用双bank下载算法,如下图所示:

image

image

 

(3)单双bank之间的切换也需要按照器件用户手册“4.7.2.单双bank切换流程”等来的,也就是说,如果是配置成了双bank模式,即使keil erase,依然还是双bank模式。

假如当前MCU是双bank模式,需要将其切角到单bank模式,操作步骤如下:

步骤1:首先Keil设置成双bank下载算法

步骤2:确保Keil Debug中的Initialization File中的ini文件是OnSetup()

image

 步骤3:在软件工程中增加双bank到单bank的切换代码,并Keil Debugf下运行此段代码

image

 步骤4:上述代码成功执行后,MCU就被改成了单bank模式,此后需要屏蔽上述代码,并将下载算法改成单bank下载算法。

image

 

(4)单bank下的FLASH读写示例

image

//地址应该在扇区5:0x0804 0000 - 0x0807 FFFF之间
HAL_StatusTypeDef flash_write(uint32_t WriteAddr, uint8_t *pBuffer, uint32_t NumToWrite)
{
    HAL_StatusTypeDef err = HAL_OK;
  err = HAL_FLASH_Unlock();
    if(HAL_OK != err){
        return err;
    }

    do{
        FLASH_EraseInitTypeDef FlashEraseInit = {0};
        FlashEraseInit.TypeErase    = FLASH_TYPEERASE_SECTORS; //扇区擦除
        FlashEraseInit.Sector       = 5; // 要擦除的第一个扇区的编号
        FlashEraseInit.NbSectors    = 1; // 要擦除的扇区数量
        FlashEraseInit.Banks                = FLASH_BANK_1; //BANK选择
        FlashEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
        
        uint32_t SectorError = 0;
        err = HAL_FLASHEx_Erase(&FlashEraseInit, &SectorError);
        if(HAL_OK != err){
            break;
        }
        
        err = FLASH_WaitForLastOperation(10000);
        if(HAL_OK != err){
            break;
        }

        for (uint32_t i = 0; i < NumToWrite; i++)
        {
            err = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, WriteAddr, *pBuffer);
            if(HAL_OK != err){
                break;
            }
            pBuffer++;
            WriteAddr++;
        }
        if(HAL_OK != err){
            break;
        }
    }while(0);
    
    HAL_FLASH_Lock();
  return err;
}
HAL_Flash写入
uint8_t buf_w[1024] = {0};

int main(void)
{
    HAL_Init();
    
    for(uint32_t i = 0; i<1024; i++){
        buf_w[i] = i%256;
    }
    
    HAL_StatusTypeDef ret = HAL_OK;
    ret = flash_write(0x08040000, buf_w, 1024);
    if(HAL_OK != ret){
        Error_Handler();
    }
    
    uint8_t *buf_r = (uint8_t *)0x08040000;
    for(uint32_t i = 0; i<1024; i++){
        if(*(buf_r+i) != buf_w[i]){
            Error_Handler();
        }
    }

    while(1)
    {
        ;
    }

}
HAL_Flash读写测试

上述代码是单bank模式下往块基地址为0x08040000的扇区5上的读写示例程序。

 

posted on 2026-03-30 12:07  LiveWithACat  阅读(3)  评论(0)    收藏  举报