HWD32F407-HAL_FLASH
(1)HWD32F407上的嵌入式FLASH有2M,支持单双bank,默认是单bank,常用的也是单bank,双bank较少使用;
(2)单bank和双bank有各自的下载算法,在单bank模式下需要使用单bank下载算法,在双bank模式下需要使用双bank下载算法,如下图所示:


(3)单双bank之间的切换也需要按照器件用户手册“4.7.2.单双bank切换流程”等来的,也就是说,如果是配置成了双bank模式,即使keil erase,依然还是双bank模式。
假如当前MCU是双bank模式,需要将其切角到单bank模式,操作步骤如下:
步骤1:首先Keil设置成双bank下载算法
步骤2:确保Keil Debug中的Initialization File中的ini文件是OnSetup()

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

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

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

//地址应该在扇区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; }
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) { ; } }
上述代码是单bank模式下往块基地址为0x08040000的扇区5上的读写示例程序。
posted on 2026-03-30 12:07 LiveWithACat 阅读(3) 评论(0) 收藏 举报
浙公网安备 33010602011771号