聊工业低功耗MCU选型,大多数人脑子里蹦出来的还是ST那一串L系列,或者是GD32L233这类跟着做的国产型号。但最近一年我陆续在几个传感器终端和协议转换器项目里用了沁恒的CH32L103,发现这颗RISC-V内核的工业MCU,在低功耗和外设集成度上其实卡位非常准。它不是那种追求极限续航的血糖仪芯片,也不是外设多到用不过来的大而全平台,而是把工业现场最常用的几类外设——多路UART、CAN、ADC、运放、比较器——和真正可用的低功耗模式放在了一起。这篇文章我想从选型视角把CH32L103拆开聊聊:它适合什么场景,低功耗到底该怎么配,外设怎么用才不会开局就踩坑。
1. 工业选型第一步:先搞清楚CH32L103到底为谁而生
在评估一颗芯片好不好用之前,先要搞清楚它为什么存在。CH32L103是沁恒在青稞RISC-V内核基础上做的工业级低功耗MCU,定位非常明确:给那些需要长时间运行、电池供电或有限功耗预算、同时又需要多路工业通信接口的设备用的。它和纯粹的极低功耗MCU不同,也和应用处理器式的通用MCU不同,它的取舍逻辑是"工业现场够用"。
1.1 工业设备选型时最容易被忽略的三个共性问题
第一是电源电压范围。工业现场很少有一颗干净的3.3V,很多时候是电池直接供电、12V/24V经过DCDC降压,或者干脆用LDO从5V拉下来。如果芯片工作电压只有2.0V到3.6V,那么供电设计就要多花心思。CH32L103的工作电压范围覆盖1.8V到3.6V左右,1.8V这一端特别重要,因为不少传感器终端是两节碱性电池串联或单节锂亚电池供电,放电末端电压正好掉到2V上下,芯片必须还能稳定跑起来。很多评估人员只看了3.3V条件下的性能,忽略了低压端的运行能力,等到整机测试时才发现低压重启、ADC采集漂移,那才叫难受。
第二是温度范围和长期供货。工业现场不单是-40℃到85℃的环境温度问题,还有湿度、振动、电源波动、电磁干扰这些因素。芯片本身能达到工业级温度范围只是门槛,真正需要关注的是这颗芯片的批量供货稳定性和生命周期。选型时要问的问题是:这个型号会不会过两年就停产?同系列是否有pin-to-pin的可替换型号?沁恒的CH32系列在国产MCU里生命周期管理算做得比较实在的,但我的建议仍然是,在任何项目中都要把替代方案写在选型评审表里,哪怕只是留一个评估位。
第三是通信接口的匹配。工业设备最常出现的通信接口是UART、CAN、RS485(通过UART加收发器)、SPI和I2C。CH32L103在这块做得非常有针对性:多路UART支持基本的流控和DMA,CAN满足工业总线的需求,SPI/I2C可以用来接外部传感器、Flash或显示驱动。如果你做的产品只需要一种通信接口,那这颗芯片可能过剩;但如果你要做的是一台既要和PLC走Modbus、又要和传感器走I2C、还要留一个CAN口做备用的设备,那它的外设组合就是刚刚好。
1.2 从内核到外设:理解这颗芯片的资源约束
CH32L103的内核是青稞RISC-V,属于WCH自研的RISC-V内核系列,配合自研的固件库,上手难度其实不算高。对于从ARM Cortex-M转过来的工程师,最大的门槛不是写代码,而是习惯RISC-V的调试方式和中断向量写法的差异。
资源方面,CH32L103算是中等偏入门的配置:主频在48MHz左右,Flash和RAM在同类低功耗芯片里属于够用级别,能跑协议栈和简单的应用逻辑,但别指望它去跑复杂的嵌入式系统或者重型GUI。最适合它的应用形态,是裸机配合定时调度,或者跑一个轻量级RTOS。我自己的经验是,像Modbus RTU主从站、CANOpen从站、传感器数据采集与上报这类任务,它的资源余量很充足;但如果要做复杂的数据加解密、浮点密集型信号处理,就需要认真评估了。
外设矩阵是CH32L103最值得展开的部分。它集成了12位ADC、DAC、运放、比较器、多路UART、SPI、I2C、CAN、USB和丰富的定时器。这个组合在工业测量和控制场景里的价值非常大。举个例子:温度变送器需要ADC采集铂电阻信号,运放做微弱信号放大,比较器可以做超限报警,UART或CAN负责与上位机通信,一个芯片全部搞定。如果用传统的超低功耗MCU方案,运放和比较器通常需要外扩,BOM成本和PCB面积都会增加。所以CH32L103的选型逻辑,不完全是"功耗最低",而是"在同一功耗水平下,外围电路最精简"。
1.3 和ST/GD那类低功耗MCU相比,差异点在哪
很多人会拿CH32L103和STM32L0、GD32L233做对比。我的结论是:这三类芯片确实属于同一级别的低功耗产品,但在选型时不能只看功耗数字。
STM32L0的优势在于生态和参考设计极多,几乎你能想到的每一种低功耗应用都有现成的例程。但它的外设集成度相对保守,运放、比较器这类模拟外设不是标配,需要外部搭建。GD32L233延续了GD系列的高主频和丰富外设,但如果你需要的恰恰是CAN和运放这种特定组合,优势就不明显了。CH32L103的独特性在于它的外设组合是专门为工业信号链设计的——ADC、运放、比较器、DAC齐全,CAN和UART都有,而且官方提供WCH-Link调试工具和集成开发环境,从下载到调试的链路是闭环的。对工业设备研发团队来说,这意味着评估周期可以压得很短。
这里顺便说一句,任何关于功耗和性能的对比,最后都要落到你自己的应用场景里实测。数据手册上的数字是芯片在特定条件下的结果,不是你的整机功耗。这一点我在后面章节会展开。
2. 低功耗不是一颗芯片的事:模式、时钟与外设的整体设计
低功耗设计是一个系统工程。我见过不少工程师,芯片选得很省电,但因为外围电路或者GPIO配置不合理,整机待机电流比芯片数据手册的待机电流大了两三个数量级。CH32L103提供了不错的低功耗硬件基础,但能不能把省电优势真正发挥出来,取决于你对功耗模式的理解深度和对底层细节的把控。
2.1 睡眠、停止、待机:三种模式的工程理解
CH32L103的低功耗模式大致可以分成睡眠、停止、待机几个层级,它们的功耗依次降低,但唤醒方式和唤醒延迟也各不相同。工程上最常见的选择是停止模式和待机模式组合使用:正常工作时跑高频时钟,空闲时进入停止模式,通过定时器、外部中断或者RTC唤醒。
很多人会把"停止模式"理解成"CPU停止即可",实际上停止模式要做的功课比睡眠模式多得多。进入停止模式之前,你需要明确哪些外设还需要继续工作,哪些时钟域要关闭,哪些GPIO要保持什么电平。比如你希望在停止模式下RTC继续计时、CAN保持唤醒侦测功能,那么对应的时钟和中断配置就必须提前设好。数据手册里对每个模式支持哪些唤醒源、哪些外设可以继续运行,会有非常明确的表格,选型评估时把这张表打印出来对着你的功能需求逐项打勾,比反复读文字描述高效得多。
待机模式通常是终极省电选项,唤醒后程序会重新执行初始化。这种模式适合那些平时完全休眠、定时或外部事件触发才工作的设备,比如无线传感器节点:平时待机电流只有微安级,定时器到点唤醒,采集数据,无线发送,再睡回去。这里的关键是"唤醒后的启动时间"。如果你的产品对第一次数据上报有时延要求,那么从唤醒到系统稳定运行的时间就要实测,而不是想当然。
2.2 时钟树与外设时钟门控:漏掉这个细节功耗直接翻倍
低功耗设计中最容易被忽视的就是时钟树和外设时钟门控。MCU的功耗大致由三部分组成:CPU动态功耗、外设时钟功耗、以及各类模拟模块和IO的静态功耗。CPU动态功耗可以通过低功耗模式大幅降低,但外设时钟这一块,很多工程师根本没意识到底层外设即使不用,只要时钟还开着,电流就一直在走。
在CH32L103上,你进入低功耗模式后,如果某个UART或者ADC的外设时钟没有关闭,电流就会明显高于预期。正确的做法是建立一张外设时钟开关清单,把每一个外设的启动条件和关闭条件都写清楚。比如在初始化时默认关闭所有外设时钟,只打开必要的UART和GPIO,进入睡眠前统一关闭不用的外设时钟,唤醒后再按需打开。这看起来是几行代码的事,但在整机功耗优化时往往是优化空间最大的一步。
另外一个容易被忽略的点是GPIO的输入/输出状态。MCU的GPIO在悬空状态下,输入缓冲器会产生额外的漏电流。正确做法是,低功耗模式下所有不使用的GPIO要么配置为输入并启用内部上拉/下拉,将其钳制到确定电平,要么配置为输出低电平或输出高电平。注意,如果GPIO连接的是外部传感器或分压电阻网络,你在关掉外设供电之前不能随意改变GPIO状态,否则可能造成反向电流。这一块需要结合你的原理图逐脚检查。
2.3 外围电路的漏电流:LDO、分压电阻和传感器供电的坑
芯片本身的功耗再低,如果外围电路一直在漏电,整机功耗照样难看。我在实际项目中遇到过几次"芯片待机1微安,整机待机50微安"的情况,最后定位到的问题都很基础:板上的LDO静态功耗太高、传感器分压电阻一直在耗电、或者LED限流电阻忘记断开。
CH32L103的工作电压范围比较宽,如果你的系统供电是电池,尽量选用静态电流足够低的LDO,并在软件里规划一个"电源管理"动作:不是所有模块都需要一直供电的,传感器、RS485收发器、显示驱动这类外设在休眠时最好直接切断电源或关闭使能脚。RS485收发器特别明显,很多收发器在接收态有毫安级电流,比MCU自己高几个数量级。
分压电阻网络也是低功耗板子的常见漏电流来源。比如你为了检测电池电压,用两个100K电阻分压接到ADC引脚,这一路在休眠时可能一直耗电。在远程监控节点上我曾经用一个10M+1M的分压网络来降低静态电流,同时配合ADC的采样时间加长来保证读数稳定,这个方法在CH32L103上完全可行,关键是要把ADC采样时间配置充分,否则阻抗太高读数会明显偏小。
2.4 功耗实测:怎样测出可信的数据
选型报告里的功耗数字必须是自己实测出来的。我的方法是准备一个高精度的电流测量工具,先测整板最小系统(只保留MCU和必要的电源部分)的待机电流,再逐步打开外设,逐项记录电流变化量。这样可以清楚看到每一部分功耗的来源,定位到底是谁拖了后腿。
用万用表测待机电流是可行的,但要注意量程切换的问题:MCU正常工作时电流可能几十毫安,待机时只有几微安,万用表在毫安档测微安电流分辨率不够,在微安档测正常工作电流又会超出量程。实际操作中我会用串联采样电阻配合示波器测量,或者给系统做一个简单的功耗测试板,板上预留电流采样点,这样从睡眠到唤醒的整个电流波形都能观察清楚。CH32L103的唤醒过程电流曲线能直观反映启动时间,这个数据在估算电池寿命时比数据手册上的数字更可靠。
另外一个细节是测量温度。低功耗芯片的待机电流和环境温度关系很大,25摄氏度测出来的数字和60摄氏度环境下的数字可能差不少。做工业产品的选型报告,至少要在常温、高温、低温三个温度点各测一轮,才能对电池寿命有正确估计。
3. 外设配置实战:从Modbus到CAN再到ADC的逐个拆解
低功耗是选型的重要维度,但真正决定一颗芯片好不好用的,是外设配置的顺手程度。我在CH32L103上调过几类最常见的外设,这里逐个讲一下配置思路和踩过的坑。
3.1 UART+DMA:撑起Modbus协议栈的关键
工业设备里最常用的一定是UART,尤其是Modbus RTU。很多人把UART配置当作最简单的事,但Modbus对收发时序有严格要求,尤其是RTU模式的帧间间隔必须在3.5个字符时间以上,这就要求收发的控制必须精准。
CH32L103的UART外设,在配置时要注意几个细节:数据位、停止位、校验位这些基础项不必说,关键是接收和发送要走DMA。Modbus主从站在收发一帧数据时,如果每收一个字节都进一次中断,CPU负担重,还容易因为中断响应不及时导致帧超时判断不准确。用DMA把接收数据搬到内存缓冲,配合空闲中断判断一帧结束,是Modbus从站的标准做法。我在项目中就是这样处理的:DMA接收环形缓冲,定时器辅助超时判断,帧解析放在主循环里跑,这样即使在低主频下也能稳定跑115200波特率。
这里有个实际的坑:CH32L103这类RISC-V MCU的中断向量和ARM不完全一样,DMA中断、串口空闲中断的优先级分组配置需要花点时间熟悉。我建议拿到芯片后第一个例程就写一个"UART回环+DMA传输"的测试,把工具链、中断机制、串口驱动一次调通,后面所有基于串口的协议调试都会顺很多。
3.2 CAN口做工业总线从站:采样点、波特率和终端电阻
CAN在工业设备里用得非常多,CH32L103自带CAN控制器,配合一个CAN收发器芯片就能搭出总线节点。配置CAN时的几个关键参数是波特率、采样点和同步跳转宽度。很多人只设置波特率,不关注采样点,结果通信丢帧率偏高,还以为是芯片抗干扰不行。
标准做法是把CAN的位时间划分成同步段、传播段、相位缓冲段,采样点配置在大约75%到85%的位置,这样对总线上的信号延迟和时钟偏差容错更好。波特率越高,对采样点越敏感,500K和1M波特率下同样一组参数的表现可能差很多。工业项目中我习惯先在实验室用两台设备对测,故意把线长拉长到接近总线长度上限,看误码率能不能接受,然后再把参数定下来。
终端电阻的问题也要提前设计好。高速CAN要求在总线两端各接一个120欧电阻,低速容错CAN对终端的要求又不一样。如果你做的是从站设备,终端电阻一般是拨码开关或跳线选择,不能焊死,否则两个都开或都不开都会出问题。这些是硬件设计阶段就要定的,软件层只是锦上添花。
3.3 多通道ADC采集:校准、滤波与EMC
CH32L103的12位ADC用来做工业模拟量采集是足够的,但要拿到稳定的数据,还需要做几件事:一是参考电压的稳定性检查,二是采样时间的合理配置,三是软件滤波策略。
工业现场常有变频器、电机驱动器这类强干扰源,ADC采集到的数据偶尔会出现尖峰。我通常在采集端加一级RC滤波,参数选型时要注意信号带宽需求,不能为了滤除噪声把有用信号也滤掉。软件上再叠加一个滑动平均或中值滤波,能够有效抑制偶发干扰。在CH32L103上搬运这类滤波算法几乎没有压力,但要注意:滤波会带来响应延迟,在闭环控制场景里要权衡。
多通道采样时的通道切换也是个容易踩的坑。ADC从一个通道切到另一个通道后,采样电容里残留的电荷会导致前几次采样结果不准。解决方案是把每个通道的第一次采样结果丢弃,或者在前一次采样完成后再做一个额外的采样周期,让电容充分充电。这个细节在CH32L103的资料里不一定写得很醒目,但实际效果非常明显。
3.4 运放和比较器:电流检测、过压保护里的典型用法
CH32L103集成的运放和比较器,在工业信号链里价值很大。以电机电流检测为例,传统方案是外置采样电阻加独立运放放大,再把信号送到ADC。CH32L103可以直接利用片内运放做差分放大,配合片内ADC采集,节省一颗运放芯片。
比较器的典型用途是快速过压/过流保护。比较器响应速度比ADC快很多,可以把故障信号直接接到MCU的中断引脚,或者干脆通过内部互联触发事件,实现硬件级的快速切断。在设置比较器基准时,可以用片内DAC输出一个精确阈值,这样调节阈值完全由软件控制,不依赖外部电阻精度。
需要提醒的是,片内运放的带宽和噪声指标和独立运放相比仍有差距。如果你做的是精密小信号测量,比如称重传感器或热电偶的毫伏级信号放大,建议先认真看手册里的失调电压、温漂和噪声参数,必要时还是在外部加一颗专用仪表运放。运放集成的主要价值是简化普通信号调理电路,而不是取代所有精密模拟方案。
4. 三类典型工业方案的配置参考
前面讲了原理和参数,这一节我直接给三个真实场景的配置思路,都是我在CH32L103上实际做过的类型,可以作为你自己项目的参考骨架。
4.1 电池供电的无线传感器终端:休眠唤醒循环设计
这类设备的功耗设计核心是"占空比"。一个典型的循环是:系统大部分时间处于停止模式,RTC每N秒唤醒MCU,采集一次数据,通过LoRa或Sub-G无线模块发送,然后再次进入停止模式。CH32L103在这个过程中扮演的角色是"定时采集+协议处理+外设控制"。
在设计这一套循环时,我建议把"进入停止模式"这个动作做成一个统一的函数,包括关闭外设时钟、配置GPIO电平、设置唤醒源、关闭无关中断等步骤。这样经过多次迭代后,这个函数就是经过实测验证的稳定代码,每次有新增电源需求,都回到这个统一入口修改,避免在项目里到处散落低功耗操作。
无线模块的功耗往往比MCU大一个数量级。传感器数据采集完成后,第一件事就是关闭无线模块电源(不只是进入睡眠),然后MCU再进入停止模式。要特别小心无线模块的电源控制GPIO在休眠期间的电平状态,有些模块的使能脚是低电平有效,休眠时如果不小心被拉高,模块会一直处于发射或接收状态,电流瞬间飙升。
4.2 工业协议转换器:Modbus RTU转CAN的桥接方案
协议转换器在工业现场很常见,比如把老旧仪表的Modbus RTU信号转成CAN总线,接入新的控制系统。CH32L103的多路UART和CAN控制器正好适合这个场景:一路UART接RS485收发器跑Modbus,一路CAN接工业总线,MCU在中间做协议转换。
这种应用对代码逻辑的要求是清晰的分层:底层驱动负责收发,中间层做帧解析和状态机,上层做协议映射。CH32L103的资源完全够跑这套逻辑。实际调试中要注意的就是波特率匹配问题:Modbus侧常见的波特率是9600、19200,CAN侧可能是250K或500K,两者速度差很多,一定要用环形缓冲把数据压住,避免高优先级的总线数据丢失。
另一个经验是协议转换器要能记录错误状态。工业现场出问题时,工程师需要快速判断是Modbus侧断了还是CAN侧断了。我在代码里用CH32L103的Flash模拟一个错误日志区,把最近几十次通信错误记录下来,通过预留的调试串口可以查询,这个功能在现场排障时帮了大忙。
4.3 便携式手持仪表:按键唤醒、显示刷新与测量精度
手持仪表类产品对低功耗的要求和无线终端不太一样,它需要的是"随时能用、空闲省电、响应不能太慢"。CH32L103的停止模式在按键唤醒应用里非常合适:平时屏幕关闭,MCU进入停止模式,用户按键时通过外部中断唤醒,几毫秒内完成初始化,刷新屏幕开始测量。
手持仪表的功耗大头往往在显示部分和传感器供电上。如果是OLED屏,刷新频率不要太高,需要持续显示的内容尽量放到静态画面;如果是段码屏,则通常配合专用的LCD驱动芯片,把显示刷新交给驱动芯片处理,MCU只在内容变化时更新显存。传感器供电最好也做成可控的:测量前通电并等待稳定,采样后立即断电,这样能省掉不少静态功耗。
测量精度方面,便携仪表通常用电池供电,电池电压下降会影响ADC参考电压。稳妥的做法是使用内部参考或外部精密基准,而不是直接把电源电压当作基准。CH32L103的ADC参考源配置项在软件库里可以一键切换,但这个决定必须在硬件设计阶段就定好,否则画完板子再改基准源往往牵一发动全身。
5. 选型验证与踩坑记录:哪些参数必须实测
最后分享一些我在实际调试CH32L103时遇到的问题。这一节的内容相比前面的原理章节会更加零散和实战,但对正在做选型评估的团队来说,可能更直接有用。
5.1 RISC-V工具链和调试:从ARM过来最需要适应的点
如果你是第一次用RISC-V内核的MCU,最先要适应的不是芯片本身,而是工具链。CH32L103官方提供的MounRiver Studio是基于Eclipse的IDE,集成了编译、下载、调试功能,配套WCH-Link调试器,整体体验还算顺滑。但和ARM MDK/Keil的环境相比,有几个细节不一样:第一个是工程配置里芯片型号的选择,最好从官方例程模板复制工程而不是自己新建;第二个是链接脚本,Flash和RAM的划分在启动文件里就已经定义好,如果自己改容易出问题;第三个是低功耗调试时的连接稳定性,芯片进入停止模式后调试器可能断连,调试时需要先禁用低功耗模式或者在初始化里加一个延时,等调试器连接成功后再进入低功耗。
还有一个很多新人会踩的坑:RISC-V的软件复位和ARM不一样,不能直接用看门狗复位后的行为来做程序升级或参数恢复逻辑。在我做协议转换器时,就曾经因为默认的软件复位流程和预期不一致,导致设备在异常重启后没有按预定逻辑进入Bootloader。这个问题定位花了两天,最后是通过读复位状态寄存器来区分复位源才解决的。
5.2 "典型值"陷阱:数据手册上的功耗数字只能参考
选型评审时,大家最容易盯着数据手册的"典型值"做对比。我的建议是:典型值只能用来做方向性对比,不能用来计算电池寿命。芯片的待机电流和供电电压、温度、GPIO状态、外设配置、甚至代码里某个未使用的模块是否上电都有关系。同样一颗CH32L103,我见过有的板子待机电流只有几微安,也见过因为某个GPIO悬空导致待机电流多出十微安的板子。
想要拿到有参考价值的数字,一定要用你自己的原理图、你自己的初始化代码、你自己的温度环境去实测。所以选型阶段就应该画最小系统板,或者直接借用官方评估板把关键外设触发起来做测量。你花在评估板上的时间,会在后面的整机调试里数倍赚回来。
5.3 一个可以直接用的选型验证清单
最后分享一张我放在选型评审表里的检查清单,每次评估低功耗工业MCU都按这个顺序过一遍:
- 电压范围:最低工作电压是否覆盖电池放电末端电压
- 温度范围:芯片工作温度、存储温度是否覆盖产品目标环境
- 低功耗模式:列出的每种模式是否有对应的唤醒源和唤醒时间数据
- 外设匹配:把产品的所有通信接口和模拟接口列出来,逐一核对芯片外设是否满足,特别注意运放、比较器、DAC这类模拟外设是否存在
- 功耗实测:待机电流、运行电流、唤醒时间三个指标至少在常温下实测一轮
- 工具链闭环:下载器、IDE、烧录算法是否可以直接上手,团队里是否有人熟悉该工具链
- 长期供货:原厂是否有长期供货承诺,是否有第二货源或兼容型号
- 成本核算:芯片单价、外围器件节省带来的BOM变化、开发时间成本,三者合并后对比竞品方案
这张清单看起来很简单,但真能逐项填完的项目并不多。很多时候选型失败不是因为芯片不行,而是因为选型阶段少做了一次实测,或者没有把外设匹配清单列全。数据手册每个人都能拿到,但真正拉开差距的是你愿不愿意花一上午把最小系统板焊出来、把每种模式的电流实测一遍。CH32L103给我的整体印象是:该省的功耗它省得下来,该给的外设它也基本都给到了,剩下的就看你的板子把外围电路压不压得住。希望这份从选型到落地的记录,能帮你少走几步我在第一次评估时走过的弯路。