RTT潘多拉开发板上实现电源管理

简介

随着物联网(IoT)的兴起,产品对功耗的需求越来越强烈。作为数据采集的传感器节点通常需要在电池供电时长期工作,而作为联网的SOC也需要有快速的响应功能和较低的功耗。

在产品开发的起始阶段,首先考虑是尽快完成产品的功能开发。在产品功能逐步完善之后,就需要加入电源管理功能。为了适应IoT的这种需求,RT-Thread提供了电源管理框架。电源管理框架的理念是尽量透明,使得产品加入低功耗功能更加轻松。

本文的示例都是在潘多拉开发板下运行。
潘多拉开发板是RTT和正点原子联合推出的硬件平台,该平台上专门为IoT领域设计,并提供了丰富的例程和文档。

MCU通常提供了多种时钟源供用户选择。
例如潘多拉开发板上板载的STM32L475就可以选择LSI/MSI/HSI等内部时钟,还可以选择HSE/LSE等外部时钟。
MCU内通常也集成了PLL(Phase-lock loops),基于不同的时钟源,向MCU的其它模块提供更高频率的时钟。

为了支持低功耗功能,MCU里也会提供不同的休眠模式。
例如STM32L475里,可以分成SLEEP模式、STOP模式、STANDBY模式。

定时应用

在定时应用里,我们创建了一个周期性的软件定时器,定时器任务里周期性输出当前的OS Tick。
如果创建软件定时器成功之后,使用rt_pm_request(PM_SLEEP_MODE_DEEP)请求深度睡眠模式。

按键唤醒应用

在按键唤醒应用里,我们使用wakeup按键来唤醒处于休眠模式的MCU。
一般情况下,在MCU处于比较深度的休眠模式,只能通过特定的方式唤醒。

#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>#ifdef RT_USING_PM#define WAKEUP_EVENT_BUTTON                 (1 << 0)
#define PIN_LED_R                           GET_PIN(E, 7)
#define WAKEUP_PIN                          GET_PIN(C, 13)
#define WAKEUP_APP_THREAD_STACK_SIZE        1024static rt_event_t wakeup_event;static void wakeup_callback(void *args)
{rt_event_send(wakeup_event, WAKEUP_EVENT_BUTTON);
}static void wakeup_init(void)
{rt_pin_mode(WAKEUP_PIN, PIN_MODE_INPUT_PULLUP);rt_pin_attach_irq(WAKEUP_PIN, PIN_IRQ_MODE_FALLING, wakeup_callback, RT_NULL);rt_pin_irq_enable(WAKEUP_PIN, 1);
}static void wakeup_app_entry(void *parameter)
{wakeup_init();rt_pm_request(PM_SLEEP_MODE_DEEP);while (1){if (rt_event_recv(wakeup_event,WAKEUP_EVENT_BUTTON,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER, RT_NULL) == RT_EOK){rt_pm_request(PM_SLEEP_MODE_NONE);rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);rt_pin_write(PIN_LED_R, 0);rt_thread_delay(rt_tick_from_millisecond(500));rt_pin_write(PIN_LED_R, 1);rt_pm_release(PM_SLEEP_MODE_NONE);}}
}static int wakeup_app(void)
{rt_thread_t tid;wakeup_event = rt_event_create("wakup", RT_IPC_FLAG_PRIO);RT_ASSERT(wakeup_event != RT_NULL);tid = rt_thread_create("wakeup_app", wakeup_app_entry, RT_NULL,WAKEUP_APP_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);RT_ASSERT(tid != RT_NULL);rt_thread_startup(tid);return 0;
}
INIT_APP_EXPORT(wakeup_app);#endif

线程里注册了按键中断回调函数,接着请求深度睡眠模式,当唤醒中断之后就会触发回调。回调函数里会发送时间。
线程在接收事件之后,完成LED闪烁功能后,再去释放None。

STM32L4的低功耗模式简介

STM32L476是ST公司推出的一款超低功耗的Cortex-M4内核的MCU,支持多个电源管理模式,其中最低功耗shutdown模式下,待机电流仅30nA。

ST公司把L476的电源管理分为很多种,但各个模式并非功耗逐级递减的特点,下面是各个模式之间的状态转换图:
在这里插入图片描述
仅管L476的低功耗模式很多,但本质上并不复杂,理解它的原理有助于我们移植驱动,同时更好的在产品中选择合适的模式。

最终决定STM32L476系统功耗的主要是三个因素:稳压器(voltage regulator)、CPU工作频率、芯片自身低功耗的处理,下面分别对三个因素进行阐述。

