STM32F103的程序烧写与过程中的常见问题

1. 准备工作

1.1 硬件准备

需要准备的硬件:

  • 百问网STM32F103开发板;
  • ST-Link调试下载器;
  • ST-Link转接板;
  • ST-Link转接板适配的排线;
  • MicroUSB线;
    12V DC电源适配器和电脑;

1.2 软件准备

需要安装的软件:

  • ST-Link驱动;
  • 串口驱动(win10自动安装、win7可能需要自行安装);
  • Keil MDK:www.keil.com
  • STM32CubeProgrammer: www.st.com

1.3 硬件连接

  • ST-Link下载器和转接板相连,转接板和开发板之间使用适配的排线连接起来,最后再将ST-Link的
    USB线接入电脑;
  • MicroUSB连接开发板的USB Debug处,另一端接入电脑;
  • 12V DC电源适配器接入开发板的DC 12V处的圆孔,另一端插到220V供电处;
    如图:

2. 程序烧写

对于ST的处理器而言,可以使用类似于ST-Link这样的调试下载器进行程序烧写,也可以使用串口、
USB或OTA进行程序烧写,其中ST-Link、J-Link、串口是比较常用的几种方式,这里只对ST-Link和串口
烧写进行演示。
烧写程序也有许多种软件,比较常用的是使用集成开发环境中的烧写功能烧写程序,或者使用这款
处理器官方支持的烧写工具进行程序烧写。对于ST的处理器,支持程序烧写的软件有Keil MDK、IAR、
STM32CubeIDE、STM32CubeProgrammer等,这里只再Keil MDK和STM32CubeProgrammer两个软
件下进行演示。

2.1 使用MDK烧写程序

使用MDK烧写程序,只能通过ST-Link实现,无法通过串口烧写程序。
在烧写程序前,首先要确保的三件事:

  • 芯片正常上电且能正常工作;
  • ST-Link已经和芯片正确连接,且没有接触不良的情况;
  • MDK中的程序已经成功编译,没有报错;
    然后就可以点击MDK中的“Load”或者使用快捷键(默认是F8)将编译好的程序烧写到芯片中了,烧写成
    功会有提示。烧写完成后将开发板复位或者重新上电,让程序运行。

2.1.1 ST-Link没有正确连接的提示

image
image
这种情况下:

  • 检查ST-Link的USB线和电脑是否正常连接;
  • 检查ST-Link的灯是否亮的是红灯,正常情况下是红灯,处于运行中会是绿灯,异常则是红绿闪
    烁,重新将ST-Link在电脑那段插拔下,重启ST-Link;

2.1.2 芯片没有上电就使用MDK的load烧写程序的提示

image
image
出现这个提示,首先检查芯片是否正常上电了,如果芯片正常供电,那就参考后面的2.1.3 提示STLink
找不到处理器该如何处理章节。

2.1.3 提示ST-Link找不到处理器该如何处理

芯片已经正常供电,且ST-Link也将芯片和电脑正确连接,ST-Link也亮的是红灯,但是还是弹出了
和2.1.2节那样的提示框,出现这种情况,有两种可能:

  • 芯片坏了,需要去排查硬件原因;
  • 芯片的SWD引脚被复用成为其它功能了,在程序运行过程中无法再通过SWD引脚进行程序调试或
    者下载了;
    这里主要说明第二点,硬件原因有太多可能性了,无法演示。
    出现第二种情况,目前最常见的情况是烧写了使用STM32CubeMX生成的工程后,就会出现第二种
    情况,原因会在视频中复现,推荐的解决方式是使用STM32CubeProgrammer+UART将芯片的内部
    Flash整篇擦除,详见2.2章。

2.2 使用STM32CubeProgrammer烧写程序

STM32CubeProgrammer这个软件支持多种接口,多种格式的二进制文件。这里主要演示ST-Link
和UART,烧写的二进制文件则是hex文件。

2.2.1 使用ST-Link连接芯片

在STM32CubeProgrammer软件中,使用ST-Link将芯片和电脑连接起来,可以忽视处理器的启动
方式,任意启动方式均可。但是如果上电后,芯片运行的程序会将SWD引脚复用成其他功能,那么STLink
是无法连接成功的,需要参考2.2.2小节。
在烧写程序前,首先要确保的三件事:

  • 芯片正常上电且能正常工作;
  • ST-Link已经和芯片正确连接,且没有接触不良的情况;
  • SWD引脚没有被复用成为其他功能;
    随后在软件中,接口选择ST-Link,参数默认就好,然后点击connect连接芯片,

2.2.2 使用UART连接芯片

在STM32CubeProgrammer软件中,使用UART连接芯片,需要将芯片的启动方式改为从System启
动,也就是红色开发板上的红色拨码开关[1, 2]设置为[ON, OFF],如图:

在烧写程序前,首先要确保的三件事:

  • 芯片正常上电且能正常工作;
  • 启动方式已经改为从System启动;
    然后在软件中接口选择UART,参数默认,再点击connect连接芯片:

2.2.3 擦除

STM32CubeProgrammer支持擦除整片Flash的内容,也支持擦除Flash中指定扇区的内容。擦除动
作需要再芯片通过ST-Link或者UART正常连接后才可以进行。

2.2.4 从内部Flash的起始地址开始烧写程序

  • 需要注意的是,选择的要烧写的二进制文件不能保存在中文路径中,如果文件被保存在中文路径
    下,使用STM32CubeProgrammer点击download或者start programmer后,软件会闪崩。
    ① 方法1
  • 选择文件

可以选择Open file或者边上的+号选择文件:

支持很多种二进制文件,我们这里选择hex文件。

这里有提示烧写的起始地址、文件大小和数据宽度,然后点击Download,将选择的二进制文件烧
写到这个地址开始的内部Flash中。
② 方法2

2.2.5 从内部Flash的指定位置开始烧写程序

① 方法1

可以选择Open file或者边上的+号选择文件:

支持很多种二进制文件,我们这里选择hex文件。

起始地址必须是0x0800 0000开始偏移4的倍数,然后点击Download。
② 方法2

这里必须选择bin文件,hex文件在这里是无法设置起始地址的,

  • 设置起始地址;
    起始地址必须是0x0800 0000开始偏移4的倍数:
  • 程序烧写

2.2.6 用STM32CubeProgrammer解决ST-Link找不到芯片的问题

在2.1.3中我们提到了一种情况会使ST-Link无法通过SWD引脚连接芯片,遇到这种情况我们就可以
使用STM32CubeProgrammer中的UART来连接芯片,擦除整片Flash的内容,然后再去烧写程序。