CH573从入门到精通

CH573 从入门到精通:一文吃透沁恒 RISC-V 低功耗蓝牙 SoC

目录

  1. [认识 CH573](#认识 CH573)
  2. 硬件架构详解
  3. 外设详解
  4. [BLE 蓝牙协议栈架构](#BLE 蓝牙协议栈架构)
  5. 开发环境搭建
  6. [快速上手:点灯 + 串口打印](#快速上手:点灯 + 串口打印)
  7. [第一个 BLE 工程:广播与透传](#第一个 BLE 工程:广播与透传)
  8. 进阶主题
  9. 常见问题与调试技巧
  10. 从入门到精通的学习路线
  11. 参考资料

一、认识 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 等电源管理单元,配合多种低功耗模式(睡眠、掉电等)实现微安级的待机电流,非常适合纽扣电池 / 锂电池供电的产品。

典型低功耗思路:

  1. 平时让芯片进入睡眠模式,仅保留低频时钟与必要的唤醒源;
  2. 由定时器、GPIO 中断或蓝牙连接事件唤醒;
  3. 采集/上报完成后再次睡眠。

蓝牙连接状态下的功耗优化(修改连接参数、广播参数、发射功率等)是进阶阶段的重要内容,后文会展开。

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,可灵活配置成 UARTSPI。这是它与很多 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 分层结构

从下到上大致为:

  1. 物理层 + 链路层:射频收发、跳频、连接建立(由协议栈内部处理);
  2. GAP(Generic Access Profile):管理广播、扫描、连接、角色(Peripheral/Central)等;
  3. GATT(Generic Attribute Profile):以 Service(服务)/ Characteristic(特征)组织数据;
  4. 应用层:你的业务逻辑,通过回调收到协议栈事件。

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 安装步骤

  1. 到 MounRiver 官网下载对应版本的 MounRiver Studio 安装包;
  2. 按默认路径安装(避免中文路径,防止 RISC-V 工具链路径问题);
  3. 到 WCH 官网下载 CH573EVT 评估包并解压(也建议一并下载 CH573DS1 数据手册);
  4. 在 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

真正的业务通信需要定义自己的服务与特征值。核心思路:

  1. 定义 UUID、特征值长度与读写属性(读/写/通知);
  2. 实现特征值表(gattAttribute_t);
  3. 在回调里处理 ATT_HANDLE_VALUE(写入)与 ATT_HANDLE_VALUE_NOTI(通知)等事件;
  4. 通过 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)升级。基本思路:

  1. Flash 划分为 Bootloader 区App 区
  2. 手机把新固件分包通过 BLE 写入;
  3. 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、双角色/多连接、协议栈事件机制、射频与天线设计、量产与认证

建议的学习方式:

  1. 先跑例程:把 EVT 里每个例程下载、观察现象,再回来看代码;
  2. 对照数据手册:每个外设的寄存器/配置,结合手册理解 SDK 做了什么;
  3. 动手改:在例程上做小改动(改广播名、改 UUID、改引脚、加传感器),快速建立正反馈;
  4. 做一个小项目:如「温湿度传感器 + 手机显示」「蓝牙遥控器」「蓝牙点灯」,把外设+蓝牙串起来;
  5. 深入协议栈:读透 GAP/GATT/TMOS 机制,理解连接建立、参数更新、安全配对等流程。

参考资料


免责声明:文中代码为基于官方 EVT 的示意性说明,寄存器宏、函数名、通道数、内存/电压等精确参数可能因 SDK 版本与封装型号略有差异,请以你实际使用的数据手册与 SDK 为准。祝你早日玩转 CH573!🚀

相关推荐
Logintern091 小时前
Langgraph使用MemorySaver建立有记忆的图
开发语言·windows·python
oshan20121 小时前
华大小华HC32F460单片机在线烧录
单片机·嵌入式硬件
豆沙沙包?1 小时前
C++~~~vector容器(p31-P40)
开发语言·c++
必须会一定会1 小时前
GLM-5.3 迁移实战:强制思考、1M 上下文与官方编程基准
android·开发语言·kotlin
牛油果子哥q1 小时前
C++STL容器详解:vector/list/string底层扩容、迭代器失效终极解决、容器选型避坑
开发语言·c++·list
LCG元2 小时前
STM32 USB HID 自定义免驱设备开发:从报告描述符到上位机 64 字节收发实战
stm32·单片机·嵌入式硬件
meilindehuzi_a2 小时前
Next.js 全栈基础实战:从 SPA、SSR 到 App Router 与 Todo API
开发语言·javascript·ecmascript
Chen—LSN2 小时前
C语言——数据在内存中的存储
c语言·开发语言·经验分享·笔记
Hello_Damon_Nikola2 小时前
HT2813从入门到精通
单片机·嵌入式硬件·物联网