☰
CH592蓝牙SoC实战:从低功耗BLE选型到HID键盘量产
2026/10/31 10:37:59 网站建设 项目流程

做蓝牙小设备选型的时候,我最近再次陷入了熟悉的纠结:要一颗能直接跑 BLE 协议栈的 MCU,而不是那种靠 AT 指令做透传的经典蓝牙模块。以前项目里用过 HC05,模块本身便宜,但做主从切换、配对、功耗控制都非常别扭,更关键的是它跑的是经典蓝牙协议,和手机端常见的 BLE 广播、扫描、GATT 服务完全是两套东西。后来把目光转向 CH592 这类蓝牙 MCU:2.4GHz 射频、RISC-V 内核、BLE 协议栈全塞进一颗 SoC,外围只需要晶振、天线、电源,整机物料成本能压得很低,低功耗设计的主动权也回到了自己手里。这篇文章把从选型到硬件集成、从 SDK 环境到低功耗调优的完整过程拆开讲,适合准备做蓝牙键盘、遥控器、温湿度传感器标签、HID 外设、beacon 这类项目的朋友参考。

1. 为什么选 CH592:从 HC05、ESP32 到国产 BLE SoC 的选型思路

1.1 一颗 BLE SoC 到底解决了什么

在“蓝牙 MCU”这个词普及之前,最常见的做法是“单片机 + 蓝牙模块”。你需要两个器件:一颗 MCU 管业务逻辑,一个模块管射频。AT 指令集上手确实快,但一旦你需要在连接事件里及时发数据、需要设备被蓝牙事件唤醒、需要把功耗压到纽扣电池撑几年,透传模块的“中间人”身份就成了最大的瓶颈。

这里有一个很多人没意识到的问题:经典蓝牙模块大多走 SPP 串口协议,Android 上还有不少串口助手能连,但 iOS 对 SPP 的支持非常弱,很多场景只能用 BLE。你辛苦做出来的 HC05 透传方案,到了 iPhone 上可能直接没法用。而像 CH592 这样的 BLE SoC,把应用处理器、链路层、协议栈、射频前端全部放在一颗芯片里,你在代码里能直接操作 GATT 层,能决定什么时候睡眠、什么时候醒来监听、连接间隔和广播间隔怎么调。这种对射频行为的掌控力,是做低功耗产品的前提。

1.2 CH592 在沁恒蓝牙家族中的位置

沁恒的 BLE 芯片线其实有好几代。早期 CH579 是 Cortex-M0 核心,适合做简单 BLE 透传和传感器节点。后面转向自研青稞 RISC-V 内核,CH583、CH592 这些型号开始把 BLE 特性、外设丰富度和功耗平衡得更好。单论“低功耗蓝牙 MCU 集成方案”,CH592 目前的定位是主力型号:BLE 5.x 的常规特性像 2M PHY、Coded PHY、广播扩展都能支持,片内给了足够的 Flash 和 RAM 去跑协议栈和业务代码,常见外设如 UART、SPI、I2C、ADC、PWM 等基本齐全。

选型时我的建议是:不要只盯着主频和 Flash,先看三样东西。第一,它支持的角色是否匹配你的产品,比如你要做键盘,那必须确认 Peripheral 角色和 HID 服务能稳定跑;第二,低功耗模式是否够用,唤醒源是否覆盖你的场景,比如 GPIO 唤醒、RTC 唤醒、BLE 唤醒;第三,射频性能指标,接收灵敏度、发射功率上限是否满足通讯距离。这些数据以官方最新数据手册和 EVT 资料为准,项目启动前花半天把这几页读完,比开发中遇到问题再返工划算得多。

1.3 和 HC05、ESP32 的对比

我经常在项目群里看到有人问“HC05 连不上怎么办”,或者“用 ESP32 做低功耗蓝牙键盘行不行”。先说结论:这些方案都能做 demo,但都不适合直接对标 CH592 这种低功耗 BLE 量产方案。

