STM32单片机-PWR电源控制和WDG看门狗

STM32单片机-PWR电源控制和WDG看门狗

  • 一、PWR简介
  • 二、低功耗模式
  • 三、修改主频&睡眠模式&停机模式&待机模式
    • 3.1 修改主频
    • 3.2 睡眠模式
    • 3.3 停机模式
    • 3.4 待机模式
  • 四、WDG简介
    • 4.1 独立看门狗原理
    • 4.2 窗口看门狗原理
    • 4.3 IWDG和WWDG对比
  • 五、独立看门狗&窗口看门狗
    • 5.1 独立看门狗
    • 5.2 窗口看门狗

一、PWR简介

  • PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器低功耗模式的功能
  • 可编程电压监测器(PVD)可以监测VDD电源电压,当VDD下降到PVD阈值以下或上升到PVD阈值以上时,PVD会触发中断,用于执行紧急关闭任务
  • 低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备的使用时间

  下图为STM32的电源框图
  从图中需要知道每个区域的供电引脚以及供电的电路

在这里插入图片描述

二、低功耗模式

  下图为低功耗模式表
  从上到下,关闭的电路越来越多,越来越省电,越来越难唤醒
  睡眠模式:调用WFIWFE进入睡眠模式。WFI:任何外设发生中断时,芯片都会立刻醒来。WFE:事件唤醒,不需要进入中断。只关闭CPU时钟,对他电路无任何操作

  关闭电路通常有关闭时钟和关闭电源两个做法,关闭时钟:所有运算和涉及时序的操作都会暂停,寄存器和存储器的数据可以维持,不会消失。关闭电源:电路直接断电,电路操作和数据会直接丢失

  停机模式待机模式:首先SLEEPDEEP= 1,之后PDDS=0-停机模式PDDS=1-待机模式LPDS=0-电压调节器开启LPDS=1-电压调节器进入低功耗,最终调用WFI或者WFE进入低功耗模式。任一外部中断(不需要时钟)外部事件唤醒停机模式WKUP上升沿RTC闹钟等唤醒待机模式。停机和待机同时关闭CPU和外设时钟内外部高速时钟停机模式不关闭电源,所以CPU和外设寄存器数据维持原状待机模式全部关闭

在这里插入图片描述

  下图为模式选择配置
  执行WFI和WFE指令后,STM32进入低功耗模式

三、修改主频&睡眠模式&停机模式&待机模式

3.1 修改主频

  在system.stm32f1ox.c文件中修改系统主频,默认72Mhz,文件是只读的,所以需要修改权限

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif

3.2 睡眠模式

  对于中断触发的代码,加入低功耗模式,不进入中断的时候,可以节省资源,有中断进来再进入中断函数
  利用串口收发函数模拟,调用__WFI();函数,程序进入睡眠模式,Running!不再闪烁,当STM接收到数据触发中断时,Runnging!闪烁一次,接着进入睡眠模式,降低功耗

uint8_t RxData;
int main(void)
{OLED_Init();Serial_Init();OLED_ShowString(1,1,"RxData:");while(1){if(Serial_GetRxFlag() == 1){RxData = Serial_GetRxData();OLED_ShowHexNum(1,8,RxData,2);}OLED_ShowString(2,1,"Running!");Delay_ms(100);OLED_ShowString(2,1,"        ");Delay_ms(100);__WFI();//开启睡眠模式(中断唤醒)}
}

3.3 停机模式

  停机模式使用外部中断唤醒,利用对射红外传感器模拟
  当外部中断不触发时,CountSensor_Get()会一直被扫描,浪费资源,可以使STM32进入低功耗模式,节省资源
  进入停机模式,需要使用PWR外设,所以需要开启APB1PWR时钟,然后调用PWR_EnterSTOPMode()函数,开启停机模式,外部中断发生时,芯片唤醒
  复位后第一次Running!闪烁很快,后面的Running!闪烁很慢,是由于第一次在是72Mhz主频,后面进入停止模式,默认时钟是8MHz

  注意按下复位按钮下载

int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1,"Count:");RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟while(1){OLED_ShowNum(1,7,CountSensor_Get(),5);OLED_ShowString(2,1,"Running:");Delay_ms(100);OLED_ShowString(2,1,"        ");Delay_ms(100);PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//开启停止模式SystemInit();//恢复主频}
}

