RIOT 备份电池电压监测:tests/periph/vbat 测试应用的构建、运行与实现原理
物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载导读在 RIOT 操作系统中很多 MCU尤其是带备份域与 RTC 的 STM32都支持在主电源断电时由连接在 VBAT 引脚上的备份电池维持备份域寄存器与 RTC 内容的供电。tests/periph/vbat是 RIOT 提供的备份电池监测backup battery monitoring测试应用它周期性采样备份电池电压并通过串口打印结果。本文以该测试应用为主线讲解如何在 RIOT 中构建运行它、解读串口输出并深入其底层驱动periph/vbat与 STM32 平台实现帮助你掌握 VBAT 电压采样从应用层到寄存器层的完整调用链。一、测试应用概览tests/periph/vbat目录非常精简包含三个文件README.md应用说明即本文对应的原始文档main.c测试主程序负责采样与打印Makefile构建配置声明平台特性与模块依赖。该应用的定位正如其 README 所述定期采样备份电池电压并把结果打印到串口控制台。它是验证某块开发板 VBAT 通道配置是否正确、备份电池是否具备足够电压的快速手段适合在硬件调试阶段作为冒烟测试运行。二、构建与运行2.1 Makefile 解析Makefile 的内容如下BOARD ? nucleo-f767zi include ../Makefile.periph_common FEATURES_REQUIRED periph_vbat USEMODULE ztimer ztimer_msec include $(RIOTBASE)/Makefile.include关键点BOARD ? nucleo-f767zi默认目标板为 STM32F767ZI 的 NUCLEO 开发板构建时可用BOARDxxx覆盖FEATURES_REQUIRED periph_vbat要求目标平台必须提供periph_vbat特性否则编译直接失败。该特性在支持的 CPU 中声明例如 cpu/stm32/Makefile.features从构建系统层面保证了该测试只会在真正支持 VBAT 监测的平台上编译USEMODULE ztimer ztimer_msec依赖 ztimer 毫秒定时器用于周期性采样include ../Makefile.periph_common引入 tests 公共构建配置定义RIOTBASE并包含 Makefile.tests_common。2.2 编译与烧录在仓库根目录执行make -C tests/periph/vbat flash term默认会编译并烧录到 NUCLEO-F767ZI 并通过term打开串口终端。切换到其他支持periph_vbat的板卡例如make -C tests/periph/vbat BOARDnucleo-l476rg flash term需要注意的是并非所有 RIOT 支持的板卡都能运行该测试。periph_vbat是一个平台特性只有 CPU 具备内部 VBAT ADC 通道且板级配置中声明了VBAT_ADC的板卡才可用。2.3 典型串口输出烧录运行后终端输出如下RIOT backup battery monitoring test This test will sample the backup battery once a second VBAT: 3298[mV] VBAT: 3299[mV] VBAT: 3298[mV]每一秒打印一行当前 VBAT 电压单位是毫伏mV。如果采样失败程序会以退出码 1 终止在 native 等环境下可见返回值。三、程序行为与主循环main.c 的逻辑非常直白完整代码如下#include stdio.h #include inttypes.h #include board.h #include ztimer.h #include periph/vbat.h int main(void) { puts(\nRIOT backup battery monitoring test\n); puts(This test will sample the backup battery once a second\n\n); int32_t bat_mv; while (1) { if ((bat_mv vbat_sample_mv()) 0) { return 1; } printf(VBAT: %PRIi32[mV]\n, bat_mv); ztimer_sleep(ZTIMER_MSEC, 1000); } return 0; }几个值得注意的实现细节vbat_sample_mv()返回int32_t类型的毫伏值负值表示采样失败应用据此以非零退出码终止打印使用PRIi32格式化宏保证在有符号 32 位整型上的可移植性来自inttypes.h采样周期为 1 秒由ztimer_sleep(ZTIMER_MSEC, 1000)实现这是一个阻塞式睡眠主循环永不退出除非采样出错因此这是一个无限采样型测试应用。从测试代码可以看出应用层只依赖一个 APIvbat_sample_mv()。这正是 RIOT 将外设驱动抽象为统一接口的体现——上层应用无需关心底层是哪个 ADC 通道、哪个寄存器。四、periph/vbat 驱动接口periph/vbat是 RIOT 的一个 CPU 特性驱动统一接口定义在 drivers/include/periph/vbat.h。接口共三个函数函数签名语义初始化int vbat_init(void)初始化备份电池监测通道返回 0 表示成功非 0 表示失败采样电压int32_t vbat_sample_mv(void)采样备份电池电压返回毫伏值负值表示失败电量判断bool vbat_is_empty(void)将采样结果与维持备份域供电所需的最小电压比较返回true表示电量已耗尽在多数应用场景中vbat_init()会由auto_init机制自动调用对应模块auto_init中对外设驱动的统一初始化流程应用只需关心后两个函数。本文的测试应用没有显式调用vbat_init()直接使用vbat_sample_mv()这也说明该驱动遵循 RIOT 外设驱动的常规初始化约定。vbat.h还对硬件接线给出了权威说明备份电池必须连接到 VBAT 引脚和 GND。在大多数开发板上需要移除连接 VDD 与 VBAT 的焊桥solder bridge。该电池用于在主电源VDD断电期间维持备份域寄存器和 RTC 寄存器的内容。五、STM32 平台实现原理periph/vbat是 CPU 特性驱动真正的寄存器级实现位于各 CPU 中。以支持度最完整的 STM32 为例实现在 cpu/stm32/periph/vbat.c。5.1 采样公式核心采样函数如下int32_t vbat_sample_mv(void) { int32_t mv adc_sample(VBAT_ADC, VBAT_ADC_RES); mv (mv * VBAT_ADC_SCALE * vref_mv()) / VBAT_ADC_MAX; return mv; }计算逻辑分三步用adc_sample()对内部 VBAT 通道做一次 ADC 采样得到原始数字量乘上VBAT_ADC_SCALE分压系数与参考电压vref_mv()除以VBAT_ADC_MAX满量程值得到毫伏电压。其中VBAT_ADC_RES与VBAT_ADC_MAX按 CPU 系列定义例如大部分 12 位 ADC 的 STM32 为ADC_RES_12BIT/4095见 cpu/stm32/include/periph/f7/periph_cpu.h 等系列头文件而 STM32U5 采用 14 位 ADC对应ADC_RES_14BIT/16383见 cpu/stm32/include/periph/u5/periph_cpu.h。5.2 参考电压的弱符号实现vref_mv()在 cpu/stm32/periph/vbat.c 中是一个__attribute__((weak))弱符号int32_t __attribute__((weak)) vref_mv(void) { return CONFIG_VBAT_ADC_VREF_MV; }默认返回编译期配置CONFIG_VBAT_ADC_VREF_MV默认 3300 mV即假设 ADC 参考电压等于 VDD/VDD A。源码注释明确指出如果板卡能够获取更精确的 ADC 供电电压可以重写override该函数未来若出现 VREFINT内部参考电压采样驱动该函数很可能会改为基于 VREFINT 的动态测量。5.3 分压系数与最低电压阈值由于备份电池电压可能高于 ADC 参考电压STM32 内部通常对 VBAT 通道做了分压。VBAT_ADC_SCALE就是数据手册规定的分压比例还原系数不同 CPU 线取值不同F0 / F2 / F3 / F4405、407 等/ F7VBAT_ADC_SCALE 2G0 / G4 / L4 / L5 / WB / WLVBAT_ADC_SCALE 3F4401/410/411/412/413/427/429/446 等/ F7722 等/ H7 / U5VBAT_ADC_SCALE 4VBAT_ADC_MIN_MV是维持备份域供电所需的最小电压vbat_is_empty()正是基于它与采样值的比较bool vbat_is_empty(void) { return VBAT_ADC_MIN_MV vbat_sample_mv(); }各 CPU 线的最低电压阈值在 cpu/stm32/periph/vbat.c 中通过CPU_LINE_*宏逐系列定义例如CPU 系列VBAT_ADC_MIN_MVF0 / F3 / F4 / F7 / U51650F21800G0 / G4 / L4 / L5 / WB / WL1550H7H723 / H7531360如果目标 CPU 线不在支持列表中编译会触发#error VBAT: CPU line is not supported so far.这保证了未验证平台不误报数据。5.4 使能与寄存器差异VBAT 采样通道需要通过 ADC 公共控制寄存器的使能位打开。不同系列寄存器命名差异较大cpu/stm32/periph/vbat.c 通过条件编译逐一适配使能位ADC_CCR_VBATEN/ADC_CCR_VBATE/ADC_CCR_VBATSEL/SYSCFG_CFGR1_VBAT映射为统一的VBAT_ENABLE寄存器ADC_COMMON-CCR/ADC12_COMMON-CCR/ADC123_COMMON-CCR/SYSCFG-CFGR1等映射为统一的ADC_CCR_REGSTM32H7 比较特殊VBAT 由ADC3_COMMON-CCR控制注释明确说明H7 uses ADC3 for VBAT。对应地vbat_enable()/vbat_disable()在 cpu/stm32/include/periph/cpu_vbat.h 中声明供平台内部按需开关采样通道。六、配置项与板级接线6.1 Kconfig 配置项启用periph_vbat后可配置项定义在 drivers/periph_common/Kconfig.vbatmenu PERIPH_VBAT backup battery monitoring peripheral driver depends on USEMODULE_PERIPH_VBAT config VBAT_ADC_VREF_MV int ADC reference voltage in mV default 3300 help This is the reference voltage (VREF) of the ADC. Often VREF is connected with VDDA, which is equal to VDD. endmenu # PERIPH_VBAT backup battery monitoring peripheral driverVBAT_ADC_VREF_MV即上文vref_mv()默认返回的 ADC 参考电压默认 3300 mV。若板卡上 VREF 并非 3.3 V可通过 Kconfig 或编译期宏覆盖该值否则采样结果会存在系统性偏差。该配置的默认值在 cpu/stm32/periph/vbat.c 中也以#ifndef CONFIG_VBAT_ADC_VREF_MV的形式兜底定义。6.2 板级 VBAT 通道声明驱动头部drivers/include/periph/vbat.h明确了板卡启用该特性的方式支持通过 ADC 进行备份电池监测的板卡必须在 periph_conf.h 中定义#define VBAT_ADC ADC_LINE(x)其中 x 是内部 VBAT ADC 通道在adc_config[]数组中的索引。以默认板 NUCLEO-F767ZI 为例boards/nucleo-f767zi/include/periph_conf.h 中可以看到{GPIO_UNDEF, 0, 18}, /* VBAT */ ... #define VBAT_ADC ADC_LINE(6) /** VBAT ADC line */即adc_config[]中索引 6 的条目是内部 VBAT 通道GPIO 引脚为GPIO_UNDEF因为是芯片内部通道VBAT_ADC指向它。你可以在相同文件中查到该板卡 ADC 配置的完整上下文periph_conf.h第 192 行附近注释了 Arduino 头 A0-A5 与内部 VBAT 通道的对应关系。6.3 硬件注意事项备份电池跨接在VBAT 与 GND之间大多数开发板上VDD 与 VBAT 默认由焊桥短接必须移除该焊桥才能让备份电池真正接管供电电池的用途是VDD 断电期间维持备份域寄存器和 RTC 内容不丢失因此该测试的电压读数直接反映了 RTC 掉电保持能力是否可靠若读数低于对应 CPU 线的VBAT_ADC_MIN_MV说明电池已不足以维持备份域vbat_is_empty()将返回true。七、总结与扩展建议tests/periph/vbat是一个小而完整的 RIOT 外设驱动测试范例应用层每秒钟通过vbat_sample_mv()采样备份电池电压并打印底层由 CPU 特性驱动periph/vbat完成 ADC 通道配置、寄存器使能与分压换算板级通过periph_conf.h中的VBAT_ADC声明通道构建系统则用FEATURES_REQUIRED periph_vbat保证平台兼容性。基于此测试你可以进一步做三件事在你的板卡上启用 VBAT 监测修改板级periph_conf.h在adc_config[]中加入内部 VBAT 通道并定义VBAT_ADC即可复用该测试验证接线与读数扩展为低电量告警应用使用驱动接口中的vbat_is_empty()在备份电池电压低于阈值时触发告警或日志记录适用于需要长期 RTC 保持的物联网节点校准参考电压若板卡 ADC 参考电压与 3.3 V 有偏差通过 Kconfig 的VBAT_ADC_VREF_MV调整或重写vref_mv()弱符号获取更精确的 VREF 值。该测试应用连同 periph/vbat 驱动文档 与 STM32 平台实现共同构成了一条从串口打印毫伏读数到ADC 寄存器位操作的完整学习链路。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐Apache OFBiz核心功能解析会计、制造与订单管理模块全攻略Apache OFBiz核心功能解析会计、制造与订单管理模块全攻略 Apache OFBiz是一款强大的开源企业资源规划ERP系统集成了会计、制造和订单物联网嵌入式操作系统实时系统ESP32-P4 备用电池VBAT供电方案详解RTC 掉电保持、PMU 电源切换与欠压检测实战ESP32 P4 备用电池VBAT供电方案详解RTC 掉电保持、PMU 电源切换与欠压检测实战 ESP32 P4 芯片内部集成了 RTC实时时钟功能物联网嵌入式驱动开发硬件开发RIOT OS 中 Particle Argon 开发板支持详解nRF52840 网络调试、烧录与电池电压测量RIOT OS 中 Particle Argon 开发板支持详解nRF52840 网络调试、烧录与电池电压测量 Particle Argon 是 Partic物联网嵌入式操作系统实时系统上一篇Android File Transfer for Linux FUSE挂载教程像本地磁盘一样访问安卓设备下一篇Spinning Up企业案例PPO优化生产调度终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