稳压器

L4使用两个嵌入式线性稳压器为所有数字电路、待机电路以及备份时钟域供电,分别是主稳压器(main regulator,MR)和低功耗稳压器(low power regulator,简称LPR)。

稳压器在复位后处于使能状态,根据应用模式,选择不同的稳压器对Vcore域供电。
其中,MR的输出电压可以由软件配置为不同的范围(Range1 和 Range2)。

在这里插入图片描述

CPU工作频率

通过降低CPU的主频达到降低功耗的目的:MR工作中Range1正常模式时,SYSCLK最高可以工作在80M;MR工作在Range 2时,SYSCLK最高不能超过26M。
低功耗运行模式和低功耗休眠模式,即Vcore域由LPR供电,SYSCLK必须小于2M。

芯片本身的低功耗处理

芯片本身定义了一系列的休眠模式,如Sleep、Stop、Standby和Shutdown,前面的四种模式功耗逐渐降低,实质是芯片内部通过关闭外设和时钟来实现。

移植具体实现

RTT低功耗管理系统从设计上分离运行模式和休眠模式,独立管理,运行模式用于变频和变电压,休眠调用芯片的休眠特性。
对于多数芯片和开发来说,可能并不需要考虑变频和变电压,仅需关注休眠模式

STM32 L4系列的芯片有运行模式和低功耗运行模式的概念,同时MR还有Range 2模式,可用于变频场景。

PM组件的底层功能都是通过struct rt_pm_ops结构体里的函数完成:

/*** low power mode operations*/
struct rt_pm_ops
{void (*sleep)(struct rt_pm *pm, uint8_t mode);void (*run)(struct rt_pm *pm, uint8_t mode);void (*timer_start)(struct rt_pm *pm, rt_uint32_t timeout);void (*timer_stop)(struct rt_pm *pm);rt_tick_t (*timer_get_tick)(struct rt_pm *pm);
};

移植休眠模式

移植休眠模式仅需关注sleep接口,根据PM用户手册相关介绍,首先将RTT的休眠模式和STM32的模式做一个转换:

  • NONE——Run:正常运行模式,不进行任何降功耗的措施
  • IDLE——Run:正常运行模式,可选择WFI(等待中断唤醒)和WFE(等待事件唤醒),此处暂不处理
  • LIGHT——Sleep:轻度睡眠模式,执行ST的Sleep模式
  • PM_SLEEP_MODE_DEEP——Stop2:深度睡眠模式,执行ST的Stop2模式
  • STANDBY——Standby:待机模式,执行ST的Standby模式
  • SHUTDOWN——Shutdown:停止模式,执行ST的Shutdown模式
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>static void sleep(struct rt_pm *pm,uint8_t mode)
{}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数仓开发中期:理论巩固

一、数仓以及商业智能&#xff08;Data Warehousing and Business Intelligence, DW/BI&#xff09;系统 1.1数据操作和数据获取的区别 对所有组织来说&#xff0c;信息都是其最重要的财富之一。信息几乎总是用作两个目的:操作型记录的保存和分析型决策的制定。简单来说&…

Stack数据结构设计模板

第三章 栈、队列、数组 1.栈 1.1 顺序栈 #define MaxSize 20 typedef int ElemType; //顺序栈的定义 typedef struct {ElemType data[MaxSize];int top; }SqStack; // 初始化顺序栈 void InitSqStack(SqStack &S){S.top -1; }; // 入栈(增) bool Push(SqStack &S,El…

WIFI模块UDP电脑端调试

一&#xff0c;两端都是电脑端 1&#xff0c;电脑本机的IP地址 192.168.137.1 2&#xff0c;新建两个不同的连接&#xff0c;注意端口 二&#xff0c;WIFI 模块和电脑端连接 1&#xff0c;设置模块端目标IP和端口&#xff0c;电脑端只接收数据的话&#xff0c;IP、端口可随…

【从零开始学架构 架构基础】架构设计的本质、历史背景和目的

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;主要理解架构的设计的本质定义、历史背景以及目的。 架构设计的本质 分别从三组概念的区别来理解架构设计。 系统与子系统 什么是系统&#xff0c;系统泛指由一群有关联的个体组成&#xff0c;根据某种规则运作&#…

企业终端安全管理软件有哪些?终端安全管理软件哪个好?

