☰
CH592低功耗蓝牙MCU实战:从选型到量产踩坑全解析
2026/10/27 23:28:20 网站建设 项目流程

做低功耗蓝牙设备这一年多,CH592 是我量产过比较顺的一颗蓝牙 MCU。如果你正在选型,或者已经被“低功耗”这三个字折磨到半夜睡不着,这篇内容值得你静下心看完。CH592 是沁恒基于 RISC-V 内核的蓝牙 MCU,核心卖点是把射频收发、BLE 协议栈、电源管理以及应用处理器集成到单芯片里,直接服务蓝牙键盘、遥控器、传感器标签这类电池供电的小设备。这里不跟你念数据手册,而是把我在集成方案选型、硬件设计、低功耗调优、蓝牙业务落地过程中踩过的坑和验证过的做法,一条条拆开讲。

1. 为什么是 CH592:方案选型的几个关键点

1.1 单芯片集成的账要算清楚

早年做低功耗蓝牙,最常规的路线是“MCU + 蓝牙模块”。比如 STM32 挂 HC05 这类串口透传模块,或者外挂一颗 BLE 从机芯片,MCU 跑应用逻辑,模块跑协议栈,两边用 UART 通信。这种方式开发上手快,但有两个很现实的问题:第一是物料成本压不下来,模块本身不便宜,PCB 面积还大;第二是串口透传把 BLE 的很多控制权屏蔽掉了,你想动态调整广播间隔、连接参数、唤醒策略,链路层细节都被模块厂家封装死了,只能发 AT 指令碰运气。

换成 CH592 这类单芯片方案之后,逻辑就完全不一样了。射频前端、协议栈、Flash、RAM 都在一颗芯片里,外围只需要晶振、天线、去耦电容和按键这些常规器件。BOM 数量肉眼可见地减少,PCB 也清爽很多。更重要的是,原来你在模块上实现不了的事情,现在可以直接在 SDK 里改 GATT 服务、改广播报文、改连接参数。举个例子,做蓝牙键盘的时候,我想让设备在未连接状态用高频广播方便用户搜到,连接成功之后立刻切到低频广播加从机延迟,这种动态策略在外挂模块方案里很难做,在 CH592 的代码里就是改几个结构体字段的事。

从旧芯片迁移的角度说一句,很多人会拿 CH579 和 CH592 对比。CH579 是早期比较经典的 Cortex-M0 蓝牙方案,主打低功耗 BLE,我手上也有用 CH579 跑 TMOS 的实战经验,整体确实稳定。但芯片换代是有理由的:CH592 换成了 RISC-V 内核,BLE 协议栈版本更新,Flash 和 RAM 资源更充裕,低功耗寄存器配置也做了优化。如果你是完全新开的项目,没必要守着一颗老芯片不放;但如果你的产品已经在 CH579 上量产且代码量很大,迁移前一定要评估外设寄存器和中断向量差异,别把“换芯片”想成“改型号”那么轻松。

1.2 BLE 协议栈和 RISC-V 内核的取舍

选芯片这件事,最容易踩的坑是只盯主频和 Flash 大小。蓝牙 MCU 的核心竞争力从来不是 CPU 算得有多快,而是协议栈稳不稳、RAM 占用可不可控、低功耗状态下能不能按时醒来处理射频事件。CH592 的 RISC-V 内核运算能力应对 HID、传感器采集、简单 mesh 节点这些场景完全够用,我更看重的是官方 SDK 里协议栈的源码开放程度以及例程完成度。协议栈一旦出问题,如果只给你一个黑盒库,连排查的入口都没有;源码在手,至少能用调试器一步步看是卡在广播状态机还是 GATT 回调里。

还有一点很现实:BLE 协议栈本身就是一块不小的固件,HID、Mesh 这类 Profile 更是吃 RAM 和 Flash。选型的时候不能只看“这颗芯片能跑 BLE”,要具体到你要跑哪些业务。比如一个单纯广播温度数据的传感器,和一个支持 HID 键盘加 OTA 升级的产品,对存储资源的要求差出好几个量级。我习惯的做法是:先把官方例程里最接近自己业务场景的 demo 编译一遍,看编译报告里的 RAM/Flash 占用,再反向决定选什么型号。别看主频,看资源余量,这个顺序才靠谱。

