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即可正常工作。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值