前言
Longan nano 开发板采用的是兆易创新的 GD32VF103CBT6 处理器,是一款使用 RISC-V 指令集架构的国产处理器。该开发板是由矽速科技设计的迷你学习板,由2019年开始进入开发者的视线,距今2024年已有5年的时间, 官网 的资料也是不再维护了,所以对于初学者而言是比较不利的,这里 官网开发环境搭建 的 VSCode 开发环境已经不能再使用了。所以笔者花费了一些时间研究了一下,结合 GitHub 上的两篇有用参考文章 https://github.com/sipeed/platform-gd32v/issues/40 和 https://community.platformio.org/t/i-am-unable-to-install-sipeed-longan-nano-gd32v/34758/20 ,总结一下最新的开发环境搭建流程,希望能帮到大家!
软件安装流程
1.安装 Python3
2.安装 VSCode
3.接着打开 VSCode 安装三个插件(这里用文字记录,以免图片丢失,还请勿嫌笔者啰嗦):Chinese(可选)、PlatformIO IDE(重要)、C/C++(自动安装)。等待安装完即可,网络不好的 PlatformIO IDE 插件可能会安装失败,多等待一会或多试几次,成功后需要重载 VSCode。
4.接着点击 VSCode 左侧竖栏的外星人图标:
然后点击 Open 一栏:
接着在显示的插件窗口中依次点击 Platforms ,Embedded,搜索 Nuclei 并点击进去:
点击 Install 安装即可:
安装成功后就可以点击 Platforms 后,在 Installed 里看到:
该SDK的路径默认位于:
(Windows)C:/Users/?/.platformio/packages
(Linux)/home/用户名/.platformio/packages
配置工程及点灯演示
笔者的水平也不高,这里演示的都是比较基础的操作,日后还需要大家靠自己摸索研究更好的项目配置方法。
一、导入示例项目
打开 VSCode,点击外星人图片打开 PlatformIO 开发平台,点击 QUICK ACCESS 窗口中 PIO Home 下的 Open,选择 Home,点击 Project Examples:
在弹出的小窗口中选择 helloworld 示例,点击 Import 导入即可:
该示例项目的路径默认位于:
(Windows)C:/Users/?/Documents/PlatformIO/Projects
(Linux)/home/用户名/Documents/PlatformIO/Projects
二、新建项目
打开 VSCode,点击外星人图片打开 Platform 开发平台,点击 QUICK ACCESS 窗口中 PIO Home 下的 Open,选择 Home,点击 New Project:
给项目取名,Board 栏搜索 gd32vf103 会有两个选项,笔者并不知道详细的区别,但二者都是可用的,日后大家可以自行判断二者的不同之处,接着点击 Finish 即可。
项目的默认路径与示例导入的路径相同。
项目配置
接着点击 VSCode 资源管理器:
即可查看项目结构:
这里 platformio.ini 文件就是该项目的配置文件,我们将其修改一下,只留下
[env:nuclei-gd32vf103c_longan_nano]
platform = nuclei
framework = nuclei-sdk
board = gd32vf103c_longan_nano
upload_protocol = jlink
即可:
点灯
首先在项目的 src 文件夹下新建 main.c 文件,Nuclei SDK 中有开发板对应的头文件 gd32vf103c_longan_nano.h ,可以简化开发流程,头文件相对路径为:
SDK路径/framework-nuclei-sdk/SoC/gd32vf103/Board/gd32vf103c_longan_nano
可以看到以下几个函数:
这里附上笔者的 main.c 代码:
#include "gd32vf103c_longan_nano.h"
#include "gd32vf103_rcu.h"
#include "systick.h"
int main() {
gd_led_init(LED_R);
gd_led_init(LED_G);
gd_led_init(LED_B);
while (1) {
gd_led_on(LED_R);
mdelay_1ms(200);
gd_led_off(LED_R);
gd_led_on(LED_G);
mdelay_1ms(200);
gd_led_off(LED_G);
gd_led_on(LED_B);
mdelay_1ms(200);
gd_led_off(LED_G);
mdelay_1ms(200);
}
}
代码中的 LED_R、LED_G、LED_B 对应下面原理图中的 GPIO_A 和 GPIO_C :
GD32VF103CBT6 的时钟线路图:
查看源码 gd32vf103c_longan_nano.c 即可查看操作的流程:
文件 gd32vf103c_longan_nano.h 的引脚等定义:
文件 gd32vf103_rcu.h 中复位控制单元对应总线的定义:
由此开始理清一下思路:
- 查看原理图,发现RGB灯对应的是 GPIOA 和 GPIOC 引脚
- 查看时钟电路图,时钟电源线进入 RCU 后,通过外设 AHB 总线又经过 APB2 桥总线控制 GPIOA 和 GPIOC,因此需要使能对应的时钟线及总线
- 配置 GPIO 端口映射、模式、速率和引脚,初始化
- 灯闪逻辑
这里是 systick.h(新建并放在项目的 include 文件夹) 和 systick.c (新建并放在项目的 src 文件夹)的源码:
systick.h
#ifndef SYS_TICK_H
#define SYS_TICK_H
#include <stdint.h>
void mdelay_1ms(uint32_t count);
#endif /* SYS_TICK_H */
systick.c
#include "gd32vf103.h"
#include "systick.h"
uint64_t get_timer_value(); // 读取时间计数器(时钟寄存器)的值
void mdelay_1ms(uint32_t count)
{
uint64_t start_mtime, delta_mtime;
// Don't start measuruing until we see an mtime tick
uint64_t tmp = get_timer_value();
do {
start_mtime = get_timer_value();
} while (start_mtime == tmp);
do {
delta_mtime = get_timer_value() - start_mtime;
}while(delta_mtime <(SystemCoreClock/4000.0 *count ));
}
#define TIMER_CTRL_ADDR 0xd1000000
#define TIMER_MTIME 0x0
uint32_t mtime_lo(void)
{
return *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME);
}
uint32_t mtime_hi(void)
{
return *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME + 4);
}
uint64_t get_timer_value()
{
while (1) {
uint32_t hi = mtime_hi();
uint32_t lo = mtime_lo();
if (hi == mtime_hi())
return ((uint64_t)hi << 32) | lo;
}
}
程序编译及下载
点击 VSCode 底部状态栏的 对勾 按钮即可编译,编译成功后,点击右边的 向右箭头 即是下载:
需要注意的是,编译完可能只能看到 .elf 格式的文件,点击下载后就能看到 .hex 文件,默认使用 rv-link JTAG方式下载,可通过 platformio.ini 文件配置不同的下载方式,例如添加:
upload_protocol = jlink
即可使用 jlink JTAG方式下载。
如果下载一直不成功,可以另外采用 GigaDevice Dfu Tool 软件工具下载 hex 程序。
至此,完毕!
附上 VSCode+PlatformIO 开发环境配置问题的 GitHub 参考网址:
[1]: https://github.com/sipeed/platform-gd32v/issues/40
[2]: https://community.platformio.org/t/i-am-unable-to-install-sipeed-longan-nano-gd32v/34758/20