3.4 待机模式

  待机模式唤醒需要特定的信号,使用RTC唤醒待机模式
  首先开启PWR时钟,然后调用PWR_EnterSTANDBYMode()开启待机模式。当RTC闹钟事件来临时,唤醒待机模式,唤醒一次后,程序从头开始,闹钟值会重新设置

int main(void)
{MyRTC_Init();OLED_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟OLED_ShowString(1,1,"CNT:");OLED_ShowString(2,1,"ALR:");OLED_ShowString(3,1,"ALRF:");uint32_t Alarm = RTC_GetCounter()+10;RTC_SetAlarm(Alarm);//设定闹钟值OLED_ShowNum(2,6,Alarm,10);while(1){OLED_ShowNum(1,6,RTC_GetCounter(),10);OLED_ShowNum(3,6,RTC_GetFlagStatus(RTC_FLAG_ALR),1);OLED_ShowString(4,1,"Running!");Delay_ms(100);OLED_ShowString(4,1,"        ");Delay_ms(100);PWR_EnterSTANDBYMode();//开启待机模式}
}

四、WDG简介

  • 看门狗可以监控程序的运行状态,当程序因为设计漏洞硬件故障电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
  • 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就会自动产生复位信号
  • STM32内置两个看门狗
  • 独立看门狗(IWDG):独立工作,对时间精度要求较低
  • 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

4.1 独立看门狗原理

  下图为独立看门狗框图
  与定时器类似,看门狗使用的是自减运行,自减到0后,定时器产生更新事件或者中断,看门狗是直接产生复位,定时器是产生事件后自动重装值,看门狗需要在自减到0之前手动重装,不然就会进行复位,手动重装就是喂狗
  看门狗输入时钟是低速时钟LSI40KHz,之后时钟进入8位预分频器进行预分频,最大256分频,预分频寄存器可以配置分频系数,之后每来一个时钟,12位递减计数器自减一个数,最大值是4095,自减到0后产生IWDG复位,在重装载数值写一个值,在键寄存器里写一个特定数据,控制电路进行喂狗,这时重装值就会复制到当前的计数器中,计数器就会回到重装值,重新自减运行了

在这里插入图片描述

  下面给出IWDG键寄存器

  • 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
  • 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值代替控制寄存器写入一位的功能,以降低硬件电路收到干扰的概率

在这里插入图片描述

  • 超时时间TIWDG = TLSI x PR预分频系数 x (RL(重装值)+1)
  • 其中:TLSI = 1/FLSI = 1/40K = 0.025ms

  下图为PR寄存器和分频系数的对应关系以及RL和时间关系

在这里插入图片描述

4.2 窗口看门狗原理

  下图为窗口看门狗框图
  PCLK1时钟源36MHz进入预分频器WDGTB,然后到6位递减计数器(T6是溢出标志位,溢出产生复位信号)CNT,窗口看门狗没有重装寄存器,喂狗只需要在计数器里写入数据即可
  复位信号输出部分,WDGA是窗口看门狗激活位,给1启动窗口看门狗。T6=0时表示计数器溢出,产生复位信号,计算一个最早界限的计数值写入到W6-W0中,固定不变,执行写入CR操作时,即喂狗时的CNT计数值 > 窗口值,比较结果为1,也可以申请复位
  喂狗太晚,6位计数器减到0后,复位;喂狗太早,计数器的值超过窗口值,复位

  当计数器减到0x40(1000 0000)时,可以产生早期唤醒中断(EWI),下一时刻才复位

在这里插入图片描述

  • 超时时间(喂狗的最晚时间):TWWDG = TPCLK1 x 4096 x WDGTB预分频系数 x (T[5:0] + 1)
  • 窗口时间(喂狗的最早时间):TWIN = TPCLK1 x 4096 x WDGTB预分频系数 x (T[5:0] - W[5:0])
  • TPCLK1 = 1 / FPCLK1(36MHz)

  下图为最小/最大超时值与分配系数关系
  WDGTB = 0,1,2,3对应1,2,4,8分频

在这里插入图片描述

4.3 IWDG和WWDG对比

  下图为IWDG和WWDG对比图

在这里插入图片描述

五、独立看门狗&窗口看门狗