对比维度CH592 这类 BLE SoCHC05 经典蓝牙模块ESP32 系列
协议BLE 5.x,iOS/Android 原生支持好经典蓝牙 SPP,iOS 支持差经典蓝牙 + BLE 双模,偏原型验证
功耗睡眠电流 uA 级,平均电流可精确控制模块级功耗偏高,难以深睡射频功耗大,低功耗模式较粗
集成度单芯片,射频 + 协议栈 + MCU需要额外 MCU 配合单芯片但资源开销大
开发门槛需要理解 BLE 服务和 TMOS 调度AT 指令简单生态丰富,上手资料多
适用场景纽扣电池小型量产设备简单透传 demo复杂物联网网关、原型验证

我见过不少团队在原型阶段用 ESP32 顺手就把模块做了,等要过功耗验收时才发现很难降下来。ESP32 的优点是性能强、Wi-Fi/BT 双模,但它的“低功耗”和 BLE SoC 的“低功耗”不是一个量级。如果你的产品最终形态是纽扣电池、硬币电池、甚至无电池取电,老老实实选专用 BLE MCU 才靠谱。

2. 最小硬件系统:电源、晶振、天线匹配一个都不能省

很多人拿到 EVT 评估板,把例程跑通了就以为离产品很近了。等到自己画板子,发现射频距离短一半、睡眠电流多几十微安,才意识到硬件上的每个细节都是坑。CH592 的最小系统不长,但电源入口、晶振布局、天线匹配这三块必须认真对待。

2.1 电源入口设计:先想清楚电流从哪里漏

低功耗系统的电源设计和普通嵌入式板子不太一样,核心问题不是“够不够稳压”,而是“静态电流漏到了哪里”。你选了一颗睡眠电流只有 2uA 的 MCU,结果板子上一个 LDO 静态电流就吃掉 3uA,那 MCU 再省也白搭。

我通常这样处理电源入口:如果是纽扣电池供电,优先选低静态电流的 LDO,Iq 最好在 1uA 以下。CH592 内部也集成了电源管理相关的低功耗模式,具体选择 LDO 还是 DC-DC 工作方式,要看官方手册里对电流的标注。有一点我要特别提醒:原理图上预留一个 0 欧电阻或者磁珠位置,放在电池正极到芯片 VDD 之间。调试功耗时把 0 欧电阻拿掉,串电流表,这是最直接的测量手段。

另外,如果你要测试真实的睡眠电流,不能只在 VDD 和电池之间串万用表就完事。板上的 4.7uF 退耦电容、10uF 储能电容都会在芯片深度睡眠后继续漏电,电容的 ESR 不同,漏电流也不一样。我第一次测低功耗板子时,芯片显示睡眠正常,但整板电流就是多出 8uA,最后定位到一颗 0805 封装的陶瓷电容在 DC 偏压下的等效漏电阻,换掉后才恢复正常。这不是玄学,是实际会踩到的坑。

2.2 晶振布局与负载电容纪律

BLE 射频对参考时钟的精度要求很高。主晶振一般是 32MHz 无源晶振,它决定了射频载波的中心频率,频偏太大会直接导致信号质量差、连接困难。我的经验是:晶振尽量靠近芯片的晶振引脚,走线短且包地,周围不要走数字信号线;晶体下方的地平面要完整,不要有跨层缝隙。

负载电容不是随便焊两个 15pF 上去就完事,要按晶振规格书给出的 CL 值计算,还要把芯片引脚的寄生电容估算进去。很多人直接在开发板上照抄电容值,换了一批晶振批次后频率偏了 20ppm 以上,产线量产才会发现。建议每批物料到货后,有条件的话用频率计看主时钟输出,或者用蓝牙抓包工具观察实际中心频偏,这个习惯能替你挡掉很多售后隐患。

