通过UART烧录STM32芯片

笔者有一个STM32F103C6芯片的Blue Pill板子,近期需要使用因此在研究怎么烧录 程序。

my-stm32-blue-pill.jpg

Figure 1: 一个焊着STM32F103C6T6芯片的Blue Pill板子

比较常见的烧录STM32芯片的办法是在网购平台购买一个ST-Link,将ST-Link和 STM32芯片的SWD(Serial wire debug)接口连接进行烧录,但是笔者发现 了stm32flash这个能利用STM32内置的bootloader通过UART或I2C对芯片进行烧录的 手段。如果手边已经有支持I2C或UART的开发板,或者有USB转UART的设备,就能利 用它们对STM32进行烧录了,而不用特地多购买一个ST-Link。

ST编号为RM0008 Rev21的文档中,章节3.4提到我这块STM32支持三种启动模式, 通过调整BOOT0和BOOT1两个Pin能够选择启动模式。System memory启动会运行 STM32内置的bootloader,而内置bootloader支持通过USART1(USART等同于UART)接 口烧录程序。

根据ST文档DocID15060 Rev7表格Table 5判断, Pin A9 对应的是 USART1_TXPin A10 对应的是 USART1_RX 。根据板子上的丝印连接到 USB-UART转换器,以及需要把GND也对应接上。然后为了选择System memory启动模 式,需要调整 BOOT0BOOT1 两个Pin的跳脚帽:按照丝印把 BOOT0 设置 为1,把 BOOT1 设置为0。都准备好后会是这个样子:

blue-pill-ready-uart-program.jpg

Figure 2: 准备好用UART编程的Blue Pill

接下来把USB-UART转换器接上电脑,将Blue Pill接上供电。然后运行 stm32flash <tty device> ,没问题的话就能看到以下信息:

$ stm32flash /dev/ttyUSB0 
stm32flash 0.7

http://stm32flash.sourceforge.net/

Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0412 (STM32F10xxx Low-density)
- RAM        : Up to 10KiB  (512b reserved by bootloader)
- Flash      : Up to 32KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB

如果看到以下信息,有可能是因为 A9A10 的线接反了,可以尝试将它们对调。

$ stm32flash /dev/ttyUSB0 
stm32flash 0.7

http://stm32flash.sourceforge.net/

Interface serial_posix: 57600 8E1
Failed to init device, timeout.

然后就能通过 stm32flash 的子命令对程序进行读写了。