根据您提供的信息,问题可能出现在复位之后没有正确初始化数组的位置。
在STM32F407中,const修饰的数组默认存储在Flash存储器中。而在您的代码中,您使用了`__attribute__((at(0x08020000)))`将数组的地址定义在Flash空间的0x08020000位置。这是合法的,但需要确保该地址是有效的Flash地址。
在复位后,芯片会重新初始化,可能会导致程序无法正确访问该地址,从而导致程序运行异常。为了解决这个问题,您可以在复位后重新初始化这个数组的位置。
您可以在复位之后,通过检查Flash是否被正确擦除,确定是否执行了擦除操作。您可以使用以下代码检查Flash的擦除状态:
```
void checkFlashEraseStatus() {
FLASH_Status eraseStatus;
eraseStatus = FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3);
if (eraseStatus != FLASH_COMPLETE) {
// 擦除失败,执行相应操作
}
}
```
另外,尽量避免在中断中执行耗时较长的操作,以免影响程序的正常运行。您可以将擦除Flash的操作放在其他地方执行,比如在主循环中定期检查是否需要擦除Flash。
希望以上信息能解决您的问题。如果您还有其他疑问,请随时追问。
根据您提供的信息,问题可能出现在复位之后没有正确初始化数组的位置。
在STM32F407中,const修饰的数组默认存储在Flash存储器中。而在您的代码中,您使用了`__attribute__((at(0x08020000)))`将数组的地址定义在Flash空间的0x08020000位置。这是合法的,但需要确保该地址是有效的Flash地址。
在复位后,芯片会重新初始化,可能会导致程序无法正确访问该地址,从而导致程序运行异常。为了解决这个问题,您可以在复位后重新初始化这个数组的位置。
您可以在复位之后,通过检查Flash是否被正确擦除,确定是否执行了擦除操作。您可以使用以下代码检查Flash的擦除状态:
```
void checkFlashEraseStatus() {
FLASH_Status eraseStatus;
eraseStatus = FLASH_EraseSector(FLASH_Sector_5, VoltageRange_3);
if (eraseStatus != FLASH_COMPLETE) {
// 擦除失败,执行相应操作
}
}
```
另外,尽量避免在中断中执行耗时较长的操作,以免影响程序的正常运行。您可以将擦除Flash的操作放在其他地方执行,比如在主循环中定期检查是否需要擦除Flash。
希望以上信息能解决您的问题。如果您还有其他疑问,请随时追问。
举报