STM32F1使用ST-LINK下载程序失败的解决方法

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

图1 迷你ST-LINK V2

“第一次下载成功,第二次就下载不进去了”,很多人会遇到这种现象。

出现这个现象,大概率就是因为程序当中把SWD调试功能关闭了。

尤其是使用STM32CubeMX软件生成的程序,最容易出现这个问题。

默认的情况下,STM32CubeMX软件上对DEBUG功能是禁止的,如图2所示。

图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,他们的原理不一样。