32.768kHz 低速晶振同样重要。如果设计需要 RTC 定时唤醒,深睡眠模式下就只有它在跑。选低 ESR、低功耗的小封装晶振,负载匹配照手册来。有些低成本项目想省掉这颗晶振,用芯片内部 RC 做 RTC,但温漂比较明显,定时启动广播会有累积误差,设备间同步性差的时候你就知道这颗晶振的钱不能省。

2.3 天线与匹配网络:距离不够,八成是这里出的问题

BLE 天线常用 PCB 天线或陶瓷天线。我踩过最大的坑是:原理图完全照参考设计,PCB 天线区域却没按参考设计留净空,晶振和地线从天线下面穿过,结果是空旷距离只有 5 米。后来重新布局,把天线区域下方所有层铜皮掏空,留足净空和净空边缘地过孔,距离立刻回到 40 米以上。

关于匹配网络,参考设计里通常会有一段 π 型匹配:串联电感和两个并联电容,很多时候调试时直接省略或改成 0 欧。原型阶段可以这么干,但产品结构定型后必须重新调整。天线附近的电池、金属支架、外壳喷涂都会改变天线阻抗,最好在结构样机阶段用网分实际测一下 S11 和频偏。没有网分的话,至少要用蓝牙抓包工具看不同信道下的 RSSI 表现。预留匹配元件位是经验,尤其是并联电容位置,哪怕暂时不焊,也给后期调试留了一条路。

3. SDK 与工程集成:TMOS 任务模型、BLE 流程与 HID 设备实现

硬件只是载体,真正决定开发体验的是 SDK 和协议栈。CH592 的 EVT 例程,第一次打开的人会有一种既熟悉又陌生的感觉。熟悉的是外设驱动接口类似传统 MCU 的 HAL 库,陌生的是里面有一套叫 TMOS 的调度机制,整个 BLE 应用都围着它转。

3.1 开发环境与烧录流程

CH592 的 IDE 用的是沁恒 MounRiver Studio,基于 Eclipse,下载 EVT 后直接导入 BLE 工程即可。第一次编译常见报错基本集中在两点:一是工程路径带了中文或空格,二是编译器的芯片型号选错。如果你看到类似 failed to create module configuration “mcu” 这种提示,多半是工作区里同时打开了多个不同系列工程导致配置冲突,新建一个干净工作区重新导入就好。

烧录方式我建议优先用 WCH-Link 调试器,既能下载又能在线调试。量产阶段用串口 ISP 工具,在工程里打开 bootloader 选项,配合沁恒的 ISP 工具通过 UART 下载固件,产测时可以省去调试器成本。有一点要记牢:ISP 下载和 SWD 调试的引脚如果和业务引脚冲突,要检查数据手册的复用关系,别把下载引脚接成了 LED,结果一发固件芯片就进不了下载模式。

3.2 TMOS 协作式调度:和裸机 while(1) 的思路差异

用惯了裸机 while(1) 加中断的人,第一次看 TMOS 会觉得别扭,但理解了之后会发现这是 BLE 应用的标准解法。TMOS 本质是一个协作式任务调度器:你在初始化时注册任务,设置事件标志,跑起来之后任务循环检查有没有事件,处理完就立刻让芯片进入低功耗状态。只有中断或射频事件到来时,芯片才被唤醒去执行对应的任务处理函数。

举个例子,按键扫描不要用主循环里轮询 GPIO 的方式。正确做法是按键 GPIO 配置为下降沿中断,按下时在中断里置一个“按键事件”标志,同时激活一个 10ms 的去抖定时器。TMOS 任务里收到去抖定时事件后读取 GPIO 电平,确认有效就进入业务逻辑。这样芯片在没有按键时完全处于睡眠状态,只有按下那一瞬间才会醒来跑一次,电流只有 uA 级。

