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"
],