(一)问题描述
使用STM32CubeMX生成程序,然后将代码Download进板卡后,无法再次Download与Debug,魔术棒Debug配置中显示SW Device检测不到芯片,重新拔插J-Link也没有用,J-Flash也无法Connect。


(二)问题分析
①确认了J-Link与板卡下载口的接线是正确的,且线没有出现断路。
②用相同的J-Link向其它板卡Download程序,发现SW Device可以检测到芯片,那问题大概率就在板卡上。STM32芯片没有发烫,芯片应该没有损坏,难道是刚才下进去的代码有问题?
③只使能了一个引脚PA0用于外部中断测试,PA0也不是下载引脚,不存在引脚冲突。

④怀疑应该是刚才配置时忘了将Debug配置为Serial Wire导致的,将No Debug改为Serial Wire后重新生成程序,再次测试SW Device能否检测到芯片,依然检测不到。

⑤第一次可以下载,之后就不行了,怀疑问题大概率和第一次下进去的程序有关,擦除掉整片FLASH,看看能否下载程序,如果可以那问题就是程序导致的。但此时J-Link无法与STM32建立连接,该如何擦除整颗芯片的FLASH呢?
⑥上网查阅了一些资料,发现将芯片的BOOT0引脚接高电平,然后将芯片复位,再将BOOT0接回低电平,可以重新下载程序。

⑦ 按照这位道友的经验试了一下,发现J-Flash可以Connect芯片,KEIL中SW Device也可以检测到芯片了。此时我将芯片的FLASH全部擦除掉,将No Debug改为Serial Wire后重新生成的程序下载到板卡后发现之前的问题得到了解决。


⑧为了确认根本原因是在CubeMX将Debug配置为No Debug导致的,我又将未配置下载引脚的程序下载进了板卡,复现了之前的问题,现在可以盖棺定论了。
(三)深入分析
疑惑点:
3.1.No Debug模式没有配置下载引脚,为什么仍然可以下载一次程序?
我回忆了一下,这个板卡之前是可以正常下载程序的,也就是说之前软件配置的SWDIO和SWCLK的状态是好的,所以当时可以下载进去。
3.2.使用J-Link第一次下载成功之后SW Device检测不到芯片,是因为后来的软件配置了SWDIO和SWCLK的状态导致的。前后两次的差别在哪里?
我对比了前后配置为No Debug与Serial Wire的代码差异,发现在代码层面两者的差别仅在JTAG配置。




3.3为什么通过将芯片的BOOT0引脚接高电平,然后将芯片复位,再将BOOT0接回低电平,可以重新下载程序?

简单来说,把BOOT0拉高再按下复位键,系统启动了BootLoader,此时用户可以下载程序。