这次做了一些使用GD32单片机的制作。虽然说GD32是和STM32寄存器级兼容的,确实可以直接使用ST提供的工具和代码,但是这么做明显是违反了ST的协议的(当然使用CMSIS是不违反协议的)。一个方案是使用GD提供的工具和源码库,但是这样如果在未来想要迁移回ST的话则又是给自己找麻烦,所以干脆使用开源的解决方案libopencm3,就没有问题了。顺便调试方案也选择OpenOCD吧,不然用SEGGER的二进制总觉得不太清真。

本文就简单记录下过程,方便以后参考。环境:Arch Linux。

安装必要的依赖

从官方源安装以下包:

# pacman -S arm-none-eabi-gcc arm-none-eabi-newlib

从AUR安装以下包:

  • openocd

创建一个项目

这里基本参考libopencm3提供的例子进行:

$ mkdir project
$ cd project
$ git init .
$ git submodule add https://github.com/libopencm3/libopencm3
$ make -C libopencm3 -j5
$ wget -O libopencm3.rules.mk https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/rules.mk
$ wget -O libopencm3.target.mk https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/stm32/l1/Makefile.include
$ cp libopencm3/lib/stm32/f1/stm32f103x8.ld .

修改libopencm3.target.mk的最后一行为:

include ../libopencm3.rules.mk

随后建立一个新的src文件夹,随便从libopencm3-examples里面复制个例子过来(.c和Makefile),如下修改Makefile文件:

OPENCM3_DIR = ../libopencm3
LDSCRIPT = ../stm32f103x8.ld

include ../libopencm3.target.mk

直接make hex或者make bin应该就能生成二进制了

使用OpenOCD下载

这里使用SWD方式下载,需要稍微编辑下配置文件

$ cd /usr/share/openocd/scripts/interface
$ cp jlink.cfg jlink-swd.cfg

在里面加入一行 transport select swd 即可。

随后启动OpenOCD并进行烧录:

openocd -f interface/jlink-swd.cfg -f target/stm32f1x.cfg
telnet localhost 4444
reset halt
flash write_image erase project.hex
reset