做键盘必备,抛掉ST-Link,通过USB烧录固件,STM32F103使用STM32duino-bootloader 踩坑记录

前言

之前在 DIY 基于 QMK 固件的键盘的时候,直接借鉴了立创开源平台上的项目,使用了 ATmega32A 作为主控,ATmega32A 本身并没有硬件 USB 接口,把它作为键盘主控是通过使用 USBaspLoader 这样一个 bootloader 来实现的。

但是毕竟是软件实现,在以前复刻时,使用 ATmega32A 的键盘还是能正常配合 MacBook 使用的,但是最近发现在连接到 MacBook 之后,会很快丢掉连接,这下不得不去找一个带硬件 USB 接口的 MCU 了。

这时我就把眼光放到了 STM32F103C8T6 上,玩了这么久的 ESP32、CH32V003 什么的,还是没能逃过 STM32 😃。

而且相对 ATmega32A,STM32F103C8T6 的系统资源就丰富太多了,64KB Flash、20KB RAM 用来烧录一个 QMK 固件那是相当够用了,什么宏、层的数量,都开到最大。

最后的重点,作为习惯了使用 USB 直接烧录固件的人,也希望给 STM32F103C8T6 刷固件时也可以直接通过 USB 刷,这就找到了 STM32duino-bootloader 这个项目。

准备工作

当然在最开始的时候,STM32F103C8T6 还没有刷入 STM32duino-booloader 的时候,是不能通过 USB 烧录固件的,还是得借助 ST-Link 完成最初始的 bootloader 烧录工作。

PS. 以下步骤都是针对在 macOS 平台上的操作,如果是 Windows 或 Linux,需要根据平台特性做调整。

下载 bootloader

可以在 STM32duino-booloader 的仓库中下载到对应不同开发板的 bootloader。

下载地址: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/bootloader_only_binaries

一般下载 generic_boot20 开头的文件就可以了,后面跟着的是对应开发板上指示 LED 灯所连接的引脚,例如我购买的开发板 LED 是连接到了 PB12,那就下载 generic_boot20_pb12.bin 即可。

安装 st-link

第一次烧录 bootloader 还是需要使用 ST-Link 编程器的,在 macOS 上可以直接使用 brew 安装 st-link 命令行工具。

brew install stlink

刷写 bootloader

将 ST-Link 编程器连接到开发板的 SWCLK、SWDIO,在命令行中使用以下命令烧录 STM32duino-bootloader。

st-flash write generic_boot20_pb12.bin 0x8000000

命令行显示 Flash written and verified! jolly good! 就表达烧录完成了。

stm32duino-bootloader-toturial-1

接下来就可以把 ST-Link 编程器收起来,使用 USB 连接开发板,直接烧录固件啦。

在 PlatformIO 中使用 STM32duino-bootloader

烧录完 STM32duino-bootloader 之后,就可以像使用 ESP32 一样,在 Visual Studio Code 中使用 Arduino 框架开发 STM32 程序,并且支持直接通过 USB 烧录了。

不过在此之前,还是需要先配置一下 platformio.ini 的。

配置 platformio.ini

主要配置内容:

[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = arduino
board_build.core = maple
upload_protocol = dfu
build_flags = -DSERIAL_USB -DGENERIC_BOOTLOADER

这里最重新是配置 board_build.core = maple 来让编译出来的固件支持使用 STM32duino-bootloader 烧录并启动。

修复 [upload] Error 1 问题

在配置完 platformio.ini,搞一个点灯程序准备测试一下时,发现直接通过 PlatformIO 的 Upload 功能,在最后上传时会失败报错。

stm32duino-bootloader-toturial-2

在排查一番后发现,是工具链上传脚本的一行命令在 macOS 可能存在兼容问题,需要将不兼容的内容注释掉。

修改文件路径:~/.platformio/packages/tool-stm32duino/maple_upload

需要注释掉的代码:${DIR}/upload-reset ${dummy_port_fullpath} 750

修改完后文件内容如下所示:

stm32duino-bootloader-toturial-3

修改完保存文件,再尝试一下 Upload,可以发现固件已经正确的被烧录进 STM32F103C8T6 了~

stm32duino-bootloader-toturial-4

在 QMK 固件中使用 STM32duino-bootloader

要在 QMK 固件中使用 STM32duino-bootloader 来加载,同样需要配置一下键盘的定义文件。

rules.mk 添加以下内容来声明使用 STM32duino-bootloader:

OPT_DEFS += -DBOOTLOADER_STM32DUINO
MCU_LDSCRIPT = STM32F103x8_stm32duino
BOOTLOADER_TYPE = stm32duino
DFU_ARGS = -d 1EAF:0003 -a 2 -R
DFU_SUFFIX_ARGS = -v 1EAF -p 0003

在烧录固件时,直接连接 USB 并使用 qmk flash 命令就可以更新键盘固件啦,比使用 ST-Link 要方便很多。

参考资料

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>