STM32CubeIDE只能刷一次,没有SWD调试

Posted

技术标签:

【中文标题】STM32CubeIDE只能刷一次,没有SWD调试【英文标题】:STM32CubeIDE can only flash once, no SWD debugging 【发布时间】:2020-07-04 17:52:58 【问题描述】:

几年来,我一直在使用 mbed 在线编译器创建 .bin 文件,然后像这样使用 ST-LINK/V2 USB 加密狗在命令行中刷新它们,一切正常:

st-flash write 01_blink.NUCLEO_F103RB.bin 0x8000000

今天我下载了 STM32CubeIDE for Linux (Fedora 30) 并开始学习本教程,使用的是 maple mini (STM32F103CBT6)。

https://www.digikey.co.nz/en/maker/projects/getting-started-with-stm32-introduction-to-stm32cubeide/6a6c60a670c447abb90fd0fd78008697

在构建项目并开始调试运行后,我得到了输出:

STMicroelectronics ST-LINK GDB server. Version 5.3.2
Copyright (c) 2019, STMicroelectronics. All rights reserved.

Starting server with the following options:
        Persistent Mode            : Disabled
        Logging Level              : 1
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Disabled
        SWD Debug                  : Enabled

Waiting for debugger connection...
Debugger connected
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.2.0                  
      -------------------------------------------------------------------



Log output file:   /tmp/STM32CubeProgrammer_2ZxzGk.log
ST-LINK SN  : 34006B063058373138650943
ST-LINK FW  : V2J34S7
Voltage     : 3.21V
SWD freq    : 4000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x410
Device name : STM32F101/F102/F103 Medium-density
Flash size  : 64 KBytes
Device type : MCU
Device CPU  : Cortex-M3



Memory Programming ...
Opening and parsing file: ST-LINK_GDB_server_Q2zZSF.srec
  File          : ST-LINK_GDB_server_Q2zZSF.srec
  Size          : 4648 Bytes
  Address       : 0x08000000 


Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 4]
Download in Progress:


File download complete
Time elapsed during download operation: 00:00:00.595



Verifying ...




Download verified successfully 


Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Target is not responding, retrying...
Error! Failed to read target status 
Debugger connection lost.
Shutting down...

之后我无法再启动调试会话,因为我得到了这个:

我可以看到 LED 按预期闪烁,所以我知道程序实际上已经闪到板上了。但是我无法对 STM32CubeIDE 做任何进一步的事情,当我像以前一样尝试通过命令行进行闪存时,现在这也不起作用:

[root@localhost Downloads]# st-flash write 01_blink.NUCLEO_F103RB.bin 0x8000000 
st-flash 1.5.1-38-gc3577b5
2020-03-24T13:51:09 INFO common.c: Loading device parameters....
2020-03-24T13:51:09 WARN common.c: Invalid flash type, please check device declaration
  core status: unknown
Unknown memory region

幸运的是,我可以使用 ST-Link UTILITY(在 Windows 上)并在连接前按住重置按钮,然后执行完全擦除,如此处所述:

http://www.kerrywong.com/2012/08/02/the-dreaded-cannot-connect-to-st-link-error-message/

但显然,这不是完成任何生产性开发的可行情况。我做错了什么?

在“调试配置”对话框的“调试器”选项卡中,我尝试将“接口”设置为 SWD(实际上已经如此),并且我还尝试了“重置行为”的所有选项,但没有任何变化结果。

【问题讨论】:

【参考方案1】:

为什么总是这样?我在某事上挣扎了几个小时,然后再花 20 分钟用屏幕截图等尽可能简洁明了地提出问题,然后在发布后两分钟我找到了答案,通常是在另一个我不知何故在几个小时内从未见过的 SO 答案中搜索。我认为我在 SO 上提出的问题中有一半以这种方式结束。

问题似乎是,除非您声明要使用 SWD 以及在哪些引脚上,否则默认情况下不会启用它。因此,一旦刷新新程序,SWD 连接就会失效。我猜 mbed 程序默认在标准引脚上保留了 SWD 的使用,所以这从来不是问题。

无论如何要避免这种情况,请返回引脚和配置(在项目资源管理器中双击 .ioc 文件)。为 SWD 设置适当的引脚(在我的情况下为 PA13、PA14),然后在“系统核心”下,单击 SYS 并将调试选项设置为“串行线”。

【讨论】:

请注意:此行为是 CubeMX 的默认行为。实际上,在上电时,硬件将这些引脚设置为 SWD 和 JTAG 引脚。因此,默认情况下它们正在编程引脚,但 Cube 框架在初始化期间禁用它们。 看起来对于 STM32F3DISCOVERY 板,PC4 引脚需要设置为 TX,PC5 引脚需要在 Pinout 视图中设置为 RX。我从 STM32F3DISCOVERY 套件的 UM1570 用户手册第 15/36 页的第 6.2.3 节推断出这一点。这对我来说几乎只是魔术手,但这个答案帮助我偶然发现了一些似乎有效的东西。 st.com/content/ccc/resource/technical/document/user_manual/8a/… 另见本指南讨论 SWD 标头,stm32-base.org/guides/connecting-your-debugger.html【参考方案2】:

是的,这是正确的 iforce2d。 启用串行线调试后,您现在可以将新程序闪存到电路板(IDE 内部),而无需先使用 ST-Link 实用程序擦除所有内容。

按照以下步骤操作:

    将 BOOT0 引脚连接到高电平 (3.3v) – Blue Pill 板为此提供了一个方便的跳线。 (不确定 maple mini) 按下重置按钮。 构建并运行您的新程序(在 STM32CubeIDE 中)。 将跳线归零。

一旦您在 STM32 中有一个启用了 SWD 引脚的程序,您将不再被“锁定”,因此您无需在此之后再次使用 BOOT0(或复位)...

注意:调试配置(最适合我):调试探针 = ST-LINK (OpenOCD) ;重置模式 = 软件系统重置

【讨论】:

"重置模式 = 软件系统重置。"为我工作 “软件系统重置”为我做了。我已经在 STM32CubeIDE (1.6.0) -> Debug Configurations -> Debugger tab -> Reset Behavior 中应用了它。【参考方案3】:

在我的案例(STM32F429I-DISC)中,我发现 SWD 中使用的一个引脚被我错误地分配用于其他目的。我发布了它并调试开​​始工作。我刚刚找到了 ST 板的原理图,并检查了 SWD 使用了哪些引脚。

【讨论】:

以上是关于STM32CubeIDE只能刷一次,没有SWD调试的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32CubeIDE实现打印输出功能

基于STM32CubeIDE实现打印输出功能

如何利用stm32cubeide的原有工程改写代码

STM32CubeIDE 在地址“xxx”处中断,没有可用的调试信息,或在程序代码之外

STM32的SWD调试进不了main函数

stm32cubeide调试窗口用不了