一条命令备份QQ空间全部说说:历史说说导出完整教程(GetQzonehistory)

一条命令备份QQ空间全部说说:历史说说导出完整教程(GetQzonehistory)

一条命令备份QQ空间全部说说:历史说说导出完整教程(GetQzonehistory) 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 是一款免费的本…

2026/9/21 23:39:57 阅读更多 →
飞算JavaAI 全栈实测,做“有借”设备借还系统:从五步引导到本地回归的实测记录

飞算JavaAI 全栈实测,做“有借”设备借还系统:从五步引导到本地回归的实测记录

我先拿设备借还这个小场景举例。它看起来不复杂,却特别容易把全栈项目里藏着的问题翻出来:设备明明显示已借出,借还记录却没有借用人;归还按钮提示成功,刷新后设备还是不能再借。只看一张列表页看不出这些问题&#xf…

2026/9/21 16:44:23 阅读更多 →
用BrewUI可视化管理Homebrew:告别命令行依赖地狱

用BrewUI可视化管理Homebrew:告别命令行依赖地狱

先说结论:如果你现在还在一行一行敲Homebrew命令行,或者正在搜索引擎里翻“Intel Mac安装不了Homebrew了”这类报错方案,我建议你花十分钟把BrewUI装起来。它不是来替代终端的,而是把Homebrew背后那些“看不见”的包、依赖、残留&…