最近总有人问我,蓝牙 6.0 的新特性要不要等。我的态度是:对大多数电池供电的小设备,BLE 5.x 已经覆盖了 99% 的需求,蓝牙 6.0 带来的新功能听上去很香,但你的产品如果连 HID 重连稳定性都没做好,追新版本没有意义。方案选型的本质是用成熟度换确定性,而不是追着版本号跑。

2. 硬件设计里的低功耗细节

2.1 电源拓扑:从锂电池到 MCU 的每一毫安

低功耗设计一半的功夫在硬件,而硬件里最容易出问题的就是电源。CH592 这类蓝牙 SoC 有个共同特征:发射瞬间电流会突然拉高。如果你用 CR2032 纽扣电池,电池内阻本来就大,瞬间抽电流会导致电压跌落,轻则射频发射功率下降、丢包,重则 MCU 直接复位。

我量产过的产品里,凡是纽扣电池供电的,都在电池输入端预留了大容量储能电容。芯片发射持续时间很短,靠电容里存的电荷就能顶过去。具体容值要看你的发射功率和电池内阻,我习惯从 100uF 起步,实测电压跌落曲线后再调整。这个电容离芯片电源引脚越近越好,别为了布线方便放得很远,否则寄生电感会把储能效果吃掉一截。

电源路径的拓扑也有讲究。LDO 的好处是纹波小,给射频前端供电很干净,但效率低;DCDC 效率高,但开关纹波可能干扰 2.4G 接收灵敏度。我常用的折中方案是:电池先过 DCDC 降到 3.0V 左右,再串一级 LDO 给射频和核心供电。DCDC 的高效率用来省电,LDO 的干净输出用来保射频指标,代价是多两个器件,但整体表现稳定得多。

进阶一点的省电玩法,是用 MCU 动态控制 DCDC 输出电压。思路不难:DCDC 反馈引脚通常接电阻分压到地,MCU 用 PWM、DAC、I2C 数字电位器去微调反馈基准,就能在浅睡眠时把输出电压调低一点,在射频发射前再把电压抬回来。这个操作省下的电流有限,但对压榨最后一两百微安的项目有意义。需要特别提醒的是,反馈环路改动之后一定要做负载瞬态测试,我见过有人把反馈响应调得太慢,发射瞬间电压跌到复位阈值,问题非常隐蔽。

2.2 天线、晶振、IO 配置的实操要点

2.4G PCB 天线的“接地”问题,几乎每个新手都会栽一次。很多人看到参考设计里天线周围全是过孔,就以为天线下面也要铺满铜,结果做出来的板子距离只有两三米。原理其实不复杂:天线需要参考地平面来形成完整的辐射结构,所以天线馈线周围要打密集的接地过孔,把地平面连起来;但天线本身的辐射区域必须净空,不能铺铜,否则铜箔会吸收辐射能量、改变谐振频率。打个比方,天线像喇叭,地平面是音响的箱体,箱体要扎实,但喇叭口不能堵住。

晶振是另一个容易被忽略的低功耗元凶。高速晶振的负载电容如果不匹配,频率偏移几十 ppm,带来的后果是蓝牙连接建立困难、连上后时不时断线,而且这种问题用万用表测不出来。低速 32.768K 晶振直接影响睡眠时的定时精度,如果起振不稳,低功耗唤醒时间点会漂,进而导致错过 BLE 连接事件。我在原理图评审时必看两样东西:高速晶振的负载电容按手册选,低速晶振两端并联的电容别省。

GPIO 配置在低功耗项目里经常被小看。睡眠状态下,一个浮空输入的引脚可能因为外部噪声反复触发中断,也可能通过内部保护二极管产生漏电。更实际的问题是接了上下拉电阻的引脚:3.3V 供电下,一颗 10K 下拉电阻就会产生 0.33mA 的电流,对动辄要求几微安的睡眠电流来说简直是灾难。我踩过的坑是某次测睡眠电流,怎么调都有 1mA 左右,最后发现是一排按键扫描 IO 的外部下拉电阻没断开。硬件设计时每个 GPIO 的默认状态都要过一遍,睡眠时要么拉到确定电平,要么切到模拟输入。

