手里面有一块RT-THREAD出品的RISC-V开发板,使用的芯片是全球第一款使用RISC-V CPU的芯片GD32VF103,开发板如下图所示:
需要注意的是,这块板子上并没有使用外部晶振,所以后续需要注意时钟初始化的方式。
板子已经买来很久,上面也一直跑RT-THREAD,有天想在这个板子上也跑一下Zephyr吧,于是乎说干就干,开始下一步的动作。
- 下载Zephyr代码
Zephyr代码下载以及环境搭建还是直接到官方文档查看,说的比较详细,由于本机之前搭建过开发环境,所以目前只需要下载Zephyr代码,命令比较简单:
west init zephyrproject cd zephyrproject west update
代码下载完后整个目录结构如下所示:
├── bootloader
│ └── mcuboot
├── modules
│ ├── audio
│ ├── bsim_hw_models
│ ├── crypto
│ ├── debug
│ ├── fs
│ ├── hal --> 最新的代码中,GD32的hal层驱动 代码保存在这个目录
│ ├── lib
│ └── tee
├── tools
│ ├── edtt
│ └── net-tools
└── zephyr
├── arch
├── boards --> GD32开发板的配置文件目录保存于这个目录
├── cmake
├── doc
├── drivers
├── dts
├── include
├── kernel
├── lib
├── misc
├── modules
├── samples
├── scripts
├── share
├── snippets
├── soc
├── submanifests
├── subsys
└── tests
- 配置更改
这块板子上使用的芯片是GD32VF103VBT6,和boards下gd32vf103v_eval使用的芯片一样,所以我们可以以这个板子的配置为蓝本,只修改对应GPIO即可。
1. 这块板子上有一个LED灯,分别接到了PE3、PE4、PE5,可以修改boards/riscv/gd32vf103v_eval/gd32vf103v_eval.dts这个文件,将leds里的配置修改为以下:
compatible = "gpio-leds";
led1: led1 {
gpios = <&gpioe 3 GPIO_ACTIVE_HIGH>;
label = "LED1";
};
led2: led2 {
gpios = <&gpioe 4 GPIO_ACTIVE_HIGH>;
label = "LED2";
};
led3: led3 {
gpios = <&gpioe 5 GPIO_ACTIVE_HIGH>;
label = "LED3";
在aliases中新增一个led2:
aliases {
led0 = &led1;
led1 = &led2;
led2 = &led3;
sw0 = &key_cet;
pwm-led0 = &pwm_led;
spi-flash0 = &nor_flash;
watchdog0 = &fwdgt;
};
- 时钟初始化代码修改
由于这块板子使用的是内置的IRC8M时钟,所以我们要修改modules/hal/gigadevice/gd32vf103/riscv/source/system_gd32vf103.c
文件里原始代码使用的时钟是config文件里的25MHz外部时钟:
#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
需要注释这句,把上面的内部时钟的宏定义打开
#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000)
文件中对应的代码如下
/* select a system clock by uncommenting the following line */
/* use IRC8M */
//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000)
#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000)
/********************************************************************/
//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE)
//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000)
/********************************************************************/
//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000)
//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000)
//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000)
//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
//#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000)
//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)
这样的话,在开机后就以内部8M时钟进行初始化了。
- 为了能使用串口运行一些shell命令,在gd32vf103v_eval_defconfig中有添加shell相关的配置,config文件中的全部配置如下所示
-
# Copyright (c) 2021, Teslabs Engineering S.L. # SPDX-License-Identifier: Apache-2.0 CONFIG_SOC_SERIES_GD32VF103=y CONFIG_SOC_GD32VF103=y CONFIG_BOARD_GD32VF103V_EVAL=y CONFIG_GPIO=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_SERIAL=y CONFIG_CONSOLE_HANDLER=y CONFIG_SHELL=y CONFIG_SHELL_CMDS=y CONFIG_SHELL_STATS=y CONFIG_SHELL_PROMPT_UART="<GD32> ~$"
- 接下来就是愉快的编译一个示例代码
west build -p auto -b gd32vf103v_eval zephyr/samples/basic/blinky
- 编译完成后会在build/zephyr目录下生成zephyr.bin
- 上电调试使用openocd进行连接,需要注意的是,这块板子JTAG使用的是20PIN的设置,PIN1位于PE6的位置,而且板子在设计的时候JTAG的接线有一些错误,在焊接JTAG线的时候,要做电路修改。如果用软排线全接上,注意11脚与15脚的设计bug,11脚不接,同时把11脚并到15脚上。
openocd自带gd32vf103的配置文件,这个文件中间使用的调试器件要根据自己的调试器修改,在我本地使用的是FT4232H进行,所以adapter的配置修改为如下:
# this supports FT4232H
adapter driver ftdi
adapter speed 1000
ftdi vid_pid 0x0403 0x6011
ftdi layout_init 0x00e8 0x60eb
ftdi channel 1
- 在连接成功后就可以用下面的命令将生成好的zephyr.bin烧进去了
先擦写64KB的块: flash erase_address 0x8000000 0x10000
再写文件进去: flash write_image zephyr.bin
烧写成功后,按一下板子上的Reset按键,就可以愉快的看LED灯闪了,也能通过串口运行shell命令