欢迎光临散文网 会员登陆 & 注册

【Leo的手记】Linux平台使用CMake和GCC工具链开发CH32V003

2023-07-07 12:36 作者:神棍技术宅Leo  | 我要投稿

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,在项目根目录打开终端,输入

在此我是写成了一个脚本用于方便下载

需要注意的是,以上代码下载之后需要手动复位一下程序才能运行。

以上

【Leo的手记】Linux平台使用CMake和GCC工具链开发CH32V003的评论 (共 条)

分享到微博请遵守国家法律