STM32F407VE 擦除扇区问题

问题描述 投票:0回答:1

没关系...

我搬起石头砸了自己的脚。我没有正确选择所有选项,程序最终删除了自己的一部分。

\\\\\\\\\\\\\\\\\

我正在做裸机引导加载程序,在擦除闪存扇区时出现一些奇怪的结果。我找到了解决方法,但我想知道根本原因。

我从这个循环开始:

#define APP_first_sector 2
#define LAST_SECTOR 7
HAL_FLASH_Unlock();
for (uint32_t i =  APP_first_sector; i <= LAST_SECTOR; i++) {
  FLASH_Erase_Sector(i, VOLTAGE_RANGE_3);
}
HAL_FLASH_Lock();

结果有时它可以工作,但需要几分钟才能完成,有时它会擦除前两个或三个扇区(扇区 2、3 和 4),然后丢失。

在循环中添加打印语句似乎解决了这两个问题。

#define APP_first_sector 2
#define LAST_SECTOR 7
HAL_FLASH_Unlock();
for (uint32_t i =  APP_first_sector; i <= LAST_SECTOR; i++) {
  print("Erasing sector: %d\n",(uint16_t)i);
  FLASH_Erase_Sector(i, VOLTAGE_RANGE_3);
}
HAL_FLASH_Lock();

几天前,我回到项目中,在另一个区域进行了一些更改,发现它现在会擦除扇区 2,3 & 4 然后挂起。取消更改并不能解决问题。

hang原来是在sprintf函数中。它正在处理 va_args 列表,但从未找到结尾。

我能够通过在擦除扇区命令后执行的所有打印语句中添加一个 ' ' 来解决这个问题。这显式地将终止代码添加到 va_args 列表中,但会给出编译警告。

print("Erasing sector: %d\n\0",(uint16_t)i);

系统中唯一活跃的中断是Systick。填充所有异常和 isr 向量。只有复位和硬故障具有独特的处理程序。所有其他人都回来了。

我试过在循环中添加延迟,将 LOCK/UNLOCK 移动到循环中,将打印放在擦除命令之后,添加“忙时”循环,但没有任何影响行为。

发现在进行扇区擦除时,所有FLASH访问都被暂停。由于这是在 FLASH 之外执行的,因此程序会停止。我假设计时器/时钟仍在继续。

flash erase stm32f4 sector
1个回答
0
投票

无意的自修改代码不好!

© www.soinside.com 2019 - 2024. All rights reserved.