很多从裸机转过来的人会忍不住在任务里加长延时,比如自己写 delay 函数去等待某个外设完成。这在低功耗系统里是大忌,因为阻塞延时等于让芯片全速跑空转。正确做法是把任务拆成“状态 + 事件”,配合 TMOS 定时器去完成时间相关逻辑。记住一点:TMOS 的事件循环跑得越快回到睡眠,你的平均功耗就越低。

3.3 实现一个低功耗 BLE HID 键盘的流程拆解

HID over GATT(HOGP)是 BLE 键盘、遥控器、鼠标的通用实现方式。手机和 PC 系统原生支持这个服务,所以你在广播里把设备类型声明为键盘后,手机就能识别出“蓝牙键盘”而不是“未知设备”。

具体流程上:第一步,在 BLE 服务里注册 HID 服务,配置 HID Information、Report Map、Report 这些特征。Report Map 里写标准的键盘 HID 描述符,按键用法页定义从 0x04 到 0x65,对应键盘上的字母、数字、功能键。第二步,把设备放在 Peripheral 角色里,广播配置上把 Appearance 字段设置成键盘类型,这样手机扫描时就能识别设备类型。第三步,处理连接事件和按键上报。按键按下后,把键值填进 8 字节的报告里(第 1 字节是修饰键,Ctrl/Shift/Alt 组合,第 3 字节开始是有效按键键值),通过 CCCD 打开通知后,用 GATT Notification 把报告发给主机。

这套流程的难点不在 HID 描述符本身,而是低功耗状态下如何做到“按键即唤醒、快速上报、报告完再睡”。我实际的做法是:空闲时不维持连接,让主机处于断开状态,芯片深睡眠;按键按下用 GPIO 唤醒,选择快速定向广播或者直连回连机制;数据上报完成后主动断开,重新回到深睡眠。这样平均电流能压到非常低,纽扣电池用一年以上是可行的。

4. 低功耗设计要点:从电流模型到每一毫安的来源

低功耗设计不是最后调一个参数,而是从第一天就把“每一微安从哪来、到哪去”算清楚。这一章我按软件参数、睡眠策略、硬件电路三个层面拆开讲,每个层面都有能直接抄作业的配置。

4.1 先建功耗模型:平均电流的决定公式

我习惯在项目初期就建立一个电流估算表,不追求精确,但要把量级算明白。BLE 设备平均电流的简化模型是:

平均电流约等于“发射电流的时间加权 + 接收电流的时间加权 + 睡眠电流的时间加权”,再除以事件周期。比如连接间隔 100ms,设备在每个连接事件里约 1.5ms 处于接收状态,接收电流 6mA,其余时间深度睡眠 2uA。算下来大约是:(6mA × 1.5ms + 0.002mA × 98.5ms) / 100ms ≈ 90uA。如果你把从机延迟配置成 3,设备每 400ms 才醒来监听一次,平均电流就能降到 25uA 左右。这就是为什么连接参数对功耗影响如此巨大——它不改变峰值电流,改变的是设备醒来的频率和占空比。

这个模型能帮你判断产品电池寿命能否达标。比如 250mAh 的纽扣电池,平均电流 25uA,理论寿命约 10000 小时,也就是 400 多天。注意这是理想情况,没算电池自放电、天线匹配损失、温漂,预留 80% 容量系数以后可能只剩下 300 天。所以功耗目标最好在前端设计时就倒推出来,而不是等整机做完了再慢慢调。

4.2 软件侧降功耗:广播间隔、连接参数与睡眠策略

先看广播阶段。广播间隔越大、单次广播时间越短,平均电流越低,但手机发现设备的时间会变长。我的建议是区分场景:产品处于待连接状态时用大间隔广播,比如 300ms 到 1s;如果用户正在触发配对,可以临时切换成 20ms 到 30ms 的快速广播,等连接成功后恢复。广播类型上,不可连接的广播比可连接广播更省电,因为设备不需要在广播后开接收窗口等待扫描请求。能发非定向广播就不要开扫描响应,能发单通道就尽量缩短广播负载。

