STM32F1使用ST-LINK下载程序失败的解决方法
我们在使用如图1所示的迷你STLINK给STM32F1系列的单片机下载程序时,有时候会遇到无法下载程序的问题。如果你检查了线路连接,确实没有问题,就看看是不是下面将要介绍的这个问题引起的。

“第一次下载成功,第二次就下载不进去了”,很多人会遇到这种现象。
出现这个现象,大概率就是因为程序当中把SWD调试功能关闭了。
尤其是使用STM32CubeMX软件生成的程序,最容易出现这个问题。
默认的情况下,STM32CubeMX软件上对DEBUG功能是禁止的,如图2所示。

如果没有在这里打开SWD,那么在生成的工程代码中,就会在HAL_MspInit函数中,加入禁止SWD的语句,如下代码所示。
void HAL_MspInit(void)
{
/* USER CODE BEGIN MspInit 0 */
/* USER CODE END MspInit 0 */
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
/* System interrupt init*/
/** DISABLE: JTAG-DP Disabled and SW-DP Disabled
*/
__HAL_AFIO_REMAP_SWJ_DISABLE();
/* USER CODE BEGIN MspInit 1 */
/* USER CODE END MspInit 1 */
}
代码中,使用了__HAL_AFIO_REMAP_SWJ_DISABLE()把SWD给关闭了。所以在下载完程序以后,SWD禁止,第二次下载就不成功了。
解决办法也比较简单,下载的时候,按住复位键不要放,然后在KEIL中点击“下载”按钮,然后再放开复位键,程序就可以成功下载了。
如果你以后不想总是按复位键下载,在程序中去掉禁止SWD的语句就可以了。
如果你使用过STM32CubeMX软件做过其它工程,例如F4、L4等系列的,我们也没有在软件上打开SWD,但是还是可以使用这个迷你ST LINK下载程序,这是为什么呢?
这是因为F1系列的单片机使用AFIO的寄存器对SWD进行控制,而其它系列的单片机使用SYSCFG,他们的原理不一样。