STM32
直播中

刘丽

7年用户 1273经验值
私信 关注
[问答]

为什么使用FLASH_ErasePage函数会擦除不应该被擦除的代码段呢?

我的代码是这样的:

我在给ARM弄IAP的时候,我希望擦除的是0x8008000到0x8048000之间的APP段,但是在用Keil5和STlink仿真的时候,发现Bootloader段的首段代码从0x8000000也被擦除了一页(0x800大小),导致debug模式不能正常运行了。
不知道是为什么,有人能帮忙解答吗?



回帖(1)

张虎豹

2024-3-15 15:23:33
使用FLASH_ErasePage函数会擦除页面中的所有内容,包括代码段和数据段。你遇到的问题可能是由于Flash的页大小是固定的,在擦除时没有考虑到代码段的起始地址和页的边界对齐。在你的情况下,代码段的起始地址不是页的起始地址,所以会导致代码段被擦除。

解决这个问题的一种方法是先计算出需要擦除的页的起始地址和结束地址,然后逐页擦除。具体的做法可以参考以下示例代码:

```c
#define FLASH_PAGE_SIZE 0x800 // Flash页的大小
#define APP_START_ADDR 0x8008000 // APP段的起始地址
#define APP_END_ADDR 0x8048000 // APP段的结束地址

void flash_erase_app_segment(void) {
    uint32_t addr = APP_START_ADDR;
    FLASH_EraseInitTypeDef erase_init;
    uint32_t page_error;
  
    // 擦除每一页
    while (addr < APP_END_ADDR) {
        erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
        erase_init.PageAddress = addr;
        erase_init.NbPages = 1;

        HAL_FLASHEx_Erase(&erase_init, &page_error);

        addr += FLASH_PAGE_SIZE;
    }
}
```

这样做的好处是可以确保只擦除了需要擦除的页面,而不会影响其他代码段的内容。
举报

更多回帖

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