news 2026/11/4 1:06:04

OpenHarmony实战:RTC与USB HID驱动开发全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenHarmony实战:RTC与USB HID驱动开发全解析

1. 从零拆解RTC与USB HID在OpenHarmony上的落地思路

RTC实时时钟和USB键鼠这两个模块,放在OpenHarmony系统实战开发里,属于那种"看起来简单、上手全是坑"的典型。我前后在几块不同板子上折腾过这两块,踩的坑比想象中多得多。这篇内容就把RTC和USB HID在OpenHarmony上的完整实现路径拆开讲清楚,从硬件选型、驱动适配、HDI接口对接到应用层调用,每一步都给出可复现的操作方案。

先说清楚这两个模块各自解决什么问题。RTC解决的是"设备断电后时间还在不在"的问题——你不可能指望每次上电都让用户手动对时,尤其是那些需要记录日志时间戳、定时唤醒、离线计费的场景,RTC是刚需。USB键鼠解决的是"人机交互输入"的问题——OpenHarmony设备如果要做桌面形态或者需要外接输入设备,USB HID协议就是绕不开的一环。

适合谁来参考?如果你正在做OpenHarmony的板级适配、驱动开发,或者你手上有GD32L233、STM32H743这类带RTC和USB外设的芯片,想把它们跑在OpenHarmony上,这篇内容基本可以当操作手册用。即使你之前没接触过OpenHarmony的HDI框架,跟着走也能把流程跑通。

注意:本文涉及的芯片型号和寄存器操作均基于公开数据手册,具体参数以你手头芯片的最新手册为准。

2. RTC模块的硬件选型与驱动适配

2.1 为什么选DS1307还是用MCU内置RTC

这是第一个要做的决策。DS1307是一颗经典的I2C接口外置RTC芯片,内置56字节SRAM,成本低,资料多。MCU内置RTC(比如GD32L233的RTC、STM32H743的RTC)则省掉一颗芯片,但需要外部32.768kHz晶振和纽扣电池供电。

我实际对比过两种方案:

对比项DS1307外置方案MCU内置RTC方案
硬件成本多一颗芯片+晶振+电池仅晶振+电池
精度依赖晶振精度,通常±2ppm同样依赖晶振,但可做温度补偿
功耗待机约200nA(电池供电)VBAT域可做到极低功耗
驱动复杂度I2C读写,协议简单寄存器操作,需配置时钟树
OpenHarmony适配需写I2C HDI驱动可用SoC原生RTC驱动框架

选DS1307的场景:你的MCU没有内置RTC,或者内置RTC的VBAT引脚被占用了。选内置RTC的场景:追求低功耗和小型化,比如GD32L233这种低功耗芯片,它的VBAT域在待机时消耗极低能量,RTC和LSE(低速外部晶振)可以独立运行。

我个人的建议是:如果芯片自带RTC且VBAT引脚可用,优先用内置的。少一颗芯片就少一份BOM成本和故障点。DS1307更适合那些老旧的、没有内置RTC的MCU平台。

2.2 I2C通信的时序陷阱与地址确认

DS1307的I2C地址是固定的0x68(7位地址),写操作地址0xD0,读操作地址0xD1。这个地址不需要配置,但实际调试时最容易出问题的地方在于时序。

I2C的时序问题通常表现为:读出来的数据全是0xFF或者0x00。遇到这种情况,先别急着怀疑芯片坏了,按以下顺序排查:

  1. 用逻辑分析仪或者示波器抓SCL和SDA波形,确认起始条件、地址帧、ACK位是否正常
  2. 检查上拉电阻——I2C总线必须有上拉,典型值4.7kΩ,如果总线电容大(走线长、挂载设备多),需要减小到2.2kΩ甚至1kΩ
  3. 确认时钟频率——DS1307支持最高100kHz的标准模式,部分批次支持400kHz快速模式,但保险起见先用100kHz
  4. 检查电源——DS1307在主电源掉电后会自动切换到备用电池,如果电池电压低于2.0V,芯片可能不响应

