《兆易创新GD32VW553H-EVAL开发实践指南》电子书正式上线! 本书是RT-Thread工程师团队与兆易创新联合推出的评测活动产出,系统梳理了从UART、WDG、I2C、TIMER、PWM、SPI等基础外设,到Wi-Fi无线通信的完整驱动开发实践,手把手带你完成从硬件调试到无线应用部署的完整流程。
本文是《GD32VW553上的UART实践》。
目录
开发环境搭建
VSCode软件调试环境搭建
芯片资源 - Uart
UART功能调试
Git链接
开发者贡献名单
1 开发环境搭建
1.1 软件下载链接
RT-Thread 环境:https://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32/risc-v/gd32vw553h-eval
方案一:可以使用git工具直接拉取RT-Thread整包:git clone https://github.com/RT-Thread/rt-thread.git
方案二:可以直接从git界面下载zip整包,本地解压;

RT-Thread ENV工具:https://www.rt-thread.org/download.html#download-rt-thread-env-tool

编译器工具链:https://www.gigadevice.com.cn/product/mcu/mcus-product-selector/gd32vw553hmq6

固件烧录工具GD32AllInOneProgrammer:https://www.gd32mcu.com/cn/download?kw=GD32+All-In-One+Programmer&lan=cn

1.2 环境配置
1.2.1 RT-Thread ENV工具配置
将1.1->第3小节:链接中下载的文件拷贝至工作文件夹(此处为笔者习惯,仅供参考,可跳过);

打开路径中的exe文件运行RT-Thread ENV工具,此时该文件会自动配置Windows下的环境变量;

此处需要注意输出文件中包含的环境变量的设置,当我们解压并使用后,再次移动软件位置时,记得将环境变量同步更改,否则可能会报错,无法找到pkgs指令;若是不会修改环境变量,最简单的解决方案就是删除当前的ENV整包,然后在需要安装的位置重新解压,并运行即可;
当软件环境配置完成后,分别运行pkgs —upgrade、pkgs —update,此时观察仓库可以发现仓库中增加了packages文件夹,里面包含了gd32的lib库;


1.2.2 GD32编译链环境搭建
对于任意一款芯片的编译肯定都需要适配交叉编译工具链,一般这部分厂商都有提供,本次需要将交叉编译工具集成到RT-Thread的环境中;
由于在第一章1.1已经下载好了编译器工具链,首先需要选择一个自己想要放置编译链的地方解压工具链;
然后在RT ENV环境下运行下面命令,注意:PTAH=后面跟着的路径需要改为自己的路径,下方指令不可直接复制粘贴使用!下方指令不可直接复制粘贴使用!下方指令不可直接复制粘贴使用!
set RTT_EXEC_PATH=E:\GD32\GD32VW5\GD32EmbeddedBuilder_v1.5.4_Rel\Tools\RISC-V Embedded GCC\8.2.0-2.2-20190521-0004\bin
运行完成后,在gd32vw553h-eval的目录下直接执行scons -j128编译即可;
记得一定要在\rt-thread-master\bsp\gd32\risc-v\gd32vw553h-eval,这个目录下执行,其中j后面跟着的数字是指使用几个核进行编译,可根据自己的电脑实际性能调整;
编译完成后既可以看到文件夹中多了rtthread.bin文件,该文件就是后面需要下载到板卡的二进制文件;
1.3 固件烧录(直接按照git中完成)
固件烧录需要使用上述的第一章1.1中下载的GD32AllInOneProgrammer软件,烧录说明位于烧录软件下的Doc文件夹,或在线搜索使用方法,下述是烧录的示例:

需要注意的是使用上述软件烧录时需要将boot1置为高电平,烧录结束后重新设置为低电平,手动调整板载的boot跳线帽。
运行结果:烧录完毕后,使用串口连接自己的串口终端软件,即可通过串口与开发板交互;
1.4. 测评结论
GD32这款板子在环境搭建上相对还是比较简单的,基本可以无脑跟着Git中的指引一步步完成开发环境的搭建,无需开发者到处寻找资料;同时搭建开发环境所需的软件包也比较集中,且容易获取;
2 VSCode软件调试环境搭建
2.1 调试环境搭建
配置VSCode调试环境,首先在第一章中已经下载好了《GD32EmbeddedBuilder》,调试环境配置时需要用到该文件夹中的Tools;

