我创建了一个带有
STM32F207 控制器的自定义
PCB。有了这个板,我想使用 SWD 解决不同的目标。我的目标是 STM32F407 和 STM32L431 控制器。我在我的 F207 控制器上实现了一个带有定时器和 DMA 的自定义 SWD 接口,现在我可以通过它们的内置 SWD 接口与我的目标交谈。例如,我可以读取目标的 UniqueID 或写入它们的闪存。
但是我对闪存的批量擦除有疑问。使用 F407,闪存整体擦除工作正常。大约用了 8 秒,然后孔闪光灯变空了。但在 L431 上它不会工作。
写入 L431 的空闪存工作正常。
我采取以下步骤来执行闪存的批量擦除:
- 解锁对闪存寄存器的写访问(有效,因为不再设置 LOCK 位,我可以写入闪存)。
- 然后我检查闪存状态寄存器中的 BSY 位是否已设置。设置好后,我等到它被清除。
- 然后我清除 FLASH_ACR 寄存器中的 ICEN 和 DCEN 位。参考手册中没有提到这一点,但ST在HAL函数中是这样做的。但是删不删都没有关系,删flash都不行。
- 现在我正在清除闪存状态寄存器中的每个错误位
- 设置flash控制寄存器中的MER1位(然后读出flash控制寄存器检查该位是否已设置)
- 最后设置 FLASH_CR 寄存器中的 STRT 位
在 F407 上,此例程运行良好。设置 STRT 位后,大约需要 8 秒。直到 BSY 标志被清除。另一方面,对于 L431,整体擦除只需要 22 毫秒(根据 ST 的介绍)。但它根本不起作用。
PGSERR 位也在 L431 的 FLASH_SR 寄存器中设置。我不明白这个上下文中的位,因为我不想写,我想删除。
有任何想法吗?