CH32 环境配置
当前默认使用 WCH 提供的 GCC15 工具链,编译器前缀为 riscv32-wch-elf-。
模板工程也已经按这条线配置。如果只是想快速编译,也可以直接使用 docker-image-ch32-riscv,当前镜像里已经是 WCH GCC15 v240。
CMake 配置
CH32 工程至少要额外指定一个选项:LIBXR_CH32_CONFIG_FILE,用于告诉 LibXR 当前使用哪份 CH32 外设配置头文件,例如 ch32v30x_conf.h。
set(LIBXR_SYSTEM FreeRTOS)
set(LIBXR_DRIVER ch)
set(LIBXR_CH32_CONFIG_FILE "ch32v30x_conf.h")
add_subdirectory(libxr)
如果你使用的是当前模板工程,工具链前缀通常不需要手动写死。只有在你自己拼工程,或者机器上同时装了多套 RISC-V 工具链时,才需要显式指定 COMPILER_PREFIX。
驱动库问题
WCH 官方外设库本身有一些长期存在的问题,当前示例工程已经处理过的包括:
extern "C"重复定义,导致 C++ 下包含头文件报错- USB 外设的部分源文件和头文件虽然存在,但默认并没有被正确引用
- FreeRTOS 的
mstatus位设置有问题,会影响线程切换和优先级 - 某些不存在的外设组定义仍然出现在官方库里
如果你不是直接从示例工程起步,而是自己手工整理外设库,这些坑需要自己重新处理一遍。
Systick
为了让 LibXR 的时间基准正常工作,需要在 SysTick_Handler 里补一行 libxr_systick_handler():
void SysTick_Handler(void)
{
extern void libxr_systick_handler(void);
libxr_systick_handler();
......
}
Flash 问题
要注意的几点:
- Flash 写入时的时钟频率必须小于
60 MHz - 擦除完成但尚未写入时,虽然表面上全是
0xff,实际读回可能会看到魔数0xE339u - 很多型号带有赠送 Flash,这部分速度会比主 Flash 低很多
- 用到额外 Flash 时,OpenOCD 里通常要补
wch_riscv unfreeze,否则烧录不稳定
参考 openocd 命令:
"openOCDLaunchCommands": [
"init",
"wch_riscv unfreeze"
],