STMG0B1RCT6擦除Flash遇到单片机直接崩溃,无法连接解决方案
1.现象
在使用擦除函数时,碰到直接跑死的情况,此时单片机的自定义的运行灯不闪烁,甚至使用STlink无法再次连接,现象有点像芯片被锁。
代码如下:
if(App_ExtCanBootErasePage(FW_BACKUP_START_ADDRESS, FW_BACKUP_END_ADDRESS) == HAL_OK)
{
s_u8FwUpFlag = 0;
}
else
{
s_u8FwUpFlag = 1;
}
HAL_StatusTypeDef App_ExtCanBootErasePage(u32 StartPageAddr, u32 EndPageAddr)
{
u32 i;
u32 FirstPage = 0, NbOfPages = 0, BankNumber = 0;
u32 PAGEError = 0;
HAL_StatusTypeDef FLASHStatus = HAL_OK;
FLASH_EraseInitTypeDef EraseInitStruct;
//FLASH_Unlock();
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
/* Get the 1st page to erase */
FirstPage = Lib_CommonFunctionFlashGetPage(StartPageAddr);
/* Get the number of pages to erase from 1st page */
NbOfPages = Lib_CommonFunctionFlashGetPage(EndPageAddr) – FirstPage + 1;
/* Get the bank */
BankNumber = Lib_CommonFunctionFlashGetBank(StartPageAddr);
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; // 刷除方式
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage; // 起始地址
EraseInitStruct.NbPages = NbOfPages;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
FLASHStatus = HAL_ERROR;
}
//FLASH_Lock();
HAL_FLASH_Lock();
return FLASHStatus;
}
u32 Lib_CommonFunctionFlashGetPage(u32 Addr)
{
uint32_t page = 0;if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
{
/* Bank 1 */
page = (Addr – FLASH_BASE) / FLASH_PAGE_SIZE;
}
else
{
/* Bank 2 */
page = (Addr – (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
}return page;
u32 Lib_CommonFunctionFlashGetBank(u32 addr)
{
return FLASH_BANK_1;
}
2.原因
因为GetPage与GetBank是从官方的开发板上移植过来的代码,没有仔细查看代码就直接拿来用了,但是经过仔细检查发现,在getbank的函数中,官方给的函数直接返回bank1,但是经过查阅文档可以看到我采用的这款stm32G0B1RCT6是256K的,里面有两个bank,需要根据你想要擦除的区域选择对应的bank。具体分区如下图所示:
将其换成bank2即可正常工作。
作者:月上神明ꦿེ໑