[STM32F1] STM32 SWD 只能下载一次的问题

[复制链接]
1093|2
 楼主| nefusmzj 发表于 2020-3-18 21:40 | 显示全部楼层 |阅读模式
STM32, IO, pi, AC, se
本帖最后由 nefusmzj 于 2020-3-18 21:59 编辑

STM32 SWD 只能下载一次的问题


市面常见的STM32核心板有很多,以STM32F103c8t6核心板为例,实物如下图:

image-20200318211304198.png


在核心板的使用过程中,常见的问题是只能通过swd方式下载1次程序,第2次便会报错,提示找不到处理器。

我们举个实际工程的例子:使用STM32CubeMX软件,生成Blink闪灯工程,即在Cube中设置PC13为GPIO-output,
image-20200318210939867.png


使用keil5打开工程,在main函数的while(1)中添加如下代码
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(100);
/* USER CODE BEGIN 3 */

编译,修改Debug选项为“Jlink”,设置中修改为SWD下载模式。
下载程序,可以成功。可再次下载时,却发现提示无法连接芯片,下载失败。

简单的解决办法是:
  • 调整BOOT0/1,使用串口ISP全片擦出,再恢复BOOT,重新上电即可下载;
  • 调整BOOT0/1,按Reset,使用SWD下载,还原BOOT0/1;
  • 有些板子也可以通过持续按住reset键实现下载。


但上述并不是我们想要的。
具体是哪里出了问题呢?

真正的解决办法是:
在使用STM32CubeMX生成项目工程时,需要关注一项系统配置,设置好Debug模式,具体如下:
TIM截图20200318205448.png
此时可以看到,右侧的芯片GPIO预览图,增加了SWDIO和SWCLK的指示。
image-20200318211651794.png
此时再用keil打开新生成的工程,即可无限次下载和Debug了。

有兴趣继续往后看
设置了SYS的Debug模式为Serial Wire模式,到底产生了哪些不同呢?
实际对比,我们发现共有两处

  • main.c文件的static void MX_GPIO_Init(void)函数中,增加了__HAL_RCC_GPIOA_CLK_ENABLE();这里很好理解,因为SWD下载方式用的引脚是PA13和PA14。
  • stm32f1xx_hal_msp.c文件的大概第77行左右,没有打开“Serial Wire”时,该行是__HAL_AFIO_REMAP_SWJ_DISABLE();,打开了“Serial Wire”是,该行是__HAL_AFIO_REMAP_SWJ_NOJTAG();。

综上所述,完全可以再不用重新配置CubeMX的情况下,通过修改上述两处代码,解决只能下载一次的问题。






mmuuss586 发表于 2020-3-24 10:26 | 显示全部楼层
哦,感谢分享
gx_huang 发表于 2020-3-24 10:31 | 显示全部楼层
不会这样吧?难道是工程默认关闭了SWD功能了?
我记得用ST的工具,通过SWD下载默认的LED闪烁程序,下载多次都可以的。也是淘宝上买的各种DEMO。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

148

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部