2026/9/20 13:44:28 阅读更多 →

最新新闻

MATLAB晶粒生长模拟:蒙特卡洛Potts模型实现与应用

MATLAB晶粒生长模拟:蒙特卡洛Potts模型实现与应用

1. 项目背景与核心价值在材料科学研究领域,晶粒组织的演化过程直接影响着金属、陶瓷等材料的力学性能和物理特性。传统实验方法需要耗费大量时间和资源进行金相制备、热处理和显微观察,而计算机模拟技术为研究者提供了一种高效、低成本的替代方案。这个M…

2026/9/22 0:07:44 阅读更多 →
5年大厂面试官揭秘:奇拿面试题新手避坑指南

5年大厂面试官揭秘:奇拿面试题新手避坑指南

5年大厂面试官揭秘:奇拿面试题新手避坑指南 官方文档翻了三遍还是像看天书?别慌,这就是典型的【奇拿】场景。很多【新手避坑】指南只讲理论,却忽略了大厂面试官真正想听的那句人话。今天我就把底裤都扒了,带你用最短时间抓住【奇拿】考点的核心,让你下…

2026/9/22 0:07:44 阅读更多 →
qq恢复网站入门到精通:3步避坑,选型不踩雷

qq恢复网站入门到精通:3步避坑,选型不踩雷

