Keil uVision MDK-Lite、STM32F072B-Discovery 板和闪存 API

物联网 stm32
2021-06-24 01:00:48

我将 MDK-Lite 5.23 版与 STMicroelectronics STM32F072B-Disco“Discovery”板一起使用,并且我正在尝试使用 Discovery 示例提供的 Flash 示例。

我已经将此板和工具链用于其他示例,并且我编写了一些 SPI 和 GPIO 工作。IDE 的工作方式非常出色。但是,对于这个特定的项目,我可以构建代码并通过下载和使用重置按钮来运行它。一旦我使用 HAL_FLASHEx_Erase() 例程,我就无法在项目上使用调试器。执行该例程后,IDE 会弹出一个对话框“无法访问目标。关闭调试会话”。

就其价值而言,我知道这不是编程错误,因为如果我下载代码然后按重置按钮执行代码,它将起作用。我在 TI 板上使用了相同的调试器,它也能够对闪存进行编程并执行闪存例程。我很确定我不会擦除存储代码的闪存部分,所以不是那样。

如果我在 main.c 中跨过这条线

if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)

然后它删除调试会话。如果我改为进入同一行,然后跳过闪存擦除例程中的每个调用,那么它将起作用并最终跳出例程,我可以调试其余代码。

1个回答

我的猜测是,这在某种程度上与电源有关。外部电源或电源轨的板载开关。

为了澄清这种情况,硬件重置后调试工作正常,但是当您的目标擦除闪存块时,调试连接会断开吗?

调试不关心代码是否正确运行 - 您可能处于锁定状态,停止调试应该仍然有效。CPU 端唯一锁定调试的是死锁的 AHB 访问。这意味着问题要么出在 STM32F7 之间的 SWD 接口上,要么出在板载 USB-SWD 接口芯片(我猜也是 STM32)上。该设备具有一些板载电源轨开关,这让我第一次使用该板时感到困惑。

值得注意的是,闪存擦除会增加设备的电流消耗 - 您的外部 PSU 是否能胜任这项工作,您可以使用替代方案吗?

编辑:根据您的反馈,单步执行相关代码会导致调试器崩溃,而单步执行不会,我认为您的问题与此问题有关

步进是通过使用断点(和轮询暂停状态)实现的,而硬件支持单步。这仍然不能解释为什么调试器似乎变得混乱,但确实允许调试器在闪存控制器处于活动状态时尝试访问代码(从闪存)。

基于这些观察,我建议您在擦除设置断点,并尽量避免触发这种情况。