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.hqwc.cn/news/675049.html

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

相关文章

懒人网址导航源码v3.9源码及教程

懒人网址导航源码v3.9源码及教程 效果图使用方法部分源码领取源码下期更新预报 效果图 使用方法 测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44为防止调试错误&#xff0c;建议使用测试环境运行的php与mysql版本首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不…

Mybatis-Plus大批量插入数据到MySQL

MyBatis-Plus的saveBatch方法 GetMapping("/save1") public void save1() {// 数据准备List<MallOrder> orderList getMallOrderList();// mybatis-pluslong start System.currentTimeMillis();mallOrderService.saveBatch(orderList);System.out.println(&…

论文辅助笔记:Tempo之modules/lora.py

1 LoRALayer 基类 2 Linear 2.1 __init__ 2.2 reset_parameter & train 2.3 forward 3 MergeLinear 3.1__init__ enable_lora指定了哪些输出特征使用lora 3.2 reset_parameters & zero_pad & merge_AB 3.3 train & forward

LibTorch入坑记--续2

一、安装faiss 我的faiss&#xff0c;用的是曾经安装过的 pip install faiss-gpu1.7 当时搞得环境名称是pni 二、配置环境 三、例子代码 #include <faiss/IndexFlat.h> #include <faiss/Index.h> #include <faiss/VectorTransform.h> #include <faiss/…

K8S快速入门

K8S快速入门 在学习k8s的过程&#xff0c;虽然官网给出的示例教程很简单&#xff0c;但是由于网络和环境的差异&#xff0c;导致实际操作的时候踩了很多坑&#xff0c;下面记录一下自己的操作步骤&#xff0c;方便需要的人参考&#xff0c;也方便以后的自己。 参考官网的资料…

华为eNSP中型企业局域网网络规划设计(下)

→b站传送门&#xff0c;感谢大佬← →华为eNSP中型企业局域网网络规划设计&#xff08;上&#xff09;← →拓扑图传送门&#xff0c;可以自己配置着玩← 配置ospf AR3 [AR3]ospf 1 router-id 3.3.3.3 //出口默认路由 [AR3-ospf-1]default-route-advertise always #area…

W801学习笔记二十二:英语背单词学习应用——下

续上篇&#xff1a; W801学习笔记二十一&#xff1a;英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》&#xff0c;所以用户交互的逻辑和唐诗是一样的。所以&#xff0c;我们抽一个基类&a…

Day 63:单调栈 LeedCode 84.柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&a…

CMakeLists.txt语法规则:foreach 循环基本用法

一. 简介 cmake 中除了 if 条件判断之外&#xff0c;还支持循环语句&#xff0c;包括 foreach()循环、while()循环。 本文学习 CMakeLists.txt语法中的循环语句。 CMakeLists.txt语法中 有两种 循环实现方式&#xff1a;foreach循环与 while循环。 二. CMakeLists.txt语法规则…

黑马点评项目总结

登录 基于session登录 短信验证码登录 配置登录拦截器 向 Spring MVC 框架中添加拦截器&#xff0c;LoginInterceptor 是一个自定义的拦截器&#xff0c;用于拦截用户的登录请求。 excludePathPatterns这一句是设置拦截器需要放行的请求路径列表。 "/user/code", …

图片编辑工具-Gimp

一、前言 GIMP&#xff08;GNU Image Manipulation Program&#xff09;是一款免费开源的图像编辑软件&#xff0c;具有功能强大和跨平台的特性。 GIMP作为一个图像编辑器&#xff0c;它提供了广泛的图像处理功能&#xff0c;包括但不限于照片修饰、图像合成以及创建艺术作品…

渗透测试流程

一、攻击流程 信息收集阶段→漏洞分析阶段→攻击阶段→后渗透阶段 二、信息收集 1、收集内容&#xff1a; IP资源&#xff1a;真实IP获取、旁站信息收集、C段主机信息收集域名发现&#xff1a;子域名信息收集、子域名枚举发现子域名、搜索引擎发现子域名、第三方聚合服务器发…