qq恢复网站入门到精通:3步避坑,选型不踩雷 官方文档翻了三遍还是晕?别急,谁第一次看QQ找回账号的后台逻辑不是这样。官方流程太冗长,关键节点藏得深,导致你卡在“验证方式”和“数据同步”上,根本抓不住重点。今天咱们不念经,直接拆解从0到1搭…

2026/9/22 0:07:44 阅读更多 →
Excel VBA中Range.Value数组特性解析与应用

Excel VBA中Range.Value数组特性解析与应用

1. 深入理解VBA中Range.Value返回的数组特性在Excel VBA开发中,Range对象的Value属性是最基础也是最常用的功能之一。但许多开发者(包括我在早期)都曾在这个看似简单的操作上栽过跟头。今天我们就来彻底剖析这个日常操作背后的机制。关键发现…

2026/9/22 0:07:44 阅读更多 →
3个坑解决版本升级API全变:手写实现如何打广告核心逻辑

3个坑解决版本升级API全变:手写实现如何打广告核心逻辑

3个坑解决版本升级API全变:手写实现如何打广告核心逻辑 版本升级后 API 全变了,你写的代码直接报 AttributeError ,是不是瞬间血压飙升?别慌,这种时候硬啃新文档不如 手写实现 底层逻辑来得快。…

2026/9/22 0:07:44 阅读更多 →
ISO9001体系高频面试题:3年实战避坑指南与代码级解析

ISO9001体系高频面试题:3年实战避坑指南与代码级解析

ISO9001体系高频面试题:3年实战避坑指南与代码级解析 昨天刚带一个新人做审计,他手里拿着从网上复制的《质量手册》草稿,问我在“4.1…

2026/9/22 0:06:44 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →