在Arch Linux下搭建GD32VF103开发环境

本文简单介绍在Arch Linux下搭建GD32VF103开发环境的过程, 基于RV-STAR开发板。
相关介绍
GD32VF103VBT6
基于芯来科技Bumblebee内核(RV32IMAC)的32位通用微控制器。
RV-STAR开发板
基于GD32VF103 MCU的评估开发板,搭载板载调试器。
OpenOCD
一个开源工具,主要用于嵌入式系统的调试和编程,能够配合 调试器(如ST-link、J-Link等)与开发板上的处理器,提供控制 芯片的方法,比如:
- 烧录Flash
- 设置/读取寄存器
- 单步执行、断点调试
- 查看变量与内存
- 与GDB 协同调试
配置工具链
1. GCC
- 下载
从芯来科技文档与工具页面
下载最新的Linux版Nuclei RISC-V Embedded Toolchain(Baremetal/RTOS + Newlibc)
工具,本文使用2025.02版本。
下载完成后,使用tar - xvjf {下载的文件}
解压。
- 配置环境变量
为了每次使用工具链提供的程序时不用一直输入很长的路径,可以
把gcc/bin
所在的路径加入PATH
环境变量:
export PATH=$PATH:{bin所在路径}
2. OpenOCD
- 下载
从芯来科技文档与工具页面
下载Nuclei OpenOCD
,然后使用tar - xvzf {下载的文件}
解压。
- 配置环境变量
同上一节配置gcc
工具链。
- 配置文件
以下是我使用的配置文件,命名为openocd_gd32vf103.cfg
:
adapter_khz 10000
reset_config srst_only
adapter_nsrst_assert_width 100
interface ftdi
ftdi_vid_pid 0x0403 0x6010
ftdi_layout_init 0x0008 0x001b
ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020
ftdi_layout_signal TCK -data 0x0001
ftdi_layout_signal TDI -data 0x0002
ftdi_layout_signal TDO -input 0x0004
ftdi_layout_signal TMS -data 0x0008
ftdi_layout_signal JTAG_SEL -data 0x0100 -oe 0x0100
transport select jtag
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1000563d
jtag newtap $_CHIPNAME bs -irlen 5 -expected-id 0x790007a3
# Work-area is a space in RAM used for flash programming
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x5000
}
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f1x 0x08000000 0 0 0 $_TARGETNAME
riscv set_reset_timeout_sec 1
init
halt
测试
可以通过GD32VF103固件库提供的模板工程来测试配置完成的 开发环境。
首先,获取GD32VF103固件库:
git clone https://github.com/riscv-mcu/GD32VF103_Firmware_Library.git
进入GD32VF103_Firmware_Library/Template
路径下,把上一节
的OpenOCD
配置文件openocd_gd32vf103.cfg
拷贝到该路径下,
Makefile
文件需要针对实际使用的工具链修改,比如以下
PREFIX = riscv-nuclei-elf-
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
其中的riscv-nuclei-elf-
要根据我们实际使用的GCC
工具链
修改为riscv64-unknown-elf-
。
然后在Makefile
文件所在的路径下执行make
进行构建。
构建如果无错误,在build
路径下可以看到生成了可以下载
到开发板的二进制.bin
和.elf
等文件。
执行openocd -f openocd_gd32vf103.cfg -c "program build/{生成的.elf文件} verify reset exit"
把程序下载到开发板。
可能出现的问题和解决方式
1. 下载程序时报错,提示未找到调试器
- 确认调试器已连接,然后执行
lsusb
(由包usbutils
提供), 如果无误,应该可以看到类似以下的输出:
Bus 001 Device 005: ID 0403:6010 Future Technology Devices
International, Ltd FT2232C/D/H Dual UART/FIFO IC
- 设置
udev
规制,新建一个udev
规则文件,如下:
sudo vim /etc/udev/rules.d/99-ftdi.rules
- 添加如下内容:
SUBSYSTEM=="usb", ATTR{idVendor}=="0403",
ATTR{idProduct}=="6010", MODE="664", GROUP="uucp"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403",
ATTRS{idProduct}=="6010", MODE="664", GROUP="uucp"
- 应用规则:
sudo udevadm control --reload
sudo udevadm trigger
- 把当前用户添加到
uucp
组,添加用户到组之后需要 重启或重新登陆当前会话:
sudo gpasswd -a {$用户名} uucp
- 重拔插调试器。
2. 启动riscv64-unknown-elf-gdb
时报错,找不到库文件libtinfo.so.5
芯来科技提供的gdb
需要旧版的ncurses
支持,可以通过安装兼容库解决,
从AUR
安装ncurses5-compat-libs
这个软件包。