跳到主要内容

CH32 环境配置

CH32的RISC-V工具链极其混乱,推荐使用的有如下两种:

  • 官方MRS自带的riscv-wch-elf: 支持WCH的rv32imafcxw拓展指令集,但是对C++标准实现有残缺,无法使用Eigen等C++库
  • 上游riscv32-unknown-elf:不支持WCH的拓展指令集,但是对C++标准实现完整,需要自行编译。Windows下需要使用MSYS2进行编译,过程较为繁琐。

快速编译可以使用本项目提供的Docker镜像。

CMake配置

需要多配置一个选项:LIBXR_CH32_CONFIG_FILE,指定CH32外设库的配置文件路径,例如:ch32v30x_conf.h

set(LIBXR_SYSTEM FreeRTOS)
set(LIBXR_DRIVER ch)

set(LIBXR_CH32_CONFIG_FILE "ch32v30x_conf.h")

add_subdirectory(libxr)

...

CH32驱动库

WCH的官方外设驱动包括(但不限于)以下bug:

  • extern "C"多次定义,导致C++下引用头文件报错
  • 存在usb外设源文件与头文件,但是并未被引用
  • FreeRTOS mstatus 相关位被错误设置,线程切换与优先级异常
  • 不存在的外设组别定义

以上均已经在示例工程中修复

此外,为了使LibXR的时间基准工作,需要手动在Systick的中断函数中添加以下代码:

void SysTick_Handler( void )
{
extern void libxr_systick_handler(void);
libxr_systick_handler();
......
}

Flash问题

  • flash写入的时钟频率必须小于60Mhz
  • 擦除完成后未进行写入时,虽然此块flash的内容为0xff,但是读到的实际值为一个魔数(0xE339u
  • 多数型号有赠送flash,速度要比正常flash低两个数量级
  • 在使用到额外flash的时候,需要给openocd添加wch_riscv unfreeze命令,才能正常烧录

参考openocd命令

"openOCDLaunchCommands": [
"init",
"wch_riscv unfreeze"
],

示例工程

CH32V307+FreeRTOS+XRUSB

CH32V203+FreeRTOS+XRUSB