来源:本文译自英文版"GD32VF103 Series of RISC-V Quick Start",原著:Tam Hanna。
兆易创新GD32 MCU多年来一直致力于推出Arm® Cortex®-M内核的MCU。从去年开始,他们将GD32VF103系列MCU引入到嵌入式微控制器应用领域(请注意型号描述中的“ V”),GD32VF103系列MCU是基于开源指令集架构RISC-V内核的完整新产品,也是全球第一个RISC-V通用MCU产品系列,下面让我们来仔细地研究一下。
兆易创新GD32 MCU于2019年8月推出了基于RISC-V内核的微控制器系列,他们在设计标准中的一个重要优势是方便从其他微控制器架构的无缝过渡,编程方式与GD32 Cortex-M内核芯片相似。该RISC-V系列MCU的具体参数如图1所示。
图1:RISC-V系列在软件开发和引脚封装方面与现有GD32 MCU完全兼容。(图片来源:GigaDevice)
RISC-V规范定义了标准ISA(指令集架构[ISA]),而不是制定如何实现MCU的设计。对异常处理、中断处理、外设设计和其他方面的处理是微控制器开发人员的创造力来确定的。对于GD32VF103,兆易创新决定遵守其Arm设计中应用的设计规范。虽然这种设计理念不会绝对带来1:1 的代码可移植性,但是对于有一定行业经验的开发者来说,学习曲线就不是那么陡峭,因此我们建议认真研究一下这个系统。
开发工具
兆易创新为开发人员提供了功能齐全的IDE,此处不需要提供程序所需的其他命令行级别操作。此时一个小陷阱正在等待,就是您需要去这个网址 https://www.nucleisys.com/download.ph或http://www.GD32MCU.com网站单独下载以下软件包:
- OpenOCD 64
- RISC-V Win32
- Nuclei Studio
开始,这似乎是一种合理的方法,但实际上,用户最终会遇到工具链和IDE组件之间不匹配的问题,那时可以在以下位置找到正确版本的IDE及其所有相关组件:
https://www.nucleisys.com/upload/file/2019/10/Nucleistudio/NucleiStudio_IDE_201909.rar
这组件还包括工具链,用户可以将压缩包解压到这个文件夹中:
C:NucleiStudio_IDE_201909
如果使用GD-LINK调试下载器(已集成在所有兆易创新开发板上),则不需要此设置。若用户没有可支持的Java版本,则可以在归档文件中找到一个。作者建议您将文件夹Nuclei_Studio和Serial_Debugging_Tool直接放在C盘的子目录中。
打开C:NucleiStudio_IDE_201909NucleiStudioeclipsec.exe 启动IDE,这一步普通的eclipse.exe文件并不适用,然后在IDE主界面点击 File → New → Project,并选择模板C/C++ → C Project,项目名称命名为GigaDevice RISC-V,当然用户可以随意来命名项目名称。在MCU选择中,我们选择GD32VF103,其余设置如图2和图3所示。
图2:Nuclei Studio默认配置一些外围设备。
图3:默认工具链设置
确保通过双击欢迎窗口的标题将其最小化,然后单击锤子图标以开始第一个编译过程。
无处不在的Eclipse
我们可以从运行示例程序开始, 兆易创新提供各种评估板来支持其设备,在本产品评论中,我将使用基本的GD32VF103C-START板。首先要通过GD-Link端口来将开发板与电脑连接,所有板卡均包含板载GD-Link调试探针,因此无需外接调试器和/或编程器。
若在此板中用户没安装过什么软件,就可以看到LED 1灯闪烁. GD32VF103C-START和STM的Nucleo开发板很相似。GD32VF103C-START包含两根Mini USB连接线和各种引脚,引脚排针需要用户自己焊接。
最小系统板仅限于标准Arduino连接器引脚分配,并且不可使用STM板上提供的Morpho连接器。兆易创新为Nuclei Studio提供支持,从而为新创建的项目生成可执行的模板,在作者的计算机上它名为ElektorGigaTest1_Debug_OpenOCD。请注意,不得使用Eclipse附带的常规工具执行该程序。
图4: 这些控件替代了Eclipse提供的调试工具。
显示窗口中的消息用来指示系统状态。在设置的阶段最重要的信息是:
Info : JTAG tap: auto0.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing)), part: 0x9000, ver: 0x7)
这些信息表明目标设备已被识别,并确认USB通信链接正常工作。示例中提供的代码是全功能开发板的代码,把此代码烧录到最小系统板,用户就可以看一个LED灯闪烁。现在,通过右键单击示例代码的一部分并使用Eclipse中可用的反射功能,可以更好地了解API。
深入分析main.c
我们打开main.c文件,并查看RISC-V软件的接入口。GigaDevice(与Arduino不同)没有框架库,因此执行从main函数开始:
int main(void)
{
gd_eval_led_init(LED1);
gd_eval_led_init(LED2);
. . .
while(1){
/* turn on led1, turn off led4 */
gd_eval_led_on(LED1);
gd_eval_led_off(LED4);
delay_1ms(1000);
. . .
在这段代码中,我们可以看到第一步,初始化连接到LED的4个GPIO引脚,然后在无限的while循环中打开和关闭,并在每次切换两个LED时插入1秒的延迟。全功能开发板包含四个LED,这就是为什么所提供的代码示例大于在此处使用的更基本的最小系统板上切换LED所需的代码示例的原因。
另一个有趣的事是,关于delay_1ms()函数,它指定了一个时基,与处理器时钟无关,因此在较慢的处理器上运行而编写的代码无需修改即可保持相同的软件时序延迟,所需的延迟即可作为数字参数传递。
在文件gd32vf103v_eval.h中定义了LED1之类的常量,该常量用于较大的电路板,它与开发板使用的GPIO端口相对应的三个元素如下:
#define LED1_PIN GPIO_PIN_0
#define LED1_GPIO_PORT GPIOC
#define LED1_GPIO_CLK RCU_GPIOC
让我们首先看一下gd_eval_led_init,它负责为开发板的LED初始化。在这里,我们确保外围设备已连接到时钟发生器。接下来是gpio_init,其中分配了LED GPIO端口的属性:
Void gd_eval_led_init(led_typedef_enumlednum)
{
/* enable the led clock */
rcu_periph_clock_enable(GPIO_CLK[lednum]);
/* configure led GPIO port */
gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN[lednum]);
GPIO_OSPEED_50MHZ确保输出引脚的压摆率可以支持输出速度。对于时序约束不太严格的应用,可以分配较低的频率以减少开关RFI的产生。下一条语句将重置(清除)该引脚以确保程序在LED熄灭的情况下开始:
GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}
GPIO_BC宏使我们更深入地了解框架,可以通过以下两种方法来打开和关闭开发板上的LED,这些方法基本上仅限于使用LED作为索引来展开数据阵列:
void gd_eval_led_on(led_typedef_enumlednum)
{
GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}
voidgd_eval_led_off(led_typedef_enumlednum)
{
GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}
它们的声明可以在文件gd32vf103_gpio.h中找到,这两个寄存器体系结构我们已经知道,因为在其他微控制器上常常会看到一样的结构(一个用于设置位,另一个用于复位位):
#define GPIO_BOP(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port bit operation register */
#define GPIO_BC(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO bit clear register */
如果要了解有关GPIO-API的更多信息,请右键点击编辑器,然后在选单中选择标题(.h
文件)和文件所在的位置选项。您将在gd32vf103_gpio.c中找到想了解的信息,包含了完整的交互方法及其实现,通过查看硬件支持库,可以找到更多信息。在图5中来看源代码位于项目框架的子文件夹。
图5:外设子文件夹包含固件库源代码。
我的Cube在哪里?
当前兆易创新不支持Atollic and Co使用的图形代码生成工具CubeMX, 因此,开发人员必须注意配置所有外围设备。
为了测试输出引脚的切换速度,我们可以在软件中建立一个无限循环。为了减少花费在进行子程序调用上的时间,循环仅由位设置和复位指令组成。切换引脚(5)作为推挽输出启动,并且输出速度(转换速率)设置为50 MHz模式:
Int main(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
GPIO_BC(GPIOA) = GPIO_PIN_5;
while(1){
GPIO_BOP(GPIOA) = GPIO_PIN_5;
GPIO_BC(GPIOA) = GPIO_PIN_5;
}
}
此处初始化GPIO端口,然后通过上述两个寄存器在while循环中连续设置和复位引脚。
请注意,这是一个无休止的循环,在尝试重新运行任何新版本的测试代码之前,您需要单击红色的停止按钮符号。输出在高频下触发,因此必须使与信号引脚的所有连接尽可能短,并且要注意示波器的探头电容,输出波形如图6所示。
图6:RISC-V内核是真正的动力源
对Arm形成竞争的RISC-V
RISC-V的开源免版税架构为当前由Arm设备主导的微控制器市场带来了新机会。对于产品开发人员和初创企业来说,这是个好消息,因为他们通常没有足够的资金来支付建立Arm-cored片上系统(SoC)设计所需的许可费用。由于兆易创新RISC-V系列处理器与其现有Arm® Cortex®-M内核产品布局相似,因此如果您渴望获得该技术的实际操作经验,兆易创新RISC-V系列处理器是一个很好的开始。从软件开发人员的角度来看,固件库非常相似,很少涉及到对它们进行更改,也很方便根据量产所需来灵活切换,GD32 MCU家族提供了这种机会。
结论
考虑到RISC-V控制器的所有优点,在嵌入式环境中探索该器件的功能将非常有趣。无论是为了满足您的好奇心,还是出于商业原因,兆易创新的设备都为该技术提供了很好的支持。
对于创客社区来说,一个有趣的发展是Sipeed公司最近推出了Longan Nano板。它的尺寸与STM Blue Pill开发板相似,但使用的是GD32VF103CBT6 32位RISC-V内核MCU,主频高达108MHz,而功耗仅是Arm Cortex-M3内核产品的三分之一。而价格仅仅不到5美元(包括0.96英寸160 x 80 IPS RGB LCD)。可以肯定一件事, 以这样的价格和性能水平,我们可以预期很快会有更多基于RISC-V架构的低成本开发板和解决方案进入市场。