序言
这个问题通常是由烧录设置不正确导致的。 我们需要理解STM32的编程与调试接口。常见的有SWD(Serial Wire Debug)和JTAG两种方式,它们都是通过特定的引脚与开发板连接,实现程序的下载和调试。在CubeMX中,我们需要配置这些接口的参数。如果没有进行配置,编译后的代码可能无法通过这些接口正确地写入到STM32的闪存中。
一、问题出现的环境
使用CubeMX自动生成HAL库的代码,System Core->SYS->Debug选择的是No Debug
在默认情况下这个选项的选择就是No Debug

二、原因分析
这个设置会导致在生成的stm32f1xx_hal_msp.c文件下的出现以下代码
__HAL_AFIO_REMAP_SWJ_DISABLE();
而这段代码表示禁用JTAG-DP和SW-DP(JTAG-DP和SW-DP是什么这里就不做过多说明了,自行百度)
其实CubeMX生成的注释就有明确的说明,只是一般没事不会去看它而已
三、根本解决办法
方法一
打开CubeMX工程,System Core->SYS->Serial Wire

方法二
有以上的分析解决方法也很明显了,改一下System Core->SYS->Debug选择就行。(SWD的话在这里的选择是Serial Wire或者Trace Asynchronous Sw)(代码一样的,详见下文)
这后面四个选项分别会生成以下四种代码,具体是什么注释说得很清晰了,就直接复制粘贴官方注释了
__HAL_AFIO_REMAP_SWJ_NOJTAG();
/*Serial Wire*//** NOJTAG: JTAG-DP Disabled and SW-DP Enabled*/
__HAL_AFIO_REMAP_SWJ_NONJTRST();
/*JTAG(4 pins)*//** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST*/
__HAL_AFIO_REMAP_SWJ_ENABLE();
/*JTAG(5 pins)*//** ENABLE: Full SWJ (JTAG-DP + SW-DP): Reset State*/
__HAL_AFIO_REMAP_SWJ_NOJTAG();
/*Trace Asynchronous Sw*//** NOJTAG: JTAG-DP Disabled and SW-DP Enabled*/
四、无法烧录解决办法
相信你都来看这个博客了那肯定是遇到了难烧录或者无法烧录的问题了。在这种情况下的烧录比较麻烦,需要有reset按钮或者自行短接。
方法一
将STM32上的BOOT0引脚从0模式切换到1模式,具体操作如图所示,BOOT1引脚保持不变。按照根本解决办法操作操作编译好代码后烧录下载。
烧录好修改后的代码后,将BOOT0跳线帽还原。

方法二
首先需要按住reset按钮再点下载,让其能识别到你的芯片,然后在马上要烧录程序的时候松开reset就行了。需要精准的把控松开的时间,基本上靠感觉是开始1s左右松开,很玄妙,自行把握一下。