【应用笔记】使用 CW32 实现电池备份(VBAT)功能

news/2024/11/23 9:40:41/

前言 

电池备份(VBAT)功能的实现方法,一般是使用 MCU 自带的 VBAT 引脚,通过在该引脚连接钮扣电池,当系统电源因故掉电时,保持 MCU 内部备份寄存器内容和 RTC 时间信息不会丢失。 

本文档介绍了如何基于 CW32 系列 MCU,通过增加简单的外部电路配合软件实现 VBAT 功能,在系统电源掉 电后仍能保持 RTC 时钟正常计时,以及如何降低系统功耗,从而延长后备电池的使用寿命。

1

电路设计 

对于自带 VBAT 引脚的 MCU,MCU 内部有对 VBAT 电源和系统电源的管理单元,保证在系统电源掉电后,及 时切换 VBAT 引脚电源给备份域供电,保证 RTC 正常工作。 

对于没有 VBAT引脚的 CW32,要实现类似的功能,可以在外部进行后备带电池和系统电源的切换,如下图所示:

图片

后备电池(B1)提供的备用电源 VBAT 和系统电源 VDDIN 通过 2 个肖特基二极管(D1)合路,合路后的 电源 VDD 给 MCU 的数字域 DVCC 和模拟域 AVCC 进行供电。系统电源 VDDIN 通过 R3、R4 电阻分压得到 WAKEIO 信号,连接到 MCU 的 IO 引脚。注意遵循如下规则:

 1. Vwakeio 要大于 MCU IO 口的 Vih;

 2. VDDIN 必须高于 Vb1 在 0.4V 以上,否则如果 VDDIN 和 Vb1 相等,在系统电源正常时,后备电池也会有一定 的泄放电流,不利于节省后备电池电量。

2

程序设计 

程序启动后正常初始化时钟、IO、RTC 以及 OELD,循环中检测系统电源是否存在,如存在则读取 RTC 时间 并显示。 

当系统电源 VDDIN 因故掉电,则关闭 OLED 电源,并进入 DeepSleep 低功耗睡眠模式。 

当系统电源 VDDIN 恢复供电时,产生高电平中断,唤醒 MCU,退出 DeepSleep 低功耗睡眠模式。

3

参考代码

int32_t main(void){RCC_Configuration();     // 时钟配置GPIO_Configuration();     //GPIO配置OLED_Init();          //OLED显示屏初始化配置dis_err("RTC_TestBoard");   // 显示FirmwareDelay(5000000);   // 增加延时防止过早休眠影响程序烧写RTC_init();          //RTC时钟初始化//DeepSleep 唤醒时,保持原系统时钟来源RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS);ShowTime();       // 获取时间数据displaydatetime();    // 显示当前时间while(1){if( 0==PB05_GETVALUE() )  // 循环检测是否掉电{PA05_SETHIGH();   // 关 OLED 电源SCB->SCR = 0X04;  //DeepSleep__WFI();       //MCU 进入DeepSleep模式以节省功耗OLED_Init();     // 外部电源接入后唤醒,重新初始化 OLED}else{ShowTime();      // 获取时间数据displaydatetime();   // 显示当前时间}}}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStruct= {0};__RCC_GPIOB_CLK_ENABLE();         // 开 GPIOB 时钟GPIO_InitStruct.IT  = GPIO_IT_RISING;    // 使能上升沿中断GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;  // 输入模式GPIO_InitStruct.Pins = GPIO_PIN_5 ;    //PB05,连接 WAKEIO 网络GPIO_Init(CW_GPIOB, &GPIO_InitStruct);  // 初始化 IOGPIOB_INTFLAG_CLR(bv5);        // 清除 PB05 中断标志NVIC_EnableIRQ(GPIOB_IRQn);      // 使能 PB05 中断}

4

实际测试

使用 CW32L031C8T6 设计了用于测试后备电池功能的评估板,实物如下图所示:

图片

使用 3V 的 CR2032 钮扣电池,实测电池电压为 3.14V;VDDIN 使用可调节数字电源,设置为 3.54V,保证 VDDIN >= Vb1 + 0.4V;D1 实测合路后的电源电压为 3.21V。

图片

4.1 测试数据 

实际测试时,断开 J4 跳线接入万用表,设置万用表为电流测试档位。 

1. 关闭 VDDIN 电源输入,MCU 检测到无外电输入,关闭 OLED 显示,进入 DeepSleep 模式,实测此时 B1 电流为 +0.95μA。 

2. 打开 VDDIN电源输入,MCU被高电平中断从 DeepSleep状态唤醒到正常状态,OLED正常显示当前时间, 实测此时 B1 电流为 -75nA(负电流是因为 D1 处于反向偏置状态,有小的反向漏电流)。 

测试结果符合电路设计预期,以 CR2032 电池容量为 200mAH 计算,则电池可用时间为 210526 小时,合计 24 年(不考虑电池和产品寿命),可实现超长待机时间,完全满足各种低功耗产品对 RTC 后备电池容量需求。

5

附件 

5.1 RTC_TestBoard 单板原理图

图片

图片


http://www.ppmy.cn/news/1035585.html

相关文章

数据结构--栈和队列 3.3队列

目录 创建一个队列 入列队操作 出列队操作 销毁一个队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 与栈相反,队列是一种先进先出(First In First Out ,FIFO&#xff…

matlab使用教程(16)—图论中图的定义与修改

1.修改现有图的节点和边 此示例演示如何使用 addedge 、 rmedge 、 addnode 、 rmnode 、 findedge 、 findnode 及 subgraph 函数访问和修改 graph 或 digraph 对象中的节点和/或边。 1.1 添加节点 创建一个包含四个节点和四条边的图。s 和 t 中的对应元素用于指定每条…

sql批量刷数据

应用场景 新增了一个字段,老数据的该字段都为空,值需要从其他表里去取 解决方法 update gd_lzxx_bztjbb_zb zbset gdstatus 4,gdbjr (select a.create_byfrom (select gdid, create_by, create_timefrom gd_operation_stepwhere create_time >…

idea打jar包

目录 1、打包设置 2、打包介绍 3、开始打包 1、打包设置 先设置要打包的模块信息,即打包进去的内容。如下图所示:File --> Project Structure --> Artifacts,点击+号完成模块创建,其中有两种方式:…

TCP/IP网络江湖初探:物理层的奥秘与传承(物理层上篇-基础与本质)

〇、引言 在这个数字时代,计算机网络如同广袤的江湖,数据在其中畅游,信息传递成为了生活的常态。然而,在这个充满虚拟奇观的网络江湖中,隐藏着一个不容忽视的存在,那就是物理层,这个江湖的基石。就如同江湖中的土地一样,物理层作为计算机网络的基础,承载着数据的最初转…

机器学习基础之《分类算法(1)—sklearn转换器和估计器》

一、转换器 1、什么是转换器 之前做特征工程的步骤: (1)第一步就是实例化了一个转换器类(Transformer) (2)第二步就是调用fit_transform,进行数据的转换 2、我们把特征工程的接口称…

Java“牵手“京东商品详情页面数据获取方法,京东API实现批量商品数据抓取示例

京东商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取京东商品详情数据,您可以通过开放平台的接口或者直接访问京东商城的网页来获取商品详情信息。以下是两种常用方法的介绍: 1. 通…

对redis、redisson、springcache总结

<一> redis-缓存中间件 什么是redis redis是c语言开发的&#xff0c;一个高性能key-value键值对内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件的一种非关系型数据库。 redis数据存储在哪里 内存和磁盘中&#xff0c;但是redis的读写都在内存中&#xff0c;…