连接阶段的核心参数是连接间隔、从机延迟和监督超时。从机延迟允许设备跳过若干个连接事件,是低功耗设备最重要的省电开关。但这里有个权衡:从机延迟设得太大,主机下发数据时设备不能及时响应,实时性会变差。比如键盘类 HID 设备,从机延迟设成 4 到 9 个事件,既能保证按键时及时唤醒上报,又能把监听占空比降下来。监督超时一定要大于“连接间隔×(1+从机延迟)×2”,否则容易触发链路超时断开。

发射功率方面,很多场景根本不需要 0dBm。蓝牙键盘距离主机通常不到 1 米,把发射功率降到 -20dBm 甚至 -40dBm,射频峰值电流能省下一截。近距离产品我很建议做这个调整,功耗更低,辐射测试也更好过。低功耗模式下还要记得关闭没用的外设时钟和 DMA,尤其是调试用的 UART,进入睡眠前要关掉,否则外设时钟漏电能吃掉不少睡眠电流。

4.3 硬件侧降功耗:漏电路径、负载开关与测量电阻

硬件侧的低功耗,一半是“消除路径”,一半是“控制唤醒”。先说路径:芯片的每个 GPIO 在睡眠时都可能成为漏电通路。悬空的输入引脚会通过内部寄生二极管漏电,最好在软件里配置成输出低或外部接高阻下拉。按键、电池检测、传感器引脚都需要在上拉或下拉电阻的选择上动脑筋,内部上拉电阻通常几十 kΩ,常关状态会持续耗电,睡眠期间能用内部下拉就用内部,非得外部上拉时电阻选 100kΩ 到 1MΩ 之间。

传感器的供电控制是另一个重点。比如温湿度产品里的传感器在待机时也有几百 nA 到几 uA 的电流,完全超标。正确做法是用一颗 GPIO 控制负载开关,或者直接用 GPIO 给传感器供电。平时 GPIO 输出低电平,传感器彻底断电;需要采集时拉高供电,等传感器稳定后开始 I2C 读取,读完成后再立刻断电。这套策略在低功耗传感器产品里几乎是标配。

还要提一个容易被忽略的细节:测量电阻。我建议在电池到系统 VDD 之间预留一个 10 欧姆左右的采样电阻和测试点,平时用 0 欧短接,做功耗测试时焊掉 0 欧,在测试点间跨接电流探头。如果你要测睡眠电流和射频 burst 的波形,示波器加电流探头最直观;如果要测平均电流和电池寿命,串联万用表或者专用的低功耗测量仪更合适。不要用普通万用表测射频工作时的电流,那读数会漂到让你怀疑人生。

5. 实测与调参:把“看不见的微安”抓出来

能写出低功耗代码的人不少,能把功耗测准的人不太多。实测过程中的测量误差、调试干扰、环境差异,往往比软件配置消耗掉更多时间。

5.1 正确测量电流的方法与工具

测低功耗电流有三个层次的需求:看平均电流、看峰值电流、看某个事件的时间占比。平均电流直接用六位半万用表串进供电回路,积分一段时间读数。但万用表采样率不够,射频脉冲下的瞬态电流会被平均掉一部分,这时需要用示波器加电流探头看实际波形。你会在示波器上看到典型的“尖峰+尾巴”:射频发射时电流跳到几毫安,事件结束后迅速回落到 uA 级。这个回落过程如果变得很慢,说明芯片没有正确进入睡眠模式,或者有外设在缓慢放电。

如果有条件,用专用的功耗分析工具,比如 Nordic PPK、Joulescope 这类设备,能直接看到电流波形并积分计算出总电荷。没有专用工具时也能凑合:用一个已知容量的电容给系统供电,记录电压下降时间和电容容量,反过来推算平均电流。这个方法精度有限,但在没有专业设备时能帮你判断功耗量级是否合理。