我在一块自制板上遇到过读DS1307全是0xFF的情况,排查了半天发现是上拉电阻焊成了10kΩ,总线电容又大,波形上升沿太缓,芯片根本识别不了。换成4.7kΩ后立刻正常。

2.3 BCD码转换:RTC数据格式的核心细节

DS1307和大多数RTC芯片一样,时间寄存器用的是BCD码格式。这意味着你读出来的0x23表示的是23秒,而不是十进制的35。这个转换如果搞错了,时间就会乱七八糟。

BCD转十进制的逻辑很简单:

// BCD转十进制 uint8_t bcd2dec(uint8_t bcd) { return ((bcd >> 4) * 10) + (bcd & 0x0F); } // 十进制转BCD uint8_t dec2bcd(uint8_t dec) { return ((dec / 10) << 4) | (dec % 10); }

看起来简单,但实际写代码时容易在小时寄存器的12/24小时模式上翻车。DS1307的小时寄存器第6位是12/24小时模式选择位,第5位在12小时模式下是AM/PM标志。如果你直接对整个字节做BCD转换,就会把模式位也当成数据位处理。

正确的做法是先判断模式位,再取低5位(24小时模式)或低6位(12小时模式)做BCD转换。我建议统一用24小时模式,初始化时把0x02寄存器的第6位清零,这样后续处理最简单。

2.4 OpenHarmony下RTC HDI接口的对接方式

OpenHarmony的HDI(Hardware Device Interface)层为RTC定义了标准接口,位于drivers/peripheral/rtc目录下。核心接口包括:

  • RtcOpen():打开RTC设备
  • RtcReadTime():读取当前时间
  • RtcWriteTime():设置时间
  • RtcReadAlarm():读取闹钟
  • RtcWriteAlarm():设置闹钟
  • RtcRegisterCallback():注册闹钟回调
  • RtcClose():关闭设备

对接DS1307时,你需要实现一个RtcHost结构体,把上述接口映射到具体的I2C读写操作。关键点在于RtcReadTime返回的时间结构体struct RtcTime,它包含year、month、day、hour、minute、second字段,都是十进制格式。所以你的驱动里必须做BCD到十进制的转换。

对于MCU内置RTC,OpenHarmony的适配层通常已经提供了SoC级的RTC驱动,你只需要在HDF(Hardware Driver Foundation)配置文件中声明设备节点,并实现RtcHost的绑定即可。

提示:HDI接口的实现在不同OpenHarmony版本间可能有差异,建议以你使用的版本对应的drivers/peripheral/rtc源码为准。

3. USB HID键鼠的协议解析与设备实现

3.1 USB HID协议的核心概念:报告描述符

USB HID设备之所以能做到"即插即用",核心在于报告描述符(Report Descriptor)。这是一段用特定格式描述设备数据结构的字节码,主机通过解析它来理解设备发送的数据含义。

一个标准的USB鼠标报告描述符大致长这样:

// USB鼠标报告描述符示例 static const uint8_t mouse_report_desc[] = { 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x02, // Usage (Mouse) 0xA1, 0x01, // Collection (Application) 0x09, 0x01, // Usage (Pointer) 0xA1, 0x00, // Collection (Physical) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (1) 0x29, 0x03, // Usage Maximum (3) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x95, 0x03, // Report Count (3) 0x75, 0x01, // Report Size (1) 0x81, 0x02, // Input (Data, Variable, Absolute) 0x95, 0x01, // Report Count (1) 0x75, 0x05, // Report Size (5) 0x81, 0x01, // Input (Constant) 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x09, 0x38, // Usage (Wheel) 0x15, 0x81, // Logical Minimum (-127) 0x25, 0x7F, // Logical Maximum (127) 0x75, 0x08, // Report Size (8) 0x95, 0x03, // Report Count (3) 0x81, 0x06, // Input (Data, Variable, Relative) 0xC0, // End Collection 0xC0 // End Collection };