顺便说一句施密特触发器输入。蓝牙设备周围都是按键、唤醒引脚这类上升沿缓慢的信号,直接用普通输入很容易因为抖动误触发。CH592 的 GPIO 基本都支持施密特触发,开启之后对慢边沿信号有迟滞效果,能省掉一批外部去抖电容,硬件上更简洁,软件上也少了很多消抖逻辑。这也是一个低成本高收益的设计细节。

3. 低功耗软件设计要点:把电流一点一点抠下来

3.1 睡眠模型:从 Sleep 到 Shutdown 怎么选

低功耗软件设计的核心思想只有一句话:没有事件要处理的时候,尽快睡过去,睡到不能再睡为止。CH592 这类芯片通常会有不同深度的睡眠模式,从只关 CPU 时钟的 Idle,到关掉大部分外设时钟的 Sleep,再到几乎全部断电、只能靠特定唤醒源的 Shutdown。选哪种模式,取决于你要不要维护 BLE 连接,以及在唤醒后能不能接受重新初始化的时间。

如果设备只是广播自己,不建立连接,那广播之间的空档完全可以睡到最深的模式,反正醒来后重新初始化、发了广播再睡回去就行。但如果设备处于连接状态,事情就没那么简单了。BLE 连接的本质是主从双方约定好每隔一个连接事件交换一次数据,从机必须在这个时间点之前醒来,把射频准备好,否则主机等不到响应,连续超时之后就会认为链路断了。所以连接状态下的低功耗不是“能睡多深睡多深”,而是“在连接事件之间精准地睡、准时地醒”。

这里就体现出官方 SDK 里那套低功耗蓝牙框架的价值了。用过 CH57x 的人应该对 TMOS 不陌生,它本质上是一种基于定时任务调度的机制:协议栈把所有需要周期性处理的事件放到任务队列里,没事的时候 MCU 进入低功耗,定时器到点再唤醒 MCU 处理下一个任务。CH592 的 SDK 沿用了类似思路,你要做的就是相信这套调度,自己写业务代码时不要去阻塞它。我见过不少低功耗调试现场,应用层写了个delay(500),MCU 倒是睡得挺香,但 BLE 连接早断了,问题还不容易定位。

实际调广播功耗时,你可以快速感受到参数的影响。举个例子,如果设备以 100ms 间隔持续广播,平均电流会明显偏高;把广播间隔拉长到 1s,平均电流可能降到原来的三分之一以下。所以那些不需要快速被发现的产品,比如传感器标签,广播间隔能拉多长就拉多长,同时把广播数据精简到最短,这是成本最低的省电手段。

3.2 外设时钟、GPIO 和唤醒源的常见坑

睡眠模式下,外设时钟还开着就是白耗电。ADC、SPI、UART、定时器,这些模块只要时钟没关,即使不干活也有静态功耗。代码里要从上到下过一遍,把用不到的外设时钟在进睡前全关掉。最隐蔽的是 DMA 和调试接口,调试器一插上去,功耗数据立刻失真。我早期做低功耗测量时,连着调试器测睡眠电流,怎么测都是 50uA 左右,拔掉调试器再看,直接掉到 2uA。这个教训赔进去一整个下午。

唤醒源的设计也很有讲究。按键唤醒要用 GPIO 外部中断,不要用轮询;有 RTC 需求的设备,32.768K 晶振必须跑起来,让系统能定时唤醒;BLE 本身的连接事件也是一种唤醒源。关键原则是唤醒中断处理函数里不要做耗时操作——按个键只是置一个标志位,真正的事情放到主循环里做。如果你在中断里初始化 I2C、写 Flash,万一这个时间正好落在连接事件前面,链路就危险了。

另外要警惕 Wakeup 之后的外设状态。芯片从深度睡眠恢复时,内部寄存器可能已经丢了,必须重新配置时钟树、GPIO 复用、射频相关寄存器。常见故障是设备唤醒后广播数据发不出去,就是因为射频初始化被漏掉了。这个问题可以这样验证:进入低功耗前和唤醒后各打印一次关键寄存器状态,对比差异,很快就能定位。

