TI论坛
直播中

王兰

14年用户 943经验值
擅长:基础元器件
私信 关注
[问答]

STM32G0B1VC IAP时flash擦除函数进不去是怎么回事?


  • 您好,我在使用STM32G0B1VC做IAP功能时遇到一个很奇怪的现象,我为Bootloader分配了0x08000000~0x0800FFFF共64KB的大小,为出厂程序分配了0x08010000~0x0801FFFF共64KB的大小,为之后的程序更新分配了0x08020000~0x0803FFFF共128KB的大小,在更新0x08020000~0x0803FFFF区域前,我需要先对这部分区域进行擦除,但总是擦除函数打断点却进不去,查阅网上资料也没头绪,请问可能是什么原因?是需要解除写保护?但是当该区域全部为FF的状态下又能写成功,求请教。
    HAL_StatusTypeDef FLASH_If_Erase(uint32_t start)
    {
    uint32_t NbrOfPages = 0;
    uint32_t PageError = 0;
    FLASH_EraseInitTypeDef pEraseInit;
    HAL_StatusTypeDef status = HAL_OK;

    HAL_FLASH_Unlock();

    NbrOfPages = (FLASH_START_ADRESS + FLASH_SIZE);
    NbrOfPages = (NbrOfPages - start) / FLASH_PAGE_SIZE;
    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbPages = NbrOfPages; //64
    pEraseInit.Page = LASH_PAGE_NBPERBANK - pEraseInit.NbPages;//128-64=64
    pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
    status = HAL_FLASHEx_Erase(&pEraseInit, &PageError);

    HAL_FLASH_Lock();
    return status;
    }

回帖(1)

陈杰

2024-11-15 18:20:30
根据您的描述,您在使用STM32G0B1VC进行IAP(In-Application Programming)功能时遇到了Flash擦除函数无法进入的问题。以下是一些可能的原因和解决方案:

1. 检查Flash擦除函数的参数是否正确:
确保您传递给擦除函数的起始地址(start)是正确的,并且位于您分配的0x08020000~0x0803FFFF区域内。如果地址不正确,可能会导致擦除函数无法进入。

2. 检查Flash擦除函数的实现是否正确:
确保您的擦除函数实现是正确的,特别是在计算需要擦除的页面数量和擦除页面时。如果实现有误,可能会导致擦除函数无法进入。

3. 检查Flash写保护状态:
确保您没有启用Flash写保护。如果启用了写保护,您需要先解除写保护,然后才能进行擦除操作。您可以使用以下代码解除写保护:

```c
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
HAL_FLASH_OB_Launch();
```

4. 检查Flash擦除操作是否受到其他中断或任务的影响:
确保在执行Flash擦除操作时,没有其他中断或任务干扰。如果有干扰,可能会导致擦除函数无法进入。

5. 检查Flash擦除操作是否受到时钟配置的影响:
确保您的时钟配置正确,特别是Flash时钟。如果时钟配置不正确,可能会导致擦除操作失败。

6. 检查Flash擦除操作是否受到电压的影响:
确保您的系统电压在允许的范围内,因为电压过低可能会导致Flash擦除操作失败。

7. 检查Flash擦除操作是否受到温度的影响:
确保您的系统温度在允许的范围内,因为温度过高或过低可能会导致Flash擦除操作失败。

综上所述,您需要逐一排查这些可能的原因,以找到导致Flash擦除函数无法进入的根本原因。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分