嵌入式(八)电源低功耗管理 | 五种运行模式 模式转换 睡眠定时器唤醒

本文主要是介绍嵌入式(八)电源低功耗管理 | 五种运行模式 模式转换 睡眠定时器唤醒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 低功耗基本介绍
    • 1.1 五种运行模式
  • 2 低功耗控制相关寄存器
  • 3 睡眠唤醒实现方式
    • 3.1 系统睡眠+定时器唤醒

1 低功耗基本介绍

对于嵌入式系统而言,一个非常重要的内容就是低功耗,尽可能减少电量损耗,然后获得更多的续航时间

当然功耗越低,被关闭的功能也就越多

1.1 五种运行模式

CC2530有5种不同的运行模式(供电模式):

分别为主动模式、空闲模式、PM1、PM2 和PM3。

越靠后,被关闭的功能越多,功耗也越低,PM3具有最低的功耗。

在这里插入图片描述

运行的影响如表8.1所示,其中还给出了稳压器和振荡器选择。

主动模式是一般模式。主动模式:完全功能模式。稳压器的数字内核开启,16MHz RC振荡

器或32MHz晶体振荡器运行,或者两者都运行。32kHz RCOSC振荡器或32kHz XOSC运行。

空闲模式:除CPU 内核停止运行(即空闲外),其他功能和主动模式一样。

PM1:高频晶振(16MHz或32MHz)关闭,低频晶振(32.768kHzRCOSC/XOSC)工作,数字核心模块正常工作。

PM2:低频晶振(32.768KHz RCOSC/XOSC )工作, 数字核心模块关闭,系统通过 RESET,外部中断或睡眠计数器溢出唤醒。

PM3:晶振全部关闭,数字核心模块关闭,系统只能通过 RESET 或外部中断唤醒。

2 低功耗控制相关寄存器

睡眠模式控制寄存器SLEEPCMD

​ 可以设置我们刚刚讲到的那五种睡眠模式

供电模式控制寄存器PCON

​ 设置睡眠模式之后,还要设置供电模式

睡眠计数器STx,

​ 通过设置STx可以设置睡眠的时间长短

读睡眠定时器读的流程为:读ST0→读ST1→读ST2。

3 睡眠唤醒实现方式

从PM1和PM2唤醒可以通过三种方式:复位、外部中断和睡眠定时器,

从PM3唤醒可以通过两种方式:复位和外部中断。

对于复位方式,进行系统的复位,即RESET来唤醒即可,不涉及到编程。

所以编程主要涉及到外部中断和睡眠定时器唤醒

对于睡眠定时器方式,涉及到ST2、ST1和ST0寄存器。首先从这三个寄存器中读取到当前定时器的计数值,接着对该计数值进行修改(表示睡眠的时长),最后将该修改后的计数值写入到三个寄存器中,使定时器能够进行比较。对于该种方式,首先要明白,寄存器和定时器是两个独立的东西,当不读ST2、ST1和ST0寄存器时,其中始终保存一个比较值,当定时器值与寄存器值相等时发生中断,而定时器的值会在正边沿时进行一次更新。当读ST2、ST1和ST0寄存器时,会自动获取24位定时器的值

对于外部中断模式,需要根据选择的外部中断方式编写中断函数,在中断函数中,对标志位进行清零,最后将模式设置为主动模式即可。

3.1 系统睡眠+定时器唤醒

//初始化休眠定时器,设定后经过指定时间自行唤醒程序如下:
void InitSleepTimer(void)
{ST2 = 0X00;ST1 = 0X0F;ST0 = 0X0F;EA = 1; //开中断STIE = 1; //睡眠定时器中断使能0:中断禁止 1:中断使能STIF = 0; //睡眠定时器中断标志 0:无中断未决 1: 中断未决
}//设置系统工作模式程序如下。
void SysPowerMode(uchar mode)
{
if(mode < 4)
{SLEEPCMD |= mode; //设置系统睡眠模式PCON = 0x01; //进入睡眠模式 ,通过中断唤醒
}
elsePCON = 0x00; //通过中断唤醒系统
}//设置睡眠时间
void Set_ST_Period(uint sec)
{ulong sleepTimer = 0;sleepTimer |= (ulong)ST1 << 8;sleepTimer |= (ulong)ST2 << 16;sleepTimer += ((ulong)sec * (ulong)32768);ST2 = (uchar)(sleepTimer >> 16);ST1 = (uchar)(sleepTimer >> 8);ST0 = (uchar) sleepTimer;
}

这篇关于嵌入式(八)电源低功耗管理 | 五种运行模式 模式转换 睡眠定时器唤醒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手