移植Zephyr到RT-THREAD的RISC-V开发板

    手里面有一块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命令

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值