这段描述符告诉主机:这是一个鼠标设备,有3个按键(左中右),X/Y轴和滚轮各8位有符号数,范围-127到127。主机收到4字节的报告数据后,就知道第一个字节的bit0-2是按键状态,后面三个字节分别是X位移、Y位移和滚轮。

键盘的报告描述符稍微不同,它通常包含8个字节:第一个字节是修饰键(Ctrl、Shift、Alt等),第二个字节保留,后面6个字节是同时按下的普通按键的键码。

3.2 在OpenHarmony上实现USB HID设备的两种路径

OpenHarmony上实现USB HID设备有两条路:

路径一:使用USB Device HDI接口

OpenHarmony提供了USB Device HDI,位于drivers/peripheral/usb目录。你可以通过UsbFnDeviceCreate创建USB功能设备,配置描述符和端点,然后通过UsbFnEndpointWrite发送HID报告数据。这种方式适合在OpenHarmony系统内部实现一个USB HID设备。

路径二:使用SoC原生的USB外设库

如果你的芯片厂商提供了USB Device库(比如STM32的USB-FS-Device_Lib、GD32的USB库),你可以直接在HAL层实现HID设备,然后通过OpenHarmony的HDI接口暴露给上层。这种方式更灵活,但需要自己处理USB协议栈。

我实际用下来,路径一更适合快速原型验证,路径二更适合产品化。因为路径一依赖OpenHarmony的USB框架完整度,而路径二你可以完全控制USB协议栈的行为。

3.3 USB描述符配置的关键参数

USB设备枚举过程中,主机依次获取设备描述符、配置描述符、接口描述符、HID描述符和报告描述符。任何一个环节出错,设备都无法正常识别。

关键参数包括:

描述符类型关键字段典型值说明
设备描述符idVendor0x1234厂商ID,自定义设备可用测试ID
设备描述符idProduct0x5678产品ID
设备描述符bNumConfigurations1配置数量
配置描述符bNumInterfaces1接口数量
接口描述符bInterfaceClass0x03HID类
接口描述符bInterfaceSubClass0x01启动接口
接口描述符bInterfaceProtocol0x02鼠标协议
HID描述符bcdHID0x0111HID版本1.11
HID描述符bNumDescriptors1报告描述符数量
端点描述符bmAttributes0x03中断传输
端点描述符wMaxPacketSize4鼠标报告4字节
端点描述符bInterval10轮询间隔10ms

bInterval这个参数值得多说一句。它决定了主机每隔多长时间来轮询一次端点。对于鼠标,10ms足够流畅;对于键盘,20ms也没问题。设太小会增加总线负载,设太大又会有明显延迟。我一般鼠标用8ms,键盘用16ms,实测下来很稳。

3.4 中断传输与报告发送的实操细节

USB HID使用中断传输(Interrupt Transfer)来发送报告数据。虽然是"中断"传输,但实际上主机是周期性轮询的,并不是设备主动触发中断。

发送报告数据的流程:

  1. 把报告数据写入端点缓冲区
  2. 设置端点状态为VALID,触发发送
  3. 等待主机轮询并取走数据
  4. 收到ACK后,端点状态变为NAK,等待下一次写入

在STM32的USB-FS-Device_Lib中,这个流程封装在USB_SIL_Write和SetEPTxValid两个函数里。在OpenHarmony的USB Device HDI中,对应的是UsbFnEndpointWrite和UsbFnEndpointEnable。

一个常见的坑是:如果你在端点还在发送上一次数据时就写入新数据,会导致数据覆盖或发送失败。正确的做法是等待上一次发送完成(通过回调或状态查询确认),再写入新数据。

4. RTC与USB HID在OpenHarmony上的完整实操流程

4.1 环境搭建与源码获取

先把基础环境搭好。你需要:

  • OpenHarmony源码(建议3.2 Release或4.0 Release版本)
  • 交叉编译工具链(arm-none-eabi-gcc或芯片厂商提供的工具链)
  • 串口调试工具(用于查看启动日志)
  • USB抓包工具(可选,用于分析USB枚举过程)

源码获取后,RTC相关代码在drivers/peripheral/rtc,USB相关代码在drivers/peripheral/usb。你需要根据自己芯片的HDF配置文件,在vendor/你的厂商/你的产品/config目录下添加对应的设备节点。

4.2 RTC驱动适配的完整步骤

以DS1307为例,适配步骤如下:

第一步:配置I2C控制器

在HDF配置文件中声明I2C控制器和设备:

// 在hdf配置中添加I2C节点 i2c0 :: i2c { match_attr = "hi35xx_i2c"; busNum = 0; regBase = 0x12060000; regStep = 0x1000; speed = 100000; mode = 0; };

第二步:实现RtcHost接口

创建rtc_ds1307.c,实现RtcHost的所有方法。核心是RtcReadTime和RtcWriteTime:

static int32_t RtcDs1307ReadTime(struct RtcHost *host, struct RtcTime *time) { uint8_t buf[7]; // 从DS1307的0x00寄存器开始连续读7个字节 if (I2cRead(DS1307_ADDR, 0x00, buf, 7) != 0) { return HDF_FAILURE; } time->second = bcd2dec(buf[0] & 0x7F); time->minute = bcd2dec(buf[1] & 0x7F); time->hour = bcd2dec(buf[2] & 0x3F); // 24小时模式 time->day = bcd2dec(buf[4] & 0x3F); time->month = bcd2dec(buf[5] & 0x1F); time->year = bcd2dec(buf[6]) + 2000; return HDF_SUCCESS; }

第三步:注册驱动并绑定

在HDF驱动入口中注册RtcHost,并在配置文件中将DS1307节点与RTC驱动绑定。

第四步:验证

通过hdf_rtc_test工具或者自己写一个测试程序,调用RtcReadTime读取时间,确认数据正确。

4.3 USB HID键鼠的配置与调试

USB HID的配置比RTC复杂一些,因为涉及USB协议栈的初始化。

第一步:初始化USB控制器

根据芯片手册配置USB时钟、PHY、端点缓冲区。以STM32H743为例,USB_OTG_FS的初始化包括:

  • 使能USB时钟
  • 配置GPIO为USB功能
  • 配置USB核心为Device模式
  • 初始化端点0用于控制传输
  • 初始化端点1用于HID中断传输

第二步:实现HID类请求处理

USB主机在枚举过程中会发送HID类特定请求,最重要的是GET_REPORT和SET_REPORT。你需要实现这些请求的处理函数,返回报告描述符或处理主机下发的数据。

第三步:实现报告发送逻辑

对于鼠标,报告数据格式为:[按键状态, X位移, Y位移, 滚轮]。对于键盘,报告格式为:[修饰键, 保留, 键码1, 键码2, 键码3, 键码4, 键码5, 键码6]。

第四步:调试与验证

把设备插入电脑,观察设备管理器中的识别情况。如果识别为"未知USB设备",通常是描述符有问题。用USB抓包工具(如Wireshark配合USBPcap)可以看到枚举过程中的详细交互,快速定位问题。

4.4 参数计算与选择过程

这里补充几个实际调试中需要计算的参数:

RTC晶振负载电容计算

32.768kHz晶振的负载电容通常为6pF或12.5pF。匹配电容的计算公式为:

CL = (C1 * C2) / (C1 + C2) + Cstray

其中Cstray是PCB走线的寄生电容,典型值2-5pF。如果晶振负载电容为6pF,Cstray取3pF,则C1=C2=6pF。实际取值需要根据晶振手册和PCB实际情况微调。

USB端点缓冲区分配

USB FS模式下,端点缓冲区通常为512字节或1024字节。端点0需要至少64字节(控制传输最大包长),HID中断端点需要至少8字节。如果使用双缓冲,需要分配两倍空间。

轮询间隔与功耗的权衡

bInterval越大,主机轮询频率越低,设备功耗越小,但输入延迟越大。对于电池供电的无线键鼠,通常取10-20ms;对于有线设备,取1-8ms可以获得更好的响应体验。

5. 常见问题与排查技巧实录

5.1 RTC相关故障排查

问题一:RTC时间不走

现象:读取RTC时间,每次读到的值都一样。

排查思路:

  1. 检查晶振是否起振——用示波器测晶振引脚,应该有32.768kHz正弦波
  2. 检查CH(Clock Halt)位——DS1307的0x00寄存器bit7是时钟停止位,如果为1则时钟不走,需要清零
  3. 检查VBAT供电——如果主电源和电池都没接,RTC可能不工作

问题二:时间走得不准

现象:一天差几秒甚至几分钟。

排查思路:

  1. 晶振精度不够——普通晶振精度约±20ppm,一天误差约1.7秒;高精度晶振可到±5ppm
  2. 负载电容不匹配——按上述公式重新计算匹配电容
  3. 温度影响——晶振频率随温度变化,宽温场景需要温度补偿晶振

问题三:I2C通信失败

现象:读写DS1307返回错误。

排查思路:

  1. 确认I2C地址正确(0x68)
  2. 检查上拉电阻(4.7kΩ典型值)
  3. 用逻辑分析仪抓波形,确认时序
  4. 检查电源电压(DS1307工作电压4.5V-5.5V,3.3V系统需要电平转换)

5.2 USB HID相关故障排查

问题一:设备无法识别

现象:插入电脑后提示"无法识别的USB设备"。

排查思路:

  1. 检查D+上拉电阻——USB FS设备需要在D+线上接1.5kΩ上拉电阻到3.3V
  2. 检查描述符——用USB抓包工具查看枚举过程,确认描述符请求是否正常响应
  3. 检查时钟——USB FS需要48MHz时钟,精度要求±0.25%

问题二:设备识别但无法输入

现象:设备管理器显示HID设备,但按键无反应。

排查思路:

  1. 检查报告描述符——确认数据格式与主机期望一致
  2. 检查端点配置——确认中断端点地址、方向、包大小正确
  3. 检查报告发送——用调试器确认数据确实写入了端点缓冲区

问题三:枚举过程中断

现象:枚举到一半失败,设备管理器显示黄色感叹号。

排查思路:

  1. 检查控制传输——端点0的SETUP阶段、DATA阶段、STATUS阶段是否完整
  2. 检查字符串描述符——如果主机请求字符串描述符但设备返回STALL,可能导致枚举失败
  3. 检查配置描述符总长度——必须与实际返回的字节数一致

5.3 常见问题速查表

问题现象可能原因排查方法解决方案
RTC时间不走CH位为1读0x00寄存器bit7清零CH位
RTC时间不准晶振精度差测晶振频率换高精度晶振或调负载电容
I2C读全0xFF上拉电阻过大测SCL/SDA波形换4.7kΩ上拉
USB无法识别D+上拉缺失测D+电压加1.5kΩ上拉
USB枚举失败描述符错误USB抓包修正描述符
HID无输入报告格式错对比报告描述符修正数据格式
设备频繁掉线电源不稳测VBUS电压加滤波电容

5.4 独家避坑技巧

技巧一:RTC初始化时先停时钟再配置

DS1307上电后时钟可能处于不确定状态。正确的初始化顺序是:先设置CH位停止时钟,然后写入初始时间,最后清零CH位启动时钟。这样可以避免在配置过程中时钟走动导致时间错误。

技巧二:USB描述符用工具生成

手动写报告描述符容易出错。推荐用HID Descriptor Tool(网上有开源版本)生成,然后对照检查。生成后一定要用USB抓包工具验证主机实际收到的描述符是否与预期一致。

技巧三:RTC和USB共用I2C/中断资源时注意优先级

如果你的RTC用I2C接口,USB也用到了同一个I2C控制器(比如某些SoC的USB PHY配置通过I2C),需要注意中断优先级和互斥访问。我遇到过USB枚举过程中RTC读取失败的情况,原因是USB中断优先级高于I2C中断,导致I2C传输被打断。解决方案是给I2C传输加临界区保护,或者提高I2C中断优先级。

技巧四:用GPIO模拟USB枚举过程辅助调试

如果USB枚举一直失败,可以写一个简单的GPIO翻转程序,在枚举的每个阶段翻转一个IO口,用示波器观察时序。这样可以快速定位是哪个阶段出了问题。

技巧五:RTC电池选型注意自放电率

CR2032纽扣电池的自放电率约1%/年,理论寿命10年。但如果你的RTC电路有漏电流(比如I2C上拉电阻在断电时仍消耗电池电流),实际寿命会大幅缩短。建议在I2C上拉电阻的电源端加一个二极管,主电源掉电时自动切断上拉电阻的供电路径。

6. 从模块到系统:RTC与USB HID的协同工作

6.1 时间戳与输入事件的关联

在实际产品中,RTC和USB HID往往需要协同工作。比如一个带触摸屏和USB键鼠的OpenHarmony终端,用户每次按键或点击都需要记录精确的时间戳。这时候RTC提供的时间基准就很重要。

实现方式:在USB HID的报告处理回调中,调用RTC的RtcReadTime获取当前时间,与输入事件一起打包上报给应用层。注意RTC读取是I2C操作,有一定耗时(典型100-200微秒),如果输入事件频率很高,建议缓存RTC时间,每隔一定周期更新一次,而不是每次输入都读RTC。

6.2 低功耗场景下的RTC唤醒与USB唤醒

GD32L233这类低功耗芯片支持多种低功耗模式。在待机模式下,RTC可以继续运行并产生闹钟中断唤醒系统。如果系统被RTC唤醒后需要USB键鼠输入,还需要配置USB唤醒功能。

USB唤醒的实现:设备在挂起状态下,通过检测USB总线的唤醒信号(K状态)来触发唤醒。在OpenHarmony的USB HDI中,可以通过UsbFnDeviceSetWakeup接口使能唤醒功能。

6.3 系统集成时的注意事项

把RTC和USB HID集成到OpenHarmony系统时,有几个点需要特别注意:

  • HDF配置文件中设备节点的依赖关系——RTC依赖I2C控制器,USB依赖USB控制器,确保控制器先初始化
  • 中断优先级分配——USB中断通常优先级较高,RTC闹钟中断可以设低一些
  • 电源管理——低功耗模式下需要正确配置RTC和USB的电源域
  • 日志输出——调试阶段建议打开HDF的调试日志,方便定位问题

我在实际项目中最深的体会是:RTC和USB HID单独调试都不算太难,但放在一起跑的时候,问题往往出在资源竞争和初始化顺序上。建议先把两个模块分别调通,再逐步集成,不要一上来就全接在一起调。

最后分享一个小技巧:OpenHarmony的HDF框架提供了hdf_devmgr工具,可以在系统运行时查看设备树和驱动绑定状态。调试RTC和USB时,先用这个工具确认设备节点是否正确创建、驱动是否成功绑定,能省掉很多盲目排查的时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 1:05:56

MQTT物联网通信协议实战:从核心原理到Broker搭建与客户端开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 1:05:56

STM32多传感器系统为何必须用FreeRTOS

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 1:04:29

嵌入式驱动从能跑到会崩:四大崩溃现场与工程化排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 1:04:10

基于ESP32的残障人士个人安全设备:跌倒检测与一键求助实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 1:04:08

ADS122U04IPWR+STM32C031C6工业温度采集系统设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 1:04:07

工业级温度感知系统:ADS122U04IPWR与R7FA8D1BHECBD协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华