我在STMicroelectronics STM32F072B-Disco“发现”板上使用MDK-Lite版本5.23,并且尝试使用发现示例提供的Flash示例。对于其他示例,我已经编码了一些SPI和GPIO工作。 IDE的工作原理就像冠军。但是,对于这个特定项目,我可以通过下载并使用“重置”按钮来构建代码并运行它。一旦使用HAL_FLASHEx_Erase()例程,就无法在项目上使用调试器。一旦执行了该例程,IDE就会弹出一个对话框“无法访问目标。正在关闭调试会话。”

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


如果我在main.c中跳过了这一行, >
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)


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


评论

不确定,但也许CMSIS-DAP的USB端已重启电源。该板的外部调试组件的电源分配相当复杂。无法访问目标,可能意味着与DAP的连接(通过串行线)已断开。

我们是在谈论将板载ST-LINK / V2用作调试器吗?

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

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

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

#1 楼

我的猜测是,这在某种程度上与电源有关。

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

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

值得注意的是,闪存擦除会增加设备的电流消耗-您的外部PSU是否达到

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

通过使用断点(和轮询暂停状态)来实现跨步,而硬件中支持单步。这仍然不能解释为什么调试器似乎会感到困惑,但是确实允许调试器在Flash控制器处于活动状态时尝试访问代码(从Flash)。根据这些观察结果,建议您在擦除后设置一个断点,并尝试避免触发这种情况。

评论


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

– netskink
17年3月30日在11:51

如果在执行闪存访问时正在运行代码,则将使AHB死锁一段时间。我想想在这种情况下踩踏可能会很混乱。 stackoverflow.com/questions/3445598还有更多。

– Sean Houlihane
17 Mar 30 '17 at 11:56