4. 蓝牙业务功能集成:HID、Mesh 与连接参数

4.1 HID 设备实现:从普通键鼠到自定义键盘

CH592 最常见的应用场景就是蓝牙 HID 设备,键盘、鼠标、遥控器、自拍器,都属于这一类。HID over GATT 说简单也简单,本质上是把传统的 USB HID 报告搬到 BLE 的 GATT 服务上,核心包括 HID Service、报告描述符、输入报告和输出报告这几个部分。报告描述符写得好不好,直接决定设备能被系统识别成什么。我见过有人从网上抄了个不完整的描述符,键盘连上后只能输出字母,功能键和组合键全部失灵,就是这个原因。

从低功耗角度看,HID 设备最值得优化的地方是按键扫描策略。老式写法是主循环里不停轮询 GPIO,功耗自然降不下来。正确做法是把按键矩阵的行列引脚配置成中断唤醒,平时 MCU 睡死,有按键按下才醒来扫描,扫描完上报一次 HID 报告,再睡回去。一颗 CR2032 电池撑半年到一年,靠的就是这种“无事发生就不工作”的思路。

蓝牙键盘还有一个经典问题:首次配对之后,如果用户把设备删了,重新搜索时经常搜不到。这种情况往往不是广播没开,而是系统端把配对信息删除了,但设备端还认为自己是“已绑定状态”,拒绝重新广播或进入可配对模式。解决办法是在设备端记录一个绑定标志,检测到连接失败或收到特定命令时主动清除绑定信息,让设备回到可配对状态。这也是 HID 键盘方案里必测的回归项。

4.2 BLE Mesh 和经典蓝牙并存时的取舍

Mesh 是智能家居场景绕不开的话题。BLE Mesh 的节点需要维护消息队列、中继缓存、好友表,对 RAM 和 Flash 的要求比普通 BLE 从机高出一大截。CH592 这类芯片跑一个基础 Mesh 节点是没问题的,但如果你想让它同时当 HID 键盘又当中继节点,就要小心资源不够用。低功耗传感器节点在 Mesh 里一般用 Low Power Node 模式,平时不监听 Mesh 消息,只在特定的好友窗口醒来收发,这样能把平均电流压下来,代价是网络延迟增加。Mesh 的实时性和低功耗天生是矛盾,设计产品时要先想清楚你到底要哪一头。

至于经典蓝牙的 A2DP、SCO 这类音频协议,我要给一个明确建议:别指望用 CH592 去跑。CH592 的定位是 BLE 控制类设备,不是音频 SoC。如果你的产品既要 BLE 控制,又要经典蓝牙播放音乐,通常会再挂一颗音频蓝牙芯片,两颗芯片分工合作。这时候反而要小心 2.4G 共存问题:两套射频同时工作会互相干扰。我见过“手表连着手机控制没问题,一开蓝牙耳机播放就频繁断连”的真实案例,根源就是两颗蓝牙芯片的射频调度没有协调好,A2DP 切到 SCO 时等于是短时间抢占射频资源,把另一路的连接事件挤掉了。这种问题不能靠改应用代码硬扛,而是要在硬件设计阶段规划好天线共用方案和射频优先级。

4.3 连接参数优化:功耗与延迟的平衡

BLE 连接参数是最容易被低估的功耗调节手段。主机和从机建立连接时,会协商连接间隔、从机延迟和超时时间这三组参数。连接间隔越短,数据传输越及时,但 MCU 要醒来的次数越频繁,功耗越高;从机延迟的作用是允许从机连续跳过多个连接事件,让 MCU 多睡一会儿,代价是数据延迟变大。

这里给出我常用的一组对比数据,供你做方案时参考:

连接间隔从机延迟数据响应功耗表现适用场景
30ms0快高实时遥控、空中升级
50ms2较快中一般传感器
100ms4慢低温湿度采集、标签

