Keil uVision MDK-Lite,STM32F072B-发现板和闪存API


10

我在STMicroelectronics STM32F072B-Disco“发现”板上使用MDK-Lite版本5.23,并且尝试使用发现示例提供的Flash示例。

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

对于它的价值,我知道这不是编程错误,因为如果我下载代码,然后通过按复位按钮执行代码,它将起作用。我在TI板上使用了相同的调试器,它还能够对闪存进行编程并执行闪存例程。我敢肯定,我不会擦除闪存中存储代码的部分,所以不是那样。

如果我在main.c中跨过这一行

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

然后它将删除调试会话。如果我改为进入同一行,然后逐步执行Flash擦除例程中的每个调用,则它将起作用并最终退出该例程,并且我可以调试其余代码。


不能确定,但​​是CMSIS-DAP的USB端已重新通电。该板的外部调试组件的电源分配相当复杂。无法访问目标可能意味着到DAP的连接(通过串行线)已断开。
肖恩·胡利哈内

我们是在谈论板载ST-LINK / V2作为调试器吗?
Bence Kaulics'Mar

如果您可以共享代码映像,则其他人可能可以验证(并排除硬件问题)。我自己只有一个M7板...
肖恩·霍利哈内

Bence Kaulics,其调试器内置于stm32f072B-disco板上。它是ST-Link调试器,而不是ST-LINK / V2的Keil ULINK2调试器。我有一个与Keil USB连接的调试器,但它通过带状电缆连接到了开发板上。我在板上使用的是微型USB ST-Link连接器,而不是带状电缆连接器。该开发板从mini-usb连接器而非单独的电源供电。
netskink

1
关于代码示例。该示例由意法半导体的发现仓库提供。ST仓库中的项目路径为Projects / STM32F072B-Discovery / Examples / FLASH / FLASH_EraseProgram。我在该目录中使用MDK-ARM项目。它在执行HAL_FLASHEx_Erase()的第108行失败
netskink

Answers:


7

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

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

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

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

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

通过使用断点(和轮询暂停状态)来实现跨步,而硬件中支持单步。这仍然不能解释为什么调试器似乎会感到困惑,但是确实允许调试器在Flash控制器处于活动状态时尝试访问代码(从Flash)。

根据这些观察结果,建议您在擦除设置一个断点,并尝试避免触发这种情况。


正确,它工作正常,但是当我擦除一个块时,与调试器的USB连接断开。我使用的是无电源的USB集线器,因此这似乎合乎逻辑。但是,直接连接到计算机并使用其他集线器可获得相同的结果。
netskink

如果在执行闪存访问时正在运行代码,则将使AHB死锁一段时间。我想象在这种情况下踩踏可能会很杂乱。stackoverflow.com/questions/3445598还有更多。
肖恩·霍利哈内
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.