跳到主要内容

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

示例工程