当前位置: 首页 > news >正文

stm32入门学习14-电源控制

有时候我们的程序中有些触发执行条件,有时这些触发频率很少,我们的程序就一直在循环,这样就很浪费电,我们可以通过PWR电源控制来实现低功耗模式,即只有在触发时才执行程序,其余时间可以关闭一些没必要的设备以达到省电的目的

低功耗模式有三种,分别为睡眠模式、停机模式和待机模式,他们的电量损耗:睡眠模式>停机模式>待机模式,但是他们的唤醒条件则和电量损耗成相反的关系。睡眠模式唤醒比较简单,内部中断和外部中断都可以唤醒睡眠模式;停机模式次之,只有外部中断才可以唤醒停机模式,待机模式唤醒方式最难,只有指定的几个中断事件才可以唤醒

(一)睡眠模式

睡眠的开启十分简单,只需要在程序的最后加一句代码即可,这里的中断使用外部中断,外部中断的配置主要有这几步:时钟、时钟通道、EXTI、NVIC

void key_init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef gpio_init;gpio_init.GPIO_Mode = GPIO_Mode_IPU;gpio_init.GPIO_Pin = GPIO_Pin_6;gpio_init.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &gpio_init);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);EXTI_InitTypeDef exti_init;exti_init.EXTI_Line = EXTI_Line6;exti_init.EXTI_Mode = EXTI_Mode_Interrupt;exti_init.EXTI_Trigger = EXTI_Trigger_Rising;exti_init.EXTI_LineCmd = ENABLE;EXTI_Init(&exti_init);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_init;nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn;nvic_init.NVIC_IRQChannelPreemptionPriority = 1;nvic_init.NVIC_IRQChannelSubPriority = 1;nvic_init.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_init);
}

我们只要在程序要进入睡眠模式的地方加入一句__WFI即可进入睡眠模式,当睡眠模式被唤醒后,将从进入睡眠模式的地方继续执行代码

int main()
{key_init();OLED_Init();while(1){if (flag == 1){OLED_ShowString(1, 1, "key_down");Delay_ms(500);OLED_Clear();flag = 0;}__WFI();}return 0;
}

这里的现象是我们按下按键产生上升沿外部触发,OLED屏幕上会显示key_down,然后进入睡眠模式,等待下一次触发

睡眠模式不仅可以用外部中断触发,也可以用内部中断触发

(二)停机模式

停机模式开启比睡眠模式稍微复杂,由于停机模式只能被外部中断或事件唤醒,因此还是采用按键唤醒操作,进入停机模式前要先开启电源管理的时钟,接着在要进入停机模式的地方调用进入睡眠模式的代码即可

第一个参数是配置调节器在停止模式的工作状态,第二个参数是配置停止模式的唤醒方式

int main()
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);OLED_Init();external_interrupt_init();while (1){if (flag == 1){OLED_ShowString(1, 1, "button_down");Delay_ms(500);OLED_Clear();flag = 0;}PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);SystemInit();}return 0;
}

值得注意的是,停机模式会把72MHz的时钟晶振给关闭,而在唤醒停机模式后却不会自动打开,如果我们没有手动打开,则程序以HSI的8MHz的时钟运行,这会导致程序的运行速度不符合我们的预期,尤其是在显示时长方面能明显感觉到显示时间变长,由于停机模式被唤醒后也是在进入停机模式的地方重新开始执行代码,我们只要在进入停机模式的代码后面加入系统初始化函数即自动帮助我们初始化系统时钟;

(三)待机模式

待机模式只能被指定的几个事件唤醒,待机模式和停机模式一样,只要调用pwr模块的一个函数即可进入,当然事先要先使能其时钟

这里选择使用RTC闹钟唤醒,我们从当前时间开始,每隔1小时唤醒一次,然后显示1分钟唤醒时候的时间,然后进入待机模式

int main()
{SystemInit();unsigned int t;struct tm* time;clock_bkp_init();clock_init();OLED_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);while (1){t = RTC_GetCounter();time = clock_read_time();RTC_SetAlarm(t+60*60);OLED_ShowString(1, 1, "XXXX-XX-XX");OLED_ShowString(2, 1, "xx:xx:xx");OLED_ShowNum(1, 1, time->tm_year, 4);OLED_ShowNum(1, 6, time->tm_mon, 2);OLED_ShowNum(1, 9, time->tm_yday, 2);OLED_ShowNum(2, 1, time->tm_hour, 2);OLED_ShowNum(2, 4, time->tm_min, 2);OLED_ShowNum(2, 7, time->tm_sec, 2);Delay_s(60);OLED_Clear();PWR_EnterSTANDBYMode();}
}

这里在唤醒待机模式后,其时钟不是72MHz时钟,我们要手动调用系统初始化函数来调节,但是这里的系统初始化函数不能放在待机模式后面调用,因为待机模式在被唤醒后是从程序开始的地方执行(相当于按了一次复位键),所以我们把系统初始化函数放在程序开头;

(四)总结

通过多种stm32的低功耗模式学习,我们了解了stm32多种低功耗模式的使用以及之间的区别,通过进入低功耗模式,可以让一些在长时间处于空循环的程序更加省电

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue2中使用i18n配置elementUi切换语言
  • 数学基础 -- 卷积与矩阵乘法的区别
  • 基于R语言遥感随机森林建模与空间预测;遥感数据处理与特征提取;数据分析与可视化
  • 央企数据架构师徐智确认出席「第六届数据智能高峰论坛」
  • 容器化部署ES集群
  • 得到任务式 大模型应用开发学习方案
  • 【ARM CoreLink 系列 5.5 -- CI-700 Debug trace and PMU 】
  • Elasticsearch Nested类型详解与实战
  • 中小企业文档管理最佳方案:7个热门工具
  • 漏洞复现-K26-1开源-证书查询系统-任意文件读取
  • 【Linux】多线程7——线程池
  • css如何使一个盒子水平垂直居中
  • 「项目分享」软件测试简历中项目怎么写?从候选人中脱颖而出,offer拿到手软
  • Linux~数据库账户和权限管理
  • 欧科云链研究院对话:风浪越大鱼越贵—链上数据洞悉加密市场规律
  • 【翻译】babel对TC39装饰器草案的实现
  • const let
  • GitUp, 你不可错过的秀外慧中的git工具
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript设计模式之工厂模式
  • Linux后台研发超实用命令总结
  • node 版本过低
  • PAT A1092
  • SSH 免密登录
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • webpack4 一点通
  • 从零开始的无人驾驶 1
  • 精彩代码 vue.js
  • 离散点最小(凸)包围边界查找
  • 巧用 TypeScript (一)
  • 深入浅出webpack学习(1)--核心概念
  • 跳前端坑前,先看看这个!!
  • 一个SAP顾问在美国的这些年
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #### go map 底层结构 ####
  • #图像处理
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (145)光线追踪距离场柔和阴影
  • (BFS)hdoj2377-Bus Pass
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (四)js前端开发中设计模式之工厂方法模式
  • (万字长文)Spring的核心知识尽揽其中
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)EXC_BREAKPOINT僵尸错误
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .dwp和.webpart的区别
  • .NET 5种线程安全集合
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NET学习全景图
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net专家(张羿专栏)