5.1 独立看门狗

  步骤:打开LSI时钟(默认打开) — 键寄存器(解除写保护) — 写入预分频值和重装值键寄存器(启动独立看门狗) — 键寄存器(写重装值-喂狗)

  当程序卡死超过设定时间时,看门狗就会进行复位

int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"IWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)//本次复位由IWDG产生{OLED_ShowString(2,1,"IWDGRST");Delay_ms(500);OLED_ShowString(2,1,"       ");Delay_ms(500);RCC_ClearFlag();//清除标志位}else//普通复位{OLED_ShowString(3,1,"RST");Delay_ms(500);OLED_ShowString(3,1,"   ");Delay_ms(500);}//时钟自动配置IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//接触写保护//1000ms超时时间IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频值IWDG_SetReload(2499);//配置重装值/喂狗IWDG_ReloadCounter();//先喂狗,CNT初始值就是2499//启动看门狗IWDG_Enable();while(1){Key_GetNum();//按键一直按下,程序卡死,看门狗复位IWDG_ReloadCounter();//喂狗//Delay_ms(950);//看门狗不复位//Delay_ms(1010);//程序卡死超过1000ms,看门狗会一直复位}
}

5.2 窗口看门狗

  步骤:打开PCLK1时钟(APB1时钟) — 配置预分频和窗口寄存器值写入控制寄存器CR(看门狗使能计数器溢出标志位计数器有效位) — 计数器写值(喂狗)

  窗口看门狗需要设定窗口值和超时值,过早或超时喂狗都会使得看门狗复位

int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"WWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)//本次复位由WWDG产生{OLED_ShowString(2,1,"WWDGRST");Delay_ms(500);OLED_ShowString(2,1,"       ");Delay_ms(500);RCC_ClearFlag();//清除标志位}else//普通复位{OLED_ShowString(3,1,"RST");Delay_ms(500);OLED_ShowString(3,1,"   ");Delay_ms(500);}RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启PCLK1时钟//超时50ms 窗口30msWWDG_SetPrescaler(WWDG_Prescaler_8);//分频系数WWDG_SetWindowValue(0x40 | 21);//窗口值是W5-W0,W6为1WWDG_Enable(0x40 | 54);//计数器值是T5-T0,T6为1while(1){//Key_GetNum();//Delay_ms(32);//过早喂狗:避免第一次喂狗和第二次间隔小于窗口30msDelay_ms(55);//超时喂狗WWDG_SetCounter(0x40 | 54);}
}

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

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

相关文章

DrissionPage框架应用

DrissionPage框架应用 Scrapy框架可以自定义请求,我们经常使用的selenium,pypuppteer,playwight等模拟浏览器的环境执行网络的请求;但是以上都有被检测的风险,新晋浏览器防检测工具,不仅不需要繁琐的安装浏览器的内核&…

『大模型笔记』斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来

MAC 文章目录 一. 斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来引言过去与现在现代 AI 的进步未来的发展空间智能近期进展与未来展望文字输入制作视频机器人学习AI 与人类互动医疗健康应用结语二. 参考文献一. 斯坦福大学教授李飞飞在2024年数据与人…

全球AI视频技术竞赛加速:Runway即将推出更优更快的第三代AI视频模型|TodayAI

Runway即将在未来几天推出其更优更快的第三代AI视频模型,这是新一代模型中最小的一个。据公司透露,这款名为Gen-3的模型将带来“在真实度、一致性和动态效果上的重大提升”,同时在速度上也有显著的加快。 去年六月,Runway首次推出…

Mathtype与word字号对照+Mathtype与word字号对照

字体大小对照表如下 初号44pt 小初36pt 一号26pt 小一24pt 二号22pt 小二18pt 三号16pt 小三15pt 四号14pt 小四12pt 五号10.5pt 小五9pt 六号7.5pt 小六6.5pt 七号5.5pt 八号5pt 1 保存12pt文件 首选选择第一个公式,将其大小改为12pt 然后依次选择 “预置”—…

ClipArt ETC - 典雅的剪贴画网站

文章目录 ClipArt ETCClippix佛罗里达教学技术中心课堂数字内容 ClipArt ETC 网站地址: https://etc.usf.edu/clipart/ ClipArt ETC为学生和教师提供了超过71,500件高质量的教育剪贴画。 每个插图都有图像大小的选择以及学校项目中正确引用的完整源信息。 所有图像…

