【Leo的手记】Linux平台使用CMake和GCC工具链开发CH32V003
0. 准备工作
0.1 开发库与开发工具链
所使用的开发库与开发工具链如下
沁恒官方提供的固件库
RISC-V Embedded GNUC交叉编译工具链
沁恒官方提供的Openocd
VSCode
对于RISC-V Embedded GNUC交叉编译工具链和Openocd在MounRiver官网提供的MRS_Toolchain_Linux工具包中有包含。下载以后自行安装和配置路径。
1.项目建立
按照统一的结构来创建项目目录与项目文件。在项目根目录中创建如下目录与文件。
app :目录,用于存放业务逻辑相关代码
system :目录,用于存放系统支持相关代码
link.ld :链接脚本文件,从官方库中拷贝,用于链接
startup_ch32v00x.S :启动文件,从官方库中拷贝
CMakeLists.txt :CMake构建脚本
在app目录中新建main.c,用于存放主函数代码。
在system目录中,创建如下目录
peripheral :外设库存放目录,将官方库中的相关代码放入该目录。
platform :平台相关代码,用于存放RISCV内核相关结构,将官方库中的core_riscv.c和core_riscv,h放入
supports.c :系统支持源文件,新建
supports.h :系统支持头文件,新建
在外设库的头文件存放目录中,新建头文件ch32v00x_libs.h,用于包含外设头文件。如下
至此,项目目录结构构建完成。
2. 编写系统相关支持库
该步骤主要编写supports.c与supports.h
2.1 编写supports.h
在supports.h中主要声明SystemCoreClock全局变量与系统延时相关函数。代码如下
在supports.c中包含该头文件
2.2 编写中断服务函数与系统时钟配置函数
在supports.c中加入如下代码
2.3 编写系统延时相关函数
在不使用RTOS的情况下,系统使用SysTick定时器实现延时。添加如下代码
2.4 编写SystemInit函数
在最后添加SystemInit函数,该函数由启动文件调用,在main函数执行之前初始化系统资源。
如下
3. 编写主函数
在app目录下的main.c中添加如下代码
该代码实现了对于PD6的翻转。
4. 编写CMakeLists.txt
构建脚本如下
这里额外说一个我踩的坑,因为官方没有给出GCC工具链构建选项的参考,因此我原本是直接使用CH32V103的编译选项,后来发现一直进入Hardfault,最后单步调试发现是因为执行了除法,所以进入了Hardfault,如此可以大概猜测,既然不是非法内存操作导致进入Hardfault,那执行除法进入Hardfault大概率是因为执行了非法指令。后来经过查看手册发现,CH32V103所支持的指令集为RV32IMAC,而CH32V003所支持的指令集为RV32EC,修改后错误消除。
5. 编译与烧录
5.1 编译
在项目根目录打开终端,输入
即可完成编译。
5.2 烧录
需要注意的是,CH32V003使用三线串行调试接口,不包含SWCLK信号,只有WCH-LINKE支持。连接WCH-LINKE,在项目根目录打开终端,输入
在此我是写成了一个脚本用于方便下载
需要注意的是,以上代码下载之后需要手动复位一下程序才能运行。
以上