通过UART烧录STM32芯片
笔者有一个STM32F103C6芯片的Blue Pill板子,近期需要使用因此在研究怎么烧录 程序。
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_TX , Pin A10 对应的是 USART1_RX 。根据板子上的丝印连接到
USB-UART转换器,以及需要把GND也对应接上。然后为了选择System memory启动模
式,需要调整 BOOT0 和 BOOT1 两个Pin的跳脚帽:按照丝印把 BOOT0 设置
为1,把 BOOT1 设置为0。都准备好后会是这个样子:
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
如果看到以下信息,有可能是因为 A9 和 A10 的线接反了,可以尝试将它们对调。
$ stm32flash /dev/ttyUSB0 stm32flash 0.7 http://stm32flash.sourceforge.net/ Interface serial_posix: 57600 8E1 Failed to init device, timeout.
然后就能通过 stm32flash 的子命令对程序进行读写了。