【Java】已解决java.sql.SQLRecoverableException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLRecoverableException异常 在Java的数据库编程中,java.sql.SQLRecoverableException是一个重要的异常,它通常表示一个可以恢复的SQL异常。…

【扫雷游戏】C语言教程

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

低温环氧胶在指纹模组封装中的应用有哪些?

低温环氧胶在指纹模组封装中的应用有哪些? 低温环氧胶在指纹模组封装中的应用点主要包括以下几点: 金属环/框与FPC基板固定:低温固化环氧胶被推荐用于固定金属环或框到柔性印刷电路板(FPC)基板上,确保它们之间有稳固的连接。 传感…

国产数据库也开始堆砌功能了?试图在行业中炫技!

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

数位统计DP——AcWing 338. 计数问题

数位统计DP 定义 数位DP(Digital DP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。 运用情况 统计满足特定条件的数字个数&#xff0…

成都欣丰洪泰文化传媒有限公司开网店怎么样?

在数字化浪潮汹涌的今天,电商行业蓬勃发展,成为推动经济增长的重要引擎。在这个竞争激烈的市场环境中,如何脱颖而出,成为电商领域的佼佼者?成都欣丰洪泰文化传媒有限公司以其专业的电商服务,为众多商家提供…

【Go】用 Go 原生以及 Gorm 读取 SQLCipher 加密数据库

本文档主要描述通过 https://github.com/mutecomm/go-sqlcipher 生成和读取 SQLCipher 加密数据库以及其中踩的一些坑 用 go 去生成读取 SQLCipher 数据库用 gorm 去读取 SQLCipher 数据库在生成后分别用 DBeaver、db browser 和 sqlcipher 读取 SQLCipher 数据库,…

1.搭建SpringBoot项目三种方式

目录 1.使用Spring Initializr 1.1访问Spring Initializr: 1.2填写项目基本信息 1.3配置项目元数据: 1.4添加依赖: 1.5生成项目: 1.6下载项目: 1.7解压项目: 1.8导入项目到IDE: 1.9运行项目: 1.10创建控制器: 1.11访问应用 2.使用IDE(集成开发环境&…

34、shell数组+正则表达式

0、课前补充 jiafa () { result$(echo " $1 $2 " | bc ) print "%.2f\n" "$result" } ##保留小数点两位 薄弱加强点 a$(df -h | awk NR>1 {print $5} | tr -d %) echo "$a"一、数组 1.1、定义 数组的定义&am…

配电室数据中心巡检3d可视化搭建的详细步骤

要搭建配电室巡检的3D可视化系统,可以按照以下步骤进行: 收集配电室数据: 首先,需要收集配电室的相关数据,包括配电室的布局、设备信息、传感器数据等。可以通过实地调查、测量和设备手册等方式获取数据。 创建3D模型…

解决java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘1‘ for key ‘book.PRIMARY‘

目录 问题 原因 解决方案 问题 场景:有张图书表,主键是自增的。现在我写了个添加图书功能。因为主键是自增的我插入时无需设置主键值。 关键代码如下: 然后就报这个异常了: 找了一圈并没有发现能解决我这个问题的。最终仔细分…

电脑桌面文件夹删除不了怎么办?6种方法快速解决,建议收藏!

桌面文件夹删不掉怎么办?有时会遇到桌面上的文件夹无法删除的问题,这是由于文件夹被系统进程或某些应用占用,或者是由于权限设置等原因造成的。以下是解决桌面文件夹无法删除问题的方法,帮助你有效地清理桌面环境。 桌面文件夹删不…

中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM2024)

会议日期:2024年10月20-21日 会议地点:德国-法兰克福 会议官网:https://www.iaast.cn/meet/home/Bx130JiM 出版检索:EI、Scopus等数据库收录 【会议简介】 “中欧科学家论坛”由德国、法国、荷兰、瑞士、丹麦、意大利、西班牙…

欧几里得算法求解最大公约数(附代码实现,习题练习)

1.公约数、最大公约数的定义 公约数,亦称“公因数”。它是指能同时整除几个整数的数 。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”。公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。eg.30和4…