终端安全的重要性大家众所周知&#xff0c;关系到生死存亡的东西。 各类终端安全管理软件应运而生&#xff0c;为企业提供全方位、多层次的终端防护。 有哪些企业终端安全管理软件&#xff1f; 一、主流企业终端安全管理软件 1. 域智盾 域智盾是一款专为企业打造的全面终端…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题&#xff0c;会直接影响到企业的日常运作&#xff0c;甚至直接关系到企业能不能继续存活&#xff0c;因此现金流量表是企业财务分析中重要报表之一&#xff0c;也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

[Linux] GDB使用指南----包含CentOS7下安装以及使用

什么是GDB&#xff1f; GDB 是由 GUN 软件系统社区提供的调试工具&#xff0c;同 GCC 配套组成了一套完整的开发环境&#xff0c;GDB 是 Linux 和许多 类Unix系统的标准开发环境。可以用来调试C、C、Go、java、 objective-c、PHP等语言。 GDB的作用 程序启动时&#xff0c;可…

73. 矩阵置零/54. 螺旋矩阵

73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 思路&#x…

小程序搜索排名优化 三步操作提升

搜索排名优化最直接的一个目的就是为了提升小程序的排名和流量&#xff0c;获取用户的信任度。当用户在搜索关键词的时候&#xff0c;能让用户看到小程序&#xff0c;增加被发现和点击的机会。 一、关键词优化&#xff1a; 1.选择合适的关键词&#xff1a;选择与小程序内容高…

代码训练LeetCode(17)存在重复元素

代码训练(17)LeetCode之存在重复元素 Author: Once Day Date: 2024年5月7日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 219. 存在重复元素 II - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全球…

fero - yolo - mamba:基于选择性状态空间的面部表情检测与分类

fero - yolo - mamba:基于选择性状态空间的面部表情检测与分类 摘要IntroductionRelated work FER-YOLO-Mamba: Facial Expression Detection and Classification Based on Selective State Space 摘要 面部表情识别&#xff08;FER&#xff09;在理解人类情绪线索方面起着关键…

零资源跑大模型:Hugging Face API + LiteLLM + Flask

前言 HuggingFace 是自然语言处理领域的开源软件库和平台&#xff0c;其收纳了众多最前沿的模型和数据集&#xff0c;并提供了 Serverless Inference API&#xff0c;用户可以轻松调用这些模型&#xff0c;甚至用于运行自己的私人模型。本教程将指导用户如何利用 Hugging Face…

RabbitMQ之消费者并发消费

为什么要引入消费者的并发消费&#xff1f; 当生产者的推送速度是远远超过消费者的能力的&#xff0c;可以提高消费者的消费速度。比如在java中我们可以启动多个 JVM 进程&#xff0c;实现多进程的并发消费&#xff0c;从而加速消费的速度&#xff0c;在mq中也可以通过设置配置…

鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽

进程间为何要通讯 ? 鸿蒙内核默认支持 64个进程和128个任务&#xff0c;由进程池和任务池统一管理.内核设计尽量不去打扰它们&#xff0c;让各自过好各自的日子&#xff0c; 但大家毕竟在一口锅里吃饭&#xff0c; 不可能不与外界联系&#xff0c; 联系就得有渠道&#xff0c…

Go微服务精讲:Go-Zero全流程实战即时通讯(超清)

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性&#xff0c;经受了充分的实战检验。 Go微服务精讲&#xff1a;Go-Zero全流程实战即时通讯(超清) go-zero 中的 api&#xff0c;rpc&#xff0c;数据库等涉及的代码&#xff0c;…

C#标签设计打印软件开发

1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name"Pixel">多少像素…

Springboot 集成 Consul 实现服务注册中心-05

因为后续很多模块都要用到注册中心&#xff0c;所以此处先实现此模块。 Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的&#xff01;) …

优立科技:从数字孪生到元宇宙

2021年10月&#xff0c;Facebook致力于发展元宇宙&#xff0c;并更名为Meta。加上此前Roblox上市的消息&#xff0c;让「元宇宙」一词迅速在2021年爆火&#xff0c;刺激了VR、游戏等相关产业的发展&#xff0c;甚至有人宣称2021年为「元宇宙『元年』」。然而&#xff0c;「元年…

YOLOv8的训练、验证、预测及导出[目标检测实践篇]

这一部分内容主要介绍如何使用YOLOv8训练自己的数据集&#xff0c;并进行验证、预测及导出&#xff0c;采用代码和指令的两种方式&#xff0c;参考自官方文档&#xff1a;Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理&#xff0c;只需要把流程跑通就行&#xff0c;…