STM32CubeIDE只能烧录一次,无法进行SWD调试。

13

几年来,我一直在使用mbed在线编译器创建.bin文件,然后像这样在命令行中使用ST-LINK/V2 USB小型设备进行烧录,一切都无缝运行:

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

今天我下载了适用于Linux(Fedora 30)的STM32CubeIDE,并开始按照这个教程使用枫叶迷你(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...

之后我无法启动调试会话,因为我收到了这个错误信息:

enter image description here

我可以看到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(实际上已经是),并且我也尝试了所有“复位行为”的选项,但结果没有改变。

3个回答

25

为什么这总是发生?我花费几个小时努力解决一个问题,然后再花20分钟做出简明清晰的问题描述并配上屏幕截图等,然后发布两分钟后就会发现答案,通常在另一个SO答案中,而在搜索了数小时后,我竟然从未看到过。我想我在SO上提的问题中有一半都是这样结束的。

问题似乎是,除非您声明要使用SWD及其引脚,否则它将不会默认启用。所以,只要新程序被烧录,SWD连接就会中断。我想mbed程序默认保留在标准引脚上使用SWD,因此那里从来没有出现过这个问题。

为避免这种情况,返回引脚和配置(在项目资源管理器中双击.ioc文件)。设置SWD的适当引脚(在我的情况下为PA13,PA14),在“System Core”下,单击SYS并将Debug选项设置为“Serial Wire”。

输入图片描述


2
请注意:这是CubeMX的默认行为。实际上,在上电时,硬件将这些引脚设置为SWD和JTAG引脚。因此,默认情况下它们是编程引脚,但是在初始化期间,Cube框架会禁用它们。 - Tagli
看起来对于STM32F3DISCOVERY板,需要在引脚图中将PC4引脚设置为TX,将PC5引脚设置为RX。我从STM32F3DISCOVERY套件的UM1570用户手册第15/36页的6.2.3节中推断出这一点。对我来说,这几乎就像是魔法般的手势,但这个答案帮助我偶然发现了一些似乎有效的东西。https://www.st.com/content/ccc/resource/technical/document/user_manual/8a/56/97/63/8d/56/41/73/DM00063382.pdf/files/DM00063382.pdf/jcr:content/translations/en.DM00063382.pdf - Richard Chambers
请参阅有关SWD头的指南,https://stm32-base.org/guides/connecting-your-debugger.html。 - Richard Chambers

4

是的,如果你启用了Serial Wire-Debug,你现在可以在STM32CubeIDE中将新程序烧录到板子上而不需要先使用ST-Link Utility擦除所有内容。

按照以下步骤操作:

  1. 将BOOT0引脚连接到高电平(3.3v)——Blue Pill板有方便的跳线插座。(不确定Maple Mini是否有)
  2. 按下复位按钮。
  3. 在STM32CubeIDE中构建和运行您的新程序。
  4. 将跳线插座返回零位置。

一旦你在STM32中有一个使SWD引脚启用的程序,那么你就不再被“锁定”了,因此你之后不需要再使用BOOT0(或重置)...

注意:调试配置(我认为最好的): 调试探针 = ST-LINK (OpenOCD) ; 重置模式 = 软件系统复位


重置模式 = 软件系统重置。这对我起作用了。 - DavidW
"软件系统重置" 对我很有帮助。我已经在STM32CubeIDE(1.6.0)中应用它 -> 调试配置 -> 调试器选项卡 -> 重置行为。 - Nick Alexeev

2

在我的情况下(STM32F429I-DISC),我发现我错误地将用于SWD的其中一个引脚分配给了其他用途。我释放了它,调试开始工作。我只是找到了ST板的原理图并检查了哪些引脚用于SWD。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接