我实际的调优习惯是,设备刚连上时先用短间隔和零延迟,让主机把状态同步完,等业务稳定之后再请求长间隔加从机延迟。很多 BLE 协议栈支持动态修改连接参数,苹果对连接参数的限制也比较严格,协商不合适会被系统直接拒绝,所以代码里要处理好协商失败的回退逻辑。广播参数同样值得调:未连接时用可连接的广播,连接后立刻切换到不可连接的静默广播,这一下就能省掉不少电流。

5. 实测踩坑记录与排查方法

5.1 蓝牙搜索不到设备:沿着广播链路逐层查

这个问题在蓝牙开发里出现频率极高,排查顺序一定要对。先查软件:广播有没有真正打开,广播类型是不是“可连接”的,有没有开了白名单过滤导致手机被挡在外面。然后用 nRF Connect 这类工具扫一遍,如果工具能扫到但手机扫不到,那问题多半在手机系统缓存或 PC 网卡驱动。Realtek 的 8852AE、8852BE 这类无线网卡,蓝牙驱动版本不对时,会出现设备可见但搜索不到的现象,更新驱动通常能解决。

如果所有设备都扫不到,重点转向硬件。天线下面有没有铜、天线匹配网络是否按参考设计、高速晶振频偏是否过大,这些都是老生常谈的原因。还有一个容易被忽略的点是供电:电池电压不足时,射频前端可能无法进入正常发射状态,广播报文根本没发出去。遇到“初始能扫到,放了一晚上就扫不到”的板子,先量电压,再查晶振起振,这个思路能帮你少走很多弯路。

5.2 连接后频繁断连:从射频到协议栈逐层查

连接建立之后频繁断开,是最难排查的一类问题。我建议按这个层次来:第一步查供电,用示波器看连接瞬间的电源波形,如果有明显掉电,先解决储能电容和电源路径的问题;第二步查天线,反射过大说明匹配有问题,距离稍微远一点就断;第三步抓空中的链路,把协议栈日志打开,看看断开之前是哪个事件超时了。

常见的软件原因有三类:一是睡眠唤醒不及时,MCU 睡着了没赶上连接事件,最后 supervision timeout;二是中断优先级配置不合理,射频中断被其他业务卡住;三是 Flash 擦写在连接事件中间执行,阻塞了协议栈。这些问题有一个通用排查工具——BLE 抓包器配 Wireshark。抓包能直观看到主机什么时候发的空包、从机有没有回复、断连是由谁发起的。我之前遇到过一个“每 30 秒必断一次”的案例,抓包后发现从机在固定时间点没有回复任何包,最后定位到 RTC 闹钟中断里做了一次耗时的 Flash 写入,把射频处理时间挤掉了。这种问题靠代码审查很难发现,抓包一锤定音。

5.3 低功耗电流测量:别被万用表骗了

低功耗电流测量里面门道很多。万用表串联到电源路径里,读数是平均电流,这个数据对估算电池寿命够用,但它只能看到最终结果,看不到瞬态的尖峰。蓝牙设备工作时的电流其实是“一串脉冲”:发射瞬间十几毫安,平时几微安,平均下来看着不高,但万用表的内阻会在脉冲来临时产生压降,严重时让 MCU 在发射瞬间欠压复位。我习惯用精密采样电阻加差分探头接示波器,直接观察完整的电流波形,既能看平均电流,又能看瞬态跌落。

测睡眠电流时,别忘了把所有调试链路摘掉。调试器、串口线、板载 LED、放电电阻,任何一个挂着都会让数据失真。另一个常见问题是环境光和温度对晶振起振的影响,低温下 32.768K 晶振起振变慢,可能导致唤醒时间不确定,进而影响功耗测试结果。建议在恒温环境下测试,并且连续记录 24 小时以上,看有没有周期性异常波动。

最后分享一个我量产验证时的习惯:拿到新板子,先不急着写业务,把官方 BLE 例程烧进去,验证射频性能和基本功耗;确认硬件没问题之后,再一点一点加自己的应用逻辑。低功耗和蓝牙稳定性这两件事,软件能调的比重其实有限,原理图阶段把电源、天线、晶振做扎实,后面会省下大把时间。如果你也在做 CH592 项目,遇到“搜不到”或者“功耗怎么都降不下去”这类情况,按这个顺序排查,基本能让你少熬几宿。

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

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

立即咨询