CH573 从入门到精通:一文吃透沁恒 RISC-V 低功耗蓝牙 SoC
目录
- [认识 CH573](#认识 CH573)
- 硬件架构详解
- 外设详解
- [BLE 蓝牙协议栈架构](#BLE 蓝牙协议栈架构)
- 开发环境搭建
- [快速上手:点灯 + 串口打印](#快速上手:点灯 + 串口打印)
- [第一个 BLE 工程:广播与透传](#第一个 BLE 工程:广播与透传)
- 进阶主题
- 常见问题与调试技巧
- 从入门到精通的学习路线
- 参考资料
一、认识 CH573
1.1 什么是 CH573
CH573 是南京沁恒微电子(WCH)推出的一颗 32 位 RISC-V 内核、集成 2.4GHz 射频收发器 的低功耗蓝牙(BLE)MCU/SoC。它把「MCU + 蓝牙射频 + 常用外设」集成在一颗芯片里,一颗芯片就能完成数据采集、逻辑控制和无线通信,非常适合电池供电的小型物联网节点、可穿戴设备与低成本蓝牙配件。
它的几个鲜明标签:
- RISC-V 内核:采用沁恒自研的 RISC-V3A 内核,摆脱了对 ARM 内核授权的依赖,是国产芯片自主可控路线的代表之一;
- 蓝牙集成度高:内置 2.4GHz 射频与 BLE 基带,外接少量阻容和晶振即可工作;
- 低成本、低功耗:面向性价比和电池应用,睡眠功耗做到微安级;
- 生态完善:官方提供 MounRiver Studio IDE、WCH-Link 调试器、EVT 评估例程,上手门槛低。
1.2 家族定位与选型
CH573 属于 WCH 的 CH57x / CH58x 蓝牙系列。选型时可以参考同族差异:
| 型号 | 蓝牙版本 | 主要特点 | 典型定位 |
|---|---|---|---|
| CH571 | BLE 4.2 | 入门、较小 Flash | 基础蓝牙透传 |
| CH573 | BLE 4.2 | 大容量 Flash(F 版 448KB),外设齐全 | 本文主角,通用 BLE 节点 |
| CH577 | BLE 5.1 | 更新协议版本 | 需要 5.1 特性的场景 |
| CH578 | BLE 5.2 | 协议再升级 | 更高吞吐/扩展特性 |
| CH579 | BLE 4.2 | 集成以太网 MAC + USB | 需要联网/有线的场景 |
| CH582 / CH583 | BLE 5.3 | 新一代,性能更强 | 新项目优先考虑 |
小结:如果你的项目是「采集数据 + 蓝牙上报/控制」的经典 BLE 从机(Peripheral)场景,CH573 是非常成熟、资料丰富、成本友好的选择;如果是全新项目且追求最新协议,可以顺便评估 CH582/CH592 等新平台。
1.3 核心参数一览表
下表为 CH573 的关键参数速览(具体数值以官方数据手册为准):
| 项目 | 参数 |
|---|---|
| 内核 | RISC-V3A(32 位,沁恒自研) |
| 最高主频 | 60 MHz |
| 无线 | 2.4 GHz,BLE 4.2 |
| CodeFlash(代码闪存) | 256 KB(CH573)/ 448 KB(CH573F) |
| SRAM | 18 KB |
| DataFlash(掉电保存) | 支持,可作 EEPROM 模拟 |
| ADC | 12 位 SAR,多通道(通道数视封装) |
| USART | 4 组(可配为 UART 或 SPI) |
| I2C | 支持 |
| PWM | 10 位,多通道 |
| 电容触摸按键 | 支持(TouchKey,视封装/型号) |
| 定时器 | 通用定时器 + RTC + 看门狗 |
| GPIO | 视封装而定(QFN28 / QFN40 / QFN48 等) |
| 工作电压 | 约 1.7 ~ 3.6 V(低电压工作) |
| 工作温度 | -40 ~ +85 ℃ |
| 封装 | QFN28(CH573F)、QFN40、QFN48 等 |
| 低功耗 | 睡眠/掉电模式微安级 |
⚠️ 提示:上表用于快速建立整体印象。RAM 大小、ADC 通道数、触摸通道数、电压范围等精确值,请以你实际使用型号的 CH573DS1.PDF 为准------不同封装/型号略有差异。
二、硬件架构详解
2.1 内核
CH573 使用 RISC-V3A 内核,这是 WCH 基于 RISC-V 指令集自研的 32 位处理器,支持 RV32 基础整数指令集(含乘法/除法扩展),最高运行频率 60 MHz。相比同价位 8 位机,性能有明显优势;相比 ARM Cortex-M0/M3,则做到了自主可控、无授权费,能进一步压低芯片成本。
对应用开发者来说,内核的差异主要体现为:
- 使用 RISC-V 工具链(GCC)编译;
- 中断控制器、启动流程、向量表等细节与 ARM 不同,但官方 SDK 已封装好,普通应用开发基本无感知;
- 支持通过 WCH-Link 进行 SWD 在线调试(断点、单步、查看变量)。
2.2 存储架构
CH573 的存储大致分为:
- CodeFlash:存放程序代码。CH573 为 256 KB,CH573F 为 448 KB,对大多数 BLE 应用非常宽裕;
- SRAM:运行时的变量与堆栈空间;
- DataFlash:从 Flash 中划出的一部分,用于掉电保存数据(类似 EEPROM),配合官方读写库可实现磨损均衡,适合存配置参数、序列号、配对信息等。
实践建议:经常要「写配置」的地方,不要直接裸写 CodeFlash 区,用官方 DataFlash 库更安全、寿命更长。
2.3 时钟系统
CH573 通常使用 外部 32 MHz 晶体 作为主时钟源,经内部 PLL 倍频到 60 MHz 供 CPU 与外设使用;同时有 32.768 kHz 低频时钟用于 RTC 和低功耗定时唤醒。初始化主频时,一般直接调用:
c
SetSysClock(CLK_SOURCE_PLL_60MHz);
2.4 电源与低功耗
CH573 支持低电压工作,并内置 LDO / DC-DC 等电源管理单元,配合多种低功耗模式(睡眠、掉电等)实现微安级的待机电流,非常适合纽扣电池 / 锂电池供电的产品。
典型低功耗思路:
- 平时让芯片进入睡眠模式,仅保留低频时钟与必要的唤醒源;
- 由定时器、GPIO 中断或蓝牙连接事件唤醒;
- 采集/上报完成后再次睡眠。
蓝牙连接状态下的功耗优化(修改连接参数、广播参数、发射功率等)是进阶阶段的重要内容,后文会展开。
2.5 2.4GHz 射频
CH573 片内集成了 2.4GHz 射频收发器、基带与 BLE 链路层,外部只需接 32 MHz 晶体、少量匹配电容电感、天线(或 PCB 天线)即可完成无线收发。发射功率可配置,以满足不同距离和功耗需求。射频前端设计时注意:
- 天线匹配与走线对通信距离影响很大,参考官方硬件参考设计布局;
- 晶振负载电容需按芯片要求配置(EVT 中通过
HSECFG_Capacitance()配置)。
三、外设详解
CH573 外设覆盖了物联网节点的常见需求。
3.1 GPIO
GPIO 支持多种模式(推挽输出、开漏输出、上拉/下拉/浮空输入等),不同驱动能力可选。常用 API:
c
GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeOut_PP_5mA); // PB1 推挽输出,5mA
GPIOB_SetBits(GPIO_Pin_1); // PB1 置高
GPIOB_ResetBits(GPIO_Pin_1); // PB1 置低
3.2 USART(UART / SPI 复用)
CH573 提供多组 USART,可灵活配置成 UART 或 SPI。这是它与很多 MCU 不同的一个设计点:同一组外设既可以是串口,也可以是 SPI 主/从机。
- 作 UART:用于打印调试日志、与外部模块通信(AT 指令、传感器等);
- 作 SPI:用于驱动 Flash、LCD、传感器等。
UART 初始化通常一行搞定:
c
UART1_DefInit(); // 默认 115200-8-N-1
3.3 I2C
I2C 用于连接各类数字传感器(温湿度、加速度计、EEPROM 等)。官方 EVT 提供 I2C 主机例程,读写时序封装完善,直接调用即可。
3.4 ADC
内置 12 位 SAR ADC,多路通道,可采集电压、电池电量、模拟传感器等。使用流程大致为:初始化 → 配置通道 → 启动单次/连续转换 → 读取结果。
c
ADC_Init(); // 初始化 ADC
ADC_ChannelCfg(ADC_CH0); // 选择通道
ADC_ExcutSingleConver(); // 启动单次转换
while(!ADC_IsConverComplete()); // 等待转换完成
uint16_t val = ADC_GetCurrentValue(); // 读取转换值
说明:ADC 函数名与通道宏请以你 SDK 版本中的
CH57x_adc.h/ EVT 例程为准。
3.5 PWM
PWM 为 10 位,多通道,可用于调光、电机调速、蜂鸣器、模拟 DAC(配合 RC 滤波)等。
3.6 电容触摸按键(TouchKey)
CH57x 系列支持电容式触摸按键,无需外接触摸芯片即可实现触摸按键面板,适合家电面板、遥控器、灯具控制等场景。触摸通道数量视封装与型号而定,开发时参考 EVT 中的 TouchKey 例程与调校方法。
3.7 定时器 / RTC / 看门狗
- 通用定时器:延时、PWM 计数、输入捕获等;
- RTC:基于 32.768 kHz,用于实时时钟与低功耗定时唤醒;
- 看门狗(WDT):防程序跑飞,量产建议开启。
四、BLE 蓝牙协议栈架构
理解协议栈架构,是「会用」到「精通」的分水岭。CH573 的 BLE 协议栈是官方以库 + 头文件 形式闭源提供的,应用通过事件回调 + 参数接口与协议栈交互。
4.1 分层结构
从下到上大致为:
- 物理层 + 链路层:射频收发、跳频、连接建立(由协议栈内部处理);
- GAP(Generic Access Profile):管理广播、扫描、连接、角色(Peripheral/Central)等;
- GATT(Generic Attribute Profile):以 Service(服务)/ Characteristic(特征)组织数据;
- 应用层:你的业务逻辑,通过回调收到协议栈事件。
4.2 TMOS 任务调度
CH57x 协议栈使用 TMOS(一种轻量任务调度/OS 抽象,源自 TI 的 OSAL 体系)驱动,主循环里反复调用:
c
while (1) {
TMOS_SystemProcess(); // 处理协议栈事件队列与定时器
}
应用侧通过 tmos_set_event()、tmos_start_task()、tmos_start_timer() 等接口注册任务、事件与定时器,协议栈事件(连接建立、断开、收到数据等)会以回调形式派发到应用。
4.3 角色与应用回调
- Peripheral(从机/外围设备):最常见的「传感器 + 手机连接」形态;
- Central(主机/中心设备):主动扫描、连接其它设备;
- 还有 Broadcaster(广播者) 、Observer(观察者) 等角色。
应用通过注册回调函数接收 GAP/GATT 事件,例如连接建立、断开、特征值被写、特征值被读等,然后在回调里执行相应业务逻辑。
五、开发环境搭建
5.1 工具链一览
| 工具 | 用途 | 说明 |
|---|---|---|
| MounRiver Studio (MRS) | 官方 IDE | 基于 Eclipse,集成 RISC-V GCC 工具链,Windows 免费 |
| WCH-Link | 下载 / 调试 | 支持 SWD 在线调试(断点、单步、查看变量) |
| WCHISPTool | 串口 ISP 烧录 | 通过串口/USB 下载固件,适合量产或快速下载 |
| EVT 评估包 | 例程 / 库 | 官方 BLE 与各外设例程、协议栈库 |
部分用户也会用 Keil MDK 配合 WCH 的 pack 开发,但官方主推 MRS,教程和例程以 MRS 为主。
5.2 MRS 安装步骤
- 到 MounRiver 官网下载对应版本的 MounRiver Studio 安装包;
- 按默认路径安装(避免中文路径,防止 RISC-V 工具链路径问题);
- 到 WCH 官网下载 CH573EVT 评估包并解压(也建议一并下载 CH573DS1 数据手册);
- 在 MRS 中「导入工程」,选择 EVT 里的 BLE 例程(如
SimpleBLEPeripheral)即可。
5.3 烧录与调试
- WCH-Link:连接芯片 SWD 引脚,在 MRS 中可直接下载与调试;
- WCHISPTool:将芯片通过串口(配合一键下载电路)连接电脑,选择固件 HEX 烧录。
量产前务必规划好「一键串口下载」电路(BOOT 引脚配合),能大幅提高生产效率。
六、快速上手:点灯 + 串口打印
任何平台的第一步,都是让灯闪起来、让串口吐出一句话。这两件事跑通,说明工具链、烧录、时钟、GPIO、串口都正常了。
6.1 点灯
c
#include "CH57x_common.h"
int main(void)
{
// 1. 配置主频 60MHz
SetSysClock(CLK_SOURCE_PLL_60MHz);
// 2. PB1 配置为推挽输出
GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeOut_PP_5mA);
while (1)
{
GPIOB_SetBits(GPIO_Pin_1); // 亮
mDelaymS(500);
GPIOB_ResetBits(GPIO_Pin_1); // 灭
mDelaymS(500);
}
}
6.2 串口打印
CH573 例程常用 UART1 作为调试串口。先用一行初始化,再重定向 printf 或直接发送字符串:
c
#include "CH57x_common.h"
#include <string.h>
void Debug_Init(void)
{
GPIOA_SetBits(GPIO_Pin_9); // PA9 = TXD1
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit(); // 默认 115200-8-N-1
}
// 重定向 printf(寄存器名以 SDK 实际头文件为准)
int _write(int fd, char *buf, int len)
{
for (int i = 0; i < len; i++)
{
while (R8_UART1_TFC == UART_FIFO_SIZE); // 等待发送 FIFO 非满
R8_UART1_THR = *buf++;
}
return len;
}
int main(void)
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
Debug_Init();
printf("Hello CH573!\r\n");
UART1_SendString((uint8_t *)"System start.\r\n", strlen("System start.\r\n"));
while (1) { }
}
通过 USB 转串口模块(接 PA9 TX、PA10 RX 与 GND)即可在串口助手上看到输出。
七、第一个 BLE 工程:广播与透传
跑通外设后,进入本文核心:让 CH573 作为 BLE 从机被手机扫描到、连接并通信。
7.1 从机广播(Peripheral + Advertising)
EVT 中的 SimpleBLEPeripheral 是标准起点,其主函数结构如下(已简化注释):
c
#include "CH57x_common.h"
#include "HAL.h"
#include "simpleBLEPeripheral.h"
int main(void)
{
uint8_t initial_advertising_enable = TRUE;
SetSysClock(CLK_SOURCE_PLL_60MHz);
// 调试串口(可选)
#ifdef DEBUG
GPIOA_SetBits(bTXD1);
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
#endif
// GPIO 默认上拉输入,减少浮空漏电
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
HSECFG_Capacitance(HSECap_18pF); // 晶振负载电容
CH57X_BLEInit(); // 蓝牙协议栈初始化
HAL_Init(); // 硬件抽象层初始化
GAPRole_PeripheralInit(); // 配置为从机角色
SimpleProfile_AddService(GATT_ALL_SERVICES); // 添加 GATT 服务
SimpleProfile_RegisterAppCBs(&simpleProfileCBs); // 注册应用回调
// 开启广播
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED,
sizeof(uint8_t), &initial_advertising_enable);
// 启动应用事件
tmos_set_event(simpleBLEPeripheral_TaskID, START_DEVICE_EVT);
while (1)
{
TMOS_SystemProcess(); // 协议栈任务调度主循环
}
}
下载后,用手机上的 BLE 调试 App(如 nRF Connect、LightBlue)扫描,即可看到设备广播。
7.2 自定义 Service / Characteristic
真正的业务通信需要定义自己的服务与特征值。核心思路:
- 定义 UUID、特征值长度与读写属性(读/写/通知);
- 实现特征值表(
gattAttribute_t); - 在回调里处理
ATT_HANDLE_VALUE(写入)与ATT_HANDLE_VALUE_NOTI(通知)等事件; - 通过
SimpleProfile_SetParameter()/SimpleProfile_GetParameter()读写特征值。
7.3 数据透传(手机 ⇄ MCU)
经典「蓝牙透传」流程:
- 手机 → MCU:手机写特征值,MCU 在写回调里收到数据,转交给 UART 或业务逻辑;
- MCU → 手机 :MCU 通过
GATT_Notification()(或GATT_Indication())把数据推送给手机。
EVT 中一般提供 Peripheral(透传)与 Central(主机)等例程,可在此基础上裁剪成自己的产品。
八、进阶主题
8.1 低功耗设计
低功耗是 BLE 产品的核心竞争力之一,几个关键点:
- 睡眠模式选择:不同模式功耗与唤醒延迟不同,按需选择;
- 广播参数:延长广播间隔、缩短广播持续时间可显著省电;
- 连接参数:连接间隔(Connection Interval)越大越省电,但实时性下降,需在功耗与响应速度间权衡;
- 发射功率:近距离场景降低发射功率;
- 浮空引脚处理:未用引脚配置为上拉/下拉,避免漏电。
实测功耗前,务必用万用表/功耗分析仪测量不同状态(广播、连接、睡眠)的电流,形成一张功耗表,再针对性优化。
8.2 OTA 空中升级
量产产品离不开 OTA(Over-The-Air)升级。基本思路:
- Flash 划分为 Bootloader 区 与 App 区;
- 手机把新固件分包通过 BLE 写入;
- Bootloader 校验 CRC/签名后搬运并跳转运行。
WCH 官方提供 OTA 例程,可在其基础上加入自己的版本管理、断点续传与校验逻辑。
8.3 BLE Mesh
WCH 为 CH57x/CH58x 系列提供 BLE Mesh 组网方案,可用于灯控、楼宇、传感网络等需要「多跳、广播泛洪」的场景。Mesh 涉及节点(Node)、Provisioning(入网)、模型(Model)等概念,是进阶方向里较有深度的一块。
8.4 主机模式(Central)
CH573 也能作为主机主动扫描并连接其它 BLE 从机。EVT 中的 Central 例程演示了扫描与连接流程。主机+从机的双角色/多连接是更复杂的场景,需要深入理解 GAP 与连接管理。
九、常见问题与调试技巧
- 烧录不进去:确认 WCH-Link 接线(SWDIO/SWCLK/GND/VCC)、供电电压、BOOT 状态;ISP 方式确认串口与一键下载电路。
- 编译报工具链错误:检查 MRS 安装路径是否含中文/空格,工程是否完整导入 EVT 依赖。
- 能广播但连不上 :检查广播间隔、连接参数、
GAPRole_配置是否冲突。 - 通信数据乱码 :先确认串口波特率一致;再排查数据长度与
\r\n处理。 - 功耗偏高:优先排查未用 GPIO 是否浮空、外设是否未关、广播/连接参数是否合理。
- 看门狗复位:确认喂狗周期与低功耗唤醒的时序配合。
- 学会看回调事件:遇到「没反应」,先在关键回调里打印事件码,定位是没进入回调还是逻辑没跑对。
调试利器:WCH-Link 的在线调试 + 串口日志 + 手机 BLE 抓包(nRF Connect 可看 Service/Characteristic 与数据)三件套,基本能定位 90% 的问题。
十、从入门到精通的学习路线
| 阶段 | 目标 | 具体内容 |
|---|---|---|
| 入门 | 跑起来 | 搭好 MRS + WCH-Link;点灯、串口打印跑通 |
| 基础 | 会用外设 | GPIO、UART、SPI、I2C、ADC、PWM、定时器逐个过一遍 |
| 蓝牙 | 会连上 | 从机广播、连接、自定义 Service/Characteristic、透传 |
| 进阶 | 会做产品 | 低功耗调优、OTA、主机模式、看门狗与量产可靠性 |
| 精通 | 会做方案 | BLE Mesh、双角色/多连接、协议栈事件机制、射频与天线设计、量产与认证 |
建议的学习方式:
- 先跑例程:把 EVT 里每个例程下载、观察现象,再回来看代码;
- 对照数据手册:每个外设的寄存器/配置,结合手册理解 SDK 做了什么;
- 动手改:在例程上做小改动(改广播名、改 UUID、改引脚、加传感器),快速建立正反馈;
- 做一个小项目:如「温湿度传感器 + 手机显示」「蓝牙遥控器」「蓝牙点灯」,把外设+蓝牙串起来;
- 深入协议栈:读透 GAP/GATT/TMOS 机制,理解连接建立、参数更新、安全配对等流程。
参考资料
- WCH 官网 CH573 产品页
- CH573DS1 数据手册(PDF)
- CH573EVT 评估包(例程/库)
- MounRiver Studio 官网
- SoCXin/CH573(芯片信息汇总)
- WeActStudio WCH-BLE-Core 开发板
免责声明:文中代码为基于官方 EVT 的示意性说明,寄存器宏、函数名、通道数、内存/电压等精确参数可能因 SDK 版本与封装型号略有差异,请以你实际使用的数据手册与 SDK 为准。祝你早日玩转 CH573!🚀