
做电池供电的设备电源管理从来都不是一件省心的事。我最近给一台便携式数据采集终端做完整供电方案主控选了 TM4C129XKCZAD电源芯片配套了 PCA9422。这套组合搭下来从 USB 充电、锂电池电源路径切换、多路电压轨输出到最后的休眠唤醒几乎把一颗 PMIC 该干的活全干了。这篇文章就把整个方案的选型逻辑、电路设计、寄存器配置和踩坑过程完整记录下来给后面准备做低功耗主控设备的朋友一个可以直接抄的参考。无论你是刚开始接触 PMIC还是已经写过不少裸机固件只要手里有这两个芯片按这套思路走一遍基本能少走一半弯路。1. 选型思路为什么是 PCA9422 TM4C129XKCZAD1.1 先搞清楚整个系统要管几路电做任何电源方案第一步不是选芯片而是把需求写清楚。我这台采集终端的功能大概是这样锂电池供电支持 USB 口充电主控要跑 120MHz带以太网外设有一块小屏幕、两个传感器、一张 SD 卡偶尔还要通过串口跟上位机通信。设备不是长期插电的大部分时间靠电池跑所以待机功耗要压得很低用户不操作时希望整机进入休眠但 RTC 还得继续走按键一按就能立刻唤醒。列完需求之后供电部分大概有这么几块电池电压本身要先管理好充电电路不能少系统主电源 3.3V 要给 MCU、屏幕、传感器SD 卡和部分外设可能需要单独的 1.8V传感器里还有一些模拟前端对纹波敏感。如果全部用分立器件搭LDO 加 DC-DC 再加充电管理芯片至少三四颗料PCB 面积和物料成本都不划算。于是我就把目光放到了集成度更高的 PMIC 上也就是最后的 PCA9422。1.2 PCA9422 解决了什么问题PCA9422 是一颗面向便携设备的单芯片电源管理 IC把充电管理和多路电源输出整合到了一起。它内部集成了锂电池充电器、电源路径管理、两路降压转换器和两路 LDO全部通过 I2C 接口配置。对我来说最实用的几个点一是充电电流和终止电压可以通过寄存器调整不用改硬件就能适配不同容量的电池二是电源路径管理做得好USB 插入时系统直接由适配器供电同时对电池充电拔掉 USB 后无缝切回电池不会出现明显掉电三是每个输出电压都能软件调节量产时如果想微调某路电压改固件就行。这颗芯片还有一个常被忽略的优势静态功耗低。系统进入待机时可以让大部分电源轨关闭只保留 MCU 休眠域需要的电压整机电流能压到微安级别。这一点对电池设备是刚需。1.3 TM4C129XKCZAD 的底子够不够TM4C129XKCZAD 是 Cortex-M4F 内核的 MCU主频 120MHz带 1MB Flash 和 256KB SRAM以太网 MACPHY 集成在芯片内部板子面积能省不少。单纯看算力它做采集终端绰绰有余。真正让我满意的是它的电源管理能力除了常规的 Run 和 Sleep还有 Deep-Sleep 和 Hibernate 两级低功耗模式。Hibernate 模式下MCU 主电源域可以完全断电只靠 VBAT 引脚上的电池供电给休眠模块RTC 继续计时休眠数据存在电池供电的备份 RAM 里。唤醒方式支持 RTC 匹配、外部唤醒引脚、篡改检测等多个来源。这正好和 PCA9422 组成一个很自然的配合MCU 进 Hibernate 之后PCA9422 进入 standby 模式几乎只保留充电检测和唤醒相关功能。两颗芯片各管一段整机待机功耗就能做得很低。2. 整体电源架构设计2.1 电源轨的划分与分配整个系统的电源轨我分了四路电池电压 VBAT、系统主电源 3V3_SYS、外设 IO 电源 1V8_IO、MCU 的 HIB 备份域。PCA9422 的输入一路来自 USB 的 5V另一路来自电池。充电路径和系统供电路径在芯片内部做电源路径切换。3V3_SYS 由 PCA9422 的一路降压转换器输出给 MCU 的 VDD、以太网 PHY、屏幕、传感器供电。这一路电流需求最大峰值可能到几百毫安所以不能省要选效率高的那一路 DC-DC。1V8_IO 由另一路输出供给 SD 卡和电平转换器这一路对负载要求没那么高但纹波要控制好SD 卡对这种噪声比较敏感。两路 LDO 我留了一路给模拟前端供电另外一路备用。HIB 备份域比较特殊直接从电池正极经二极管接到 MCU 的 VBAT 引脚不经过 PCA9422 的开关因为即便 MCU 进入 Hibernate、PCA9422 也断电了RTC 依然要靠电池电压维持。这里有一个很容易踩的坑HIB 域的电压范围和主电源不一样。MCU 的 VBAT 允许 2.0V 到 3.6V 左右而电池过放保护电压可能低到 3.0V 以下所以中间加一颗低压差二极管和必要的滤波电容就行不能用普通二极管硬顶压降太大会导致 RTC 在电池电压偏低时断电。后来我用了肖特基二极管实测压降不到 0.3V够用。2.2 系统状态机怎么设计电源方案要落地必须有一个明确的系统状态定义。我最后定了四个状态ACTIVE正常工作、SLEEP浅睡眠,MCU 进 Sleep外设部分关闭、STANDBY深度待机MCU 进 HibernatePMIC 进入低功耗模式、CHG_ONLY机器完全关机只保留充电功能。状态切换逻辑不复杂插上 USB 且电量不足时进 ACTIVE 充电用户长按按键或者上位机指令触发 STANDBYSTANDBY 下 RTC 到点或者按键唤醒回 ACTIVE如果设备完全关机但 USB 还在就维持 CHG_ONLY 充电。这颗 PMIC 自己在内部也有电源路径逻辑USB 在不在位我们在固件里通过寄存器状态位去读不需要额外接检测线。每个状态对应的功耗预算我列了个表设计之初就把目标定下来后面调优才有方向系统状态MCU 模式PMIC 模式目标功耗唤醒来源ACTIVERun 120MHz正常输出100~200mA—SLEEPSleep正常输出或轻载模式20~50mA中断、RTCSTANDBYHibernateStandby/关闭负载10uA按键、RTCCHG_ONLY断电仅充电通路待机充电电流USB 插入实际调下来STANDBY 做到 10uA 以下是可以实现的前提是 PCB 上漏电点要处理干净比如分压电阻、上拉电阻这些在休眠时都要能断开或者选阻值大的。2.3 低功耗模式的分工原则做低功耗系统最重要的一条原则是能断电的绝不靠降频能靠硬件关断的绝不靠软件置位。MCU 的 Hibernate 是真正把主电源域断掉只有休眠模块活着这是最彻底的手段。PCA9422 负责把 MCU 之外的供电也断掉实现整机级别的断电。我在设计时把谁负责唤醒这个职责分得很清楚RTC 唤醒由 MCU 的 HIB 模块负责因为它的 32.768kHz 晶振和计数逻辑在 VBAT 域下依然运行按键唤醒由 PCA9422 或者硬件触发通过外部唤醒引脚直接拉 HIB 的 WAKE不走 I2C。这样无论 PMIC 处于什么状态只要 MCU 的 HIB 域还有电按键就一定能唤醒避免了 PMIC 睡着了 I2C 叫不醒它的尴尬。3. 硬件接口与关键电路设计3.1 PCA9422 与 MCU 的 I2C 连接PCA9422 是纯 I2C 控制没有硬件引脚去配置每路电压所有参数上电后由 MCU 写入。我把它挂在 TM4C129XKCZAD 的 I2C0 上引脚是 PB2(SCL) 和 PB3(SDA)。这两颗芯片的 IO 电平都是 3.3V不用做电平转换直接连就行。有一点要注意I2C 总线上拉电阻必须接。PCA9422 内部不一定集成上拉不接的话通信会时好时坏。我选了 4.7k 的上拉电阻总线电容不大400kHz 跑得很稳。如果总线上还挂了其他器件比如温度传感器、电量计建议把所有器件都接到同一条总线上然后用一个总线上拉电阻组统一处理别一根线一个上拉那样反而容易造成信号反射。另外 I2C 的器件地址要注意PCA9422 一般有地址配置引脚硬件上拉或者下拉决定了地址是哪个这要和固件里的宏定义对应起来不然第一天上电就卡在读 ID 这一步。PCB 布局上PCA9422 的开关电源部分和 I2C 线要分开走。降压转换器的电感是强噪声源如果 I2C 走线贴着电感底下过高速通信容易被干扰。我把 I2C 线走在 PCB 内层两侧包地实测没有出现过通信错帧。3.2 充电路径和电池接入细节充电部分PCA9422 支持单节锂电池充电电流和终止电压都是寄存器可调的。硬件上需要注意的首先是电池保护电池正极进来之后要加防反接和 ESD 保护我用了专用的电池保护 IC 加 TVS确保插错电池或者静电不会直接打坏 PMIC 和主控。充电电流的设定除了寄存器还需要一颗电流检测电阻来配合。这颗电阻的精度直接影响充电电流准确性我用了 1% 精度的合金电阻温漂小长期可靠性也好。PCB 上这棵电阻要用开尔文接法检测线从电阻两端单独引出不能直接在焊盘上拉线否则走线上的压降会被算进检测结果里充电电流会跑偏。电池温度检测 NTC 我也接了。PCA9422 一般支持通过 NTC 检测电池温度过温或者低温时自动降流或者停止充电。这个功能很多人会忽略但对于长期野外使用的设备电池过热充电是很大的安全隐患有 NTC 比没有强得多。温度阈值寄存器里可以配置我设的是 0 到 45 度超出就停下来。3.3 休眠唤醒电路设计休眠唤醒是这类设备的设计重点。TM4C129XKCZAD 的 HIB 模块由 VBAT 供电压外部接一颗 32.768kHz 晶振给 RTC 提供时钟。这里有个细节晶振的负载电容要按芯片手册推荐值选我一开始用两颗 6pF 电容结果 RTC 每天快了将近一分钟后来换成手册推荐的 10pF 才对上。唤醒按键我接到 HIB 的 WAKE 引脚上按下时拉低触发。但按键是机械的存在抖动直接接 WAKE 会导致唤醒瞬间反复触发。我在按键上并联了一颗 RC 消抖实测唤醒信号稳定多了。另外 MCU 的 WAKE 引脚在 Hibernate 模式下内部一般有上拉或者可以配置设计时要在初始化里把引脚模式设对不然按键悬空时会乱触发。还有一路唤醒是 RTC 定时唤醒。设备每 30 分钟醒来一次采集一次数据然后继续休眠。这个功能不需要额外电路只要在 Hibernate 之前设置好匹配时间就行。需要注意的是RTC 匹配时间是以秒为单位的绝对计数代码里要做换算别在休眠前忘了关中断否则唤醒后进中断处理程序发现外设时钟还没起来直接跑飞。4. 固件实现从寄存器配置到状态切换4.1 I2C 通信初始化和读写封装固件我基于 TivaWare 驱动库写TM4C129XKCZAD 的 ROM 里自带驱动库可以省 Flash 空间。I2C 初始化代码很简单但有几个细节值得说。#include driverlib/i2c.h #include driverlib/gpio.h #include driverlib/sysctl.h #include driverlib/pin_map.h #define PMIC_I2C I2C0_BASE #define PMIC_I2C_GPIO GPIO_PORTB_BASE #define PMIC_SCL_PIN GPIO_PIN_2 #define PMIC_SDA_PIN GPIO_PIN_3 #define PMIC_ADDR 0x48 // 以实际硬件配置和手册为准 void PMIC_I2C_Init(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB2_I2C0SCL); GPIOPinConfigure(GPIO_PB3_I2C0SDA); GPIOPinTypeI2C(PMIC_I2C_GPIO, PMIC_SCL_PIN | PMIC_SDA_PIN); GPIOPinTypeI2CSCL(PMIC_I2C_GPIO, PMIC_SCL_PIN); I2CMasterInitExpClk(PMIC_I2C, SysCtlClockGet(), true); }GPIOPinTypeI2CSCL 这一步容易漏。SDA 引脚配置成开漏没问题SCL 引脚在 I2C master 模式下也需要配置成专用 SCL 类型不然频率提不上去。我刚开始只用了 GPIOPinTypeI2C 配两个脚400kHz 下通信偶尔出错改成 SCL 单独配置之后问题消失。读写封装分别封装了寄存器读和写带超时保护。PCA9422 是多字节寄存器寻址先写寄存器地址再读数据用 TivaWare 的 burst 命令实现。uint8_t PMIC_ReadReg(uint8_t reg) { uint32_t timeout 1000; I2CMasterSlaveAddrSet(PMIC_I2C, PMIC_ADDR, false); I2CMasterDataPut(PMIC_I2C, reg); I2CMasterControl(PMIC_I2C, I2C_MASTER_CMD_BURST_SEND_START); while (I2CMasterBusy(PMIC_I2C)) { if (--timeout 0) return 0xFF; } timeout 1000; I2CMasterSlaveAddrSet(PMIC_I2C, PMIC_ADDR, true); I2CMasterControl(PMIC_I2C, I2C_MASTER_CMD_BURST_RECEIVE_START); while (I2CMasterBusy(PMIC_I2C)) { if (--timeout 0) return 0xFF; } return I2CMasterDataGet(PMIC_I2C); } void PMIC_WriteReg(uint8_t reg, uint8_t val) { uint32_t timeout 1000; I2CMasterSlaveAddrSet(PMIC_I2C, PMIC_ADDR, false); I2CMasterDataPut(PMIC_I2C, reg); I2CMasterDataPut(PMIC_I2C, val); I2CMasterControl(PMIC_I2C, I2C_MASTER_CMD_BURST_SEND_START); while (I2CMasterBusy(PMIC_I2C)) { if (--timeout 0) return; } }超时保护很重要。如果 PCA9422 因为某种原因拉死总线没有超时的代码会让 MCU 死等整机卡死。我后来在超时处理里加了软件复位 I2C 模块的流程把控制器直接复位再重新初始化恢复能力好了不少。4.2 PCA9422 关键寄存器配置流程PCA9422 的寄存器不多但配置顺序有讲究。我总结出来的初始化流程分四步读 ID 确认通信、配置充电参数、配置各路输出电压、使能输出。以下代码是示意具体寄存器和位域一定以你手里的数据手册为准不同版本可能有差异。void PMIC_Init(void) { uint8_t id PMIC_ReadReg(0x01); // 读取芯片 ID if (id 0xFF) { // 通信异常重试或报错 return; } // 1. 充电电压设置为 4.2V充电电流 1A PMIC_WriteReg(0x10, 0x30); // 终止电压 4.2V PMIC_WriteReg(0x11, 0x1E); // 充电电流 1A按数据手册换算 // 2. 两路 DC-DC 输出电压 PMIC_WriteReg(0x12, 0x0A); // Buck1 3.3V PMIC_WriteReg(0x13, 0x05); // Buck2 1.8V // 3. 使能充电和输出 PMIC_WriteReg(0x20, 0x01); // 使能充电 PMIC_WriteReg(0x21, 0x07); // 使能 Buck1/Buck2/LDO1 }这里我要特别强调一个容易踩的坑PMIC 的寄存器在掉电后不一定是默认值。如果设计上 PMIC 有直连电池的通路即使 MCU 复位了PMIC 可能还保持之前的配置。所以在固件启动时不要假设寄存器是出厂默认值一定要把整个配置流程完整跑一遍。我遇到过的情况是上一版固件把某路电压调成了 3.0V下一版固件忘了初始化这路设备一上电屏幕亮度明显不对排查了半天才发现是 PMIC 寄存器存的还是旧值。4.3 充电管理和电池状态监控充电逻辑我用了一个简单的状态机检测 USB 在位、读取充电状态寄存器、判断是否充满、处理温度异常。PCA9422 充电状态寄存器里一般有充电中、已充满、异常这几个标志位读出来做分支判断。typedef enum { CHG_DISABLED 0, CHG_IN_PROGRESS, CHG_DONE, CHG_FAULT } ChgState; ChgState PMIC_CheckCharger(void) { uint8_t st PMIC_ReadReg(0x30); if (st 0x80) return CHG_FAULT; // 异常 if (st 0x40) return CHG_DONE; // 充满 if (st 0x20) return CHG_IN_PROGRESS; // 充电中 return CHG_DISABLED; }这里有个实际体验充电状态的读取不能太频繁。I2C 通信本身耗电10ms 查一次和 1s 查一次区别很大。我最终改成 1s 轮询一次同时 PMIC 有中断输出引脚的话可以直接接 MCU 的外部中断充满或者异常时再处理这样可以彻底省掉轮询的功耗。这个中断脚我一开始没用后来做整机功耗测试发现 I2C 轮询在待机模式下贡献了不少功耗改成中断触发后待机电流又降了一截。充电电流的设定还要考虑输入源的供电能力。如果接的是电脑 USB 口最大只能给 500mA你却在寄存器里设了 1.5A 充电电流输入源会被拉垮电压跌落导致 PMIC 反复重启。我做了个输入源检测通过 PMIC 的输入电压状态寄存器判断是标准 USB 还是适配器USB 时限制充电电流 500mA适配器时放开到 1A。这个功能花不了几行代码但能避免很多莫名其妙的故障。4.4 低功耗切换的完整流程低功耗切换是整个固件里最需要小心的地方。MCU 不是拔电就完事进 Hibernate 之前要把该保存的保存、该关的关掉唤醒之后还要把 PMIC 重新配置一遍。我写了一个 Hibernate 进入函数和一个唤醒恢复函数。进入 Hibernate 的流程void EnterHibernate(uint32_t wakeAfterSec) { // 1. 保存需要保留到唤醒后的数据到 HIB 备份 RAM HibernateDataPut(0, (uint32_t)g_sysState); HibernateDataPut(4, (uint32_t)g_flags); // 2. 关闭不需要的外设以降低漏电 SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOB); // 3. 设置 RTC 唤醒时间 HibernateRTCSet(0); HibernateRTCEnable(); HibernateWakeSet(HIBERNATE_WAKE_PIN_LOW | HIBERNATE_WAKE_RTC); HibernateIntEnable(HIBERNATE_INT_PIN_WAKEUP | HIBERNATE_INT_RTC_MATCH); // 4. 让 PMIC 进入待机状态断开大部分负载 PMIC_WriteReg(0x21, 0x00); // 关闭全部输出 PMIC_WriteReg(0x20, 0x00); // 关闭充电 // 5. 请求 MCU 进入 Hibernate HibernateRequest(); // 代码到这里不会再往下执行 }唤醒之后MCU 从上电复位开始跑和冷启动没什么区别。所以 main 函数里要判断这次是冷启动还是 Hibernate 唤醒通过 HIB 模块的复位原因寄存器区分。如果是唤醒需要重新初始化 PMIC、恢复外设状态、把刚才存的标志位读出来决定是继续干活还是重新进休眠。int main(void) { SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN, 120000000); PMIC_I2C_Init(); if (HibernateIsActive()) { // Hibernate 唤醒路径 PMIC_Init(); // 重新配置 PMIC g_sysState HibernateDataGet(0); g_flags HibernateDataGet(4); PMIC_CheckCharger(); RunMainLoop(); } else { // 冷启动 PMIC_Init(); RunMainLoop(); } }有一个细节大家容易漏Hibernate 唤醒后所有 GPIO 都是复位默认状态之前配置的上下拉、驱动能力全部丢失。如果你在休眠前把某个引脚拉高给外部传感器供电醒来之后第一件事就是重新配置引脚方向否则传感器可能不工作排查起来还以为是 PMIC 的问题。我还做了一件事在进 Hibernate 之前把 PMIC 的寄存器当前值全部读到 HIB 备份 RAM 里。这样唤醒后可以对比 PMIC 实际配置和期望配置差在哪调试低功耗问题的时候特别有用。有一次发现唤醒后充电电流不对一对比备份的寄存器快照发现 PMIC 有一路输出使能位没恢复定位问题只用了十分钟。5. 常见问题与排查实录5.1 I2C 通信不稳定的排查思路这块我遇到的问题最有代表性PCA9422 偶尔读回错误数据有时直接 NACK。排查过程很曲折最后定位到三个原因。第一个是上拉电阻阻值偏大总线上升沿太缓400kHz 下信号不满足时序换 2.2k 后好了第二个是 I2C 走线旁边有一条 DC-DC 的电感走线干扰耦合到了 SCL内层走线加包地之后改善明显第三个是板子上还有另一颗 I2C 从机地址冲突导致总线仲裁异常这类问题用示波器抓波形是最直接的。我的排查方法是先在空闲总线时序抓波形确认没有异常毛刺然后用低速 100kHz 跑一遍完整的读-写-读流程看是否稳定最后再逐步提速到 400kHz。一步一个坎定位起来反而比瞎猜快。如果系统里 I2C 总线上还挂了别的设备建议给每个设备分配独立的逻辑地址并且在代码里加地址扫描函数启动时打印所有在线设备地址能省很多 debug 时间。5.2 充电电流和电压不准充电电流偏小多半是电流检测电阻或者 PCB 走线的问题。我用开尔文接法之后充电电流精度明显提升。如果电流偏大重点查寄存器配置是否正确、是否读取了旧值。还有一次遇到过充满电压只有 4.05V 就停充的情况排查到原因是电池 NTC 检测到温度超出设置范围PMIC 在过温保护状态下降低了终止电压。那天环境温度确实高属于保护正常动作不是故障。充电问题排查表我整理成了一份速查表放在项目文档里现象可能原因处理办法电流始终为 0充电未使能/输入源能力不足检查使能寄存器、输入源检测电流偏小检测电阻精度/温度降流换 1% 电阻、检查 NTC充电反复重启输入电压跌落降低电流设置、换适配器提前充满终止电压设置偏低核对寄存器换算关系间歇性停充电池温度波动检查 NTC 焊接和布局5.3 休眠后唤醒失败或功耗偏高我踩过一个很典型的坑进 Hibernate 之后整机功耗还有几毫安降不下去。逐步排查发现是 PMIC 的某个 GPIO 还在给外设供电。那是 PMIC 的一个 LDO 输出我初始化时通过寄存器使能了它进休眠的流程里只关了主要输出漏关了这一路。休眠前把所有输出全部关闭功耗立刻降到 10uA 左右。唤醒失败的案例也有一个RTC 定时唤醒没有生效最后发现是 HibernateRTCSet 和匹配时间设置之间缺少一次 RTC 中断使能导致唤醒事件根本没有产生。这类问题通过寄存器回读就能发现把 HIB 的状态寄存器打印出来看唤醒标志是哪一路一目了然。另外 WAKE 引脚的消抖一定要做我最初偷懒没加结果按键唤醒时偶尔会唤醒后立刻又睡回去像是没醒一样加了 RC 消抖和软件延时后才稳定。5.4 实测功耗数据最终整机功耗我实测的成绩如下给各位一个参考量级。ACTIVE 状态全速跑加屏幕亮整机电流约 160mA关掉屏幕和外设只保留 MCU 运行降到 90mA 左右SLEEP 状态约 35mASTANDBY 状态整机 8.2uA其中 MCU Hibernate 占 2.1uAPCA9422 占 3.5uAPCB 漏电和电源监控分压占了剩下的。这个成绩对于带以太网的设备来说我个人比较满意。如果要把 8.2uA 再往下压就得考虑把 PCB 上的分压电阻改成休眠时可断开的方案进一步降低漏电路径。6. 几个真正值钱的实操心得做完这个项目我最深的体会是PMIC 不是上电就完事的芯片它的价值要靠固件来发挥。PCA9422 给了你一堆可配置的寄存器但真正的系统功耗、充电体验、唤醒可靠性全在初始化流程和状态切换的细节里。比如充电电流要跟着输入源走、休眠前要把 PMIC 寄存器快照存好、唤醒后要重新配置所有 GPIO这些都不是数据手册会告诉你的是实际跑过、测过才能积累出来的经验。另外一点是关于调试工具的。做这类项目示波器是必备的I2C 波形抓一次比看十遍代码都有用。我还习惯在固件里留一个调试串口把 PMIC 的所有寄存器状态周期性打印出来这样 QA 反馈问题的时候可以远程拿到现场的寄存器快照判断是配置问题还是硬件问题。这个习惯帮我解决了不少只在现场复现的疑难杂症。最后还想说一个扩展方向如果后续设备要加电量统计功能可以在 I2C 总线上再挂一颗电量计PCA9422 负责供电和充电电量计负责计量MCU 只做策略。这套架构的可扩展性很好换电池容量、换充电策略都不需要动硬件。如果你正在做类似的手持设备或者便携仪器这个组合值得试一下。