5.2 调试器与串口打印的低功耗开销

这里有个经常让新人崩溃的场景:软件明明配了睡眠模式,实测电流却高得不正常。最常见的原因是调试器还连着。SWD 调试接口在芯片睡眠时仍会维持调试时钟,芯片根本无法真正进入深度睡眠。所以做功耗基线测试时,第一件事就是拔掉调试器,改成脱机运行加日志输出的方式。

串口打印也是不可忽略的电老虎。一个 115200 波特率的 UART,每打印一行字符至少占用几毫秒的唤醒时间。低功耗产品里我不是不建议打印,而是建议有条件地打印:通过一个调试宏控制,正式版本编译时把日志关掉;或者把日志丢进 RAM 缓冲区,需要时一次性通过蓝牙发出去。睡眠前记得把 UART 引脚配置成确定电平,避免 TX 引脚悬空导致额外漏电。

5.3 “功耗不过关”的排查顺序

产品功耗超标时,我一般按这个顺序查:第一步,把整板上能拆的外设全部拆掉,只剩 MCU 最小系统,量睡眠电流。如果 MCU 本身睡眠电流正常,说明漏电在外设;如果 MCU 睡眠电流就不正常,查晶振是否停振、GPIO 是否悬空、看门狗是否还在跑。第二步,把外设逐个焊回,每焊一个就重新量一次,定位到具体器件。第三步,确认基础睡眠电流没有问题后,打开广播和连接,观察电流波形是否符合事件占空比。最后再检查唤醒源,是否有传感器中断、GPIO 抖动在频繁唤醒芯片。

还要注意环境干扰的问题。有一次我反复测到一个规律:白天电流比晚上高 10uA,查了半天发现是实验室日光灯的 2.4GHz 频段干扰导致接收机持续开启。测试时如果发现电流异常,先换个环境或者屏蔽箱再确认一次,能省掉很多无谓的排查。

6. 量产前的几个硬指标:天线一致性、固件升级与产测

从原型到量产,还差最后一步。这一步看起来不如原理设计精彩,但决定产品能不能稳定交付。

6.1 射频一致性与晶振批次

同型号、同 Layout 的 PCBA,换了不同批次晶振或天线物料,射频表现会明显不一样。批量生产前,建议在产测端加射频测试项,至少测发射功率和接收灵敏度。没有昂贵的蓝牙综测仪,也可以用多个手机通过 nRF Connect 看信号强度,虽然精度有限,但能抓出明显的不良品。关键是 PCB 天线的一致性:天线区域附近的外壳开窗、螺丝孔、金属支架都会影响谐振,结构模具确认后要做首件射频抽检,不能直接拿开发板的调试结果当量产标准。

6.2 OTA 升级与连接鲁棒性

低功耗设备经常把连接断开得很“干脆”,这给 OTA 升级带来一个麻烦:如果固件下发过程中断开,设备可能进入不可用状态。我的做法是升级前先切换到一个较高的发射功率和较短的连接间隔,把链路余量拉起来;固件分段缓存到内部 Flash,收完整包做校验后再切换应用区;升级失败时保留旧固件,下次重新触发下载。这个策略对电池设备尤其重要,因为你不能要求用户给键盘插着充电线做升级。

6.3 我在量产项目里养成的习惯

最后分享一个自己的习惯:每次画完板子,在 BOM 里给所有低功耗关键器件备注好静态电流或睡眠电流规格,比如 LDO 的 Iq、传感器待机电流、晶振的 ESR。采购换料时,负责器件的人只要看到这个备注,就知道这颗料会影响功耗指标,不能随便换同封装替代料。这个习惯救过我两次,一次是 LDO 被换了高静态电流的方案,一次是按键上拉电阻被换成了 4.7kΩ,两个问题都会让整机功耗翻倍。CH592 的集成方案本身已经很成熟,但真正决定产品成败的,往往还是这些不起眼的细节。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询