使用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;
}
}
```
这样做的好处是可以确保只擦除了需要擦除的页面,而不会影响其他代码段的内容。
使用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;
}
}
```
这样做的好处是可以确保只擦除了需要擦除的页面,而不会影响其他代码段的内容。
举报