其次在BSP根目录下执行下述命令,生成VSCode工程所需文件。
scons —target=vs
在VSCode安装扩展插件Cortex-Debug,版本v1.4.4。
完成上述工作后,点击运行和调试选项,创建一个launch.json配置文件,配置文件示例如下:
{"version": "0.2.0","configurations": [ { "name": "Cortex Debug", "cwd": "${workspaceFolder}", "executable": "${workspaceFolder}/rtthread.elf", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "serverpath": "E:/GD32/GD32VW5/Tools/GD32EmbeddedBuilder_v1.5.2.30854/Tools/OpenOCD/xpack-openocd-0.11.0-3/bin/openocd", "configFiles": [ "${workspaceFolder}/openocd_gdlink.cfg" ], "runToEntryPoint": "main", "showDevDebugOutput": "raw", "toolchainPrefix": "E:/GD32/GD32VW5/Tools/GD32EmbeddedBuilder_v1.5.2.30854/Tools/RISC-V Embedded GCC/8.2.0-2.2-20190521-0004/bin/riscv-none-embed" } ]}
这里需要注意如果你的${workspaceFolder}工作空间不是当前的路径,可以自行将${workspaceFolder}相关的路径改为自己launch.json的绝对路径/相对路径使用;
上述文件中的部分字段需要根据用户环境进行修改,格式需与示例一致:
“serverpath”:该字段需要改为用户的openocd所在路径,openocd工具位于GD32EmbeddedBuilder工具包中。
“toolchainPrefix”:该字段需修改为用户的工具链所在路径,工具链位于GD32EmbeddedBuilder工具包中。
完成上述配置后即可点击调试选项进行调试,调试时boot管脚均置为低电平即可,调试时同样会进行固件下载。
2.2 调试环境测试
在工程界面点击Cortex Debug,即可进入调节界面;

在调试界面可以查看变量值、暂停后可以查看当前任务的调用栈情况,同时也支持在vscode界面进行断点操作、单步调试、Reset等;

2.3 测评结论
整体来说调试环境搭建非常简单,但是调试界面相对于keil、esp-idf、劳德巴赫等其他环境较为简陋,不过功能完全足够开发者使用;
3 芯片资源 - Uart
芯片采用RISC-V架构处理器,适用于低能耗、小面积的嵌入式应用,具有简单的动态分支预测、指令预取缓冲区和I-cache等多种高效微架构特点。
3.1 Uart分布

根据芯片架构示意图可以看到,芯片共有三路串口,其中UART2挂载在APB2总线上,USART0和UART1挂载在APB1上;这里需要注意我们在使用不同Uart时,需要初始化对应的总线时钟;
3.2 存储
RISC-V处理器采用哈弗架构,可以使用单独的总线来提取指令和加载/存储数据。程序存储器,数据存储器,寄存器和I/O端口组织在同一线性4GB(32位芯片)地址空间内。具体的存储器映射表可以查看《GD32VW55x_用户手册_Rev1.4.pdf》第1.3节;
Uart地址空间
USART0:0x4000 4800 - 0x4000 4BFF
UART1:0x4000 4400 - 0x4000 47FF
UART2:0x4001 1000 - 0x4001 13FF
Ram段

代码段


其中我们主要关注和使用较多的就是主存储0x0800 0000 - 0x083F FFFF和0x0BF4 0000 - 0x0BF7 FFFF ROM区间;
根据芯片的引导配置章节可以看出,该芯片将Bootload、secure boot分别放在了ROM段0x0BF40000、0x0BF46000作为起始地址,本地代码一般放在了起始地址0x08000000的主存储区;
3.3 USART 模块内部框图

从模块内部框图可以看出,Uart的读写操作主要都是在读/写缓冲区完成,用户可以通过CPU在串口传输完成后直接读取读缓冲区的内容,或像写缓冲区写入数据,配置控制/状态寄存器及中断完成Uart的读写操作;
从图中同样可以看到该芯片Uart支持DMA直接将缓冲区数据搬入/出;
读写缓冲区分别对应Uart的数据接受/发送寄存器,同时FIFO的控制/状态获取,主要依赖于FIFO控制和状态寄存器;
同时芯片支持硬件流控功能,可通过nCTS和nRTS引脚来实现。通过将USART_CTL2寄存器中RTSEN位置1来使能RTS流控,将USART_CTL2寄存器中CTSEN位置1来使能CTS流控。

GD32vw553 引脚映射关系

测试阶段暂时将PA2/3作为UART1的收发引脚,PA6/7作为UART2的收发引脚;
4 UART功能调试
4.1 测试环境
Demo中仅使能了UART0一路串口,首先需要测试3路串口是否均可使用,可以在RTT的menuconfig中将UART1/2使能;
使能后会出现宏定义相关的报错,此时需要修改drv_usart.c文件,由于GD32vw55x的另外两路都是UART,drv中写死的USART宏并不适用,临时改为UART1/UART2,重新编译可成功编译;

单步调试查看调用栈,可以发现在程序启动后会首先调用board.c中的rt_hw_board_init,另外在rt_hw_board_init中已经初始化了board.c UART数组中的所有串口,我们可以在后续直接测试UART1/2的功能;

RTT中main其实只是一个Task,并不像裸机开发那样时start.s跳转出的首个函数;

我们可以在main task中调用uart API发送/接收数据;

4.3 Tx/Rx 功能测试结果
由下图可以看到UART1/2均可正常使用,且中断可被正常触发;

依然是上述代码,将Uart2的Tx接入Uart1的Rx,可以看到打印如下:

同理可测Uart2的接收功能;
5 Git链接
https://gitee.com/zhang-haitao-1/gd32vw553h-test
6 开发者贡献名单
《兆易创新GD32VW553H-EVAL开发实践指南》包含的内容以及对应的贡献者如下,感谢各位小伙伴的支持与贡献!

全部0条评论
快来发表一下你的评论吧 !