STM32-PWR和WDG看门狗

本内容基于江协科技STM32视频学习之后整理而得。

文章目录

  • 1. PWR
    • 1.1 PWR简介
    • 1.2 电源框图
    • 1.3 上电复位和掉电复位
    • 1.4 可编程电压监测器
    • 1.5 低功耗模式
    • 1.6 模式选择
    • 1.7 睡眠模式
    • 1.8 停止模式
    • 1.9 待机模式
    • 1.10 库函数
  • 2. WDG看门狗
    • 2.1 WDG简介
    • 2.2 IWDG框图
    • 2.3 IWDG键寄存器
    • 2.4 IWDG超时时间
    • 2.5 WWDG框图
    • 2.6 WWDG工作特性
    • 2.7 WWDG超时时间
    • 2.8 IWDG和WWDG对比
    • 2.9 独立看门狗库函数
    • 2.10 窗口看门狗库函数

1. PWR

1.1 PWR简介

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

1.2 电源框图

image.png

  • 上面是模拟部分供电:包括AD转换器、温度传感器、复位模块、PLL锁相环。供电正极是VDDA,负极是VSSA。AD转换器还有两个参考电压的引脚VREF+和VREF-。
  • 中间是数字部分供电,包括VDD供电区域和1.8V供电区域。VDD供电区域包括I/O电路、待机电路(唤醒逻辑、IWDG),右边是VDD通过电压调节器降压到1.8V。1.8V供电区域包括CPU核心、存储器和内置数字外设。
  • 下面是后备供电VBAT,包括LSE_32K晶体振荡器、后备寄存器、RCC_BDCR寄存器(是RCC的寄存器,叫做备份域控制寄存器)、RTC

1.3 上电复位和掉电复位

image.png
当VDD、VDDA电压过低时,内部电路直接产生复位,让STM32复位住,不要乱操作。在复位与不复位之间设置了一个40mV迟滞电压,大于上限POR时解除复位,小于下限PDR时复位。设置两个阈值的作用,
就是防止电压在某个阈值附近波动时,造成输出也来回抖动。复位信号Reset是低电平有效的,所以在前面和后面,电压过低时,是复位的。
中间电压正常的时候,不复位。

1.4 可编程电压监测器

image.png
与上电复位和掉电复位差不多。但首先它的这个阈值电压是可以使用程序指定的,可以自定义调节。

1.5 低功耗模式

image.png

  • 睡眠模式通过WFI和WFE就可进入,WFI和WFE是内核的指令。
    • WFI(Wait For Interrupt)等待中断。唤醒条件是任一中断,通过WFI指令进入睡眠模式,当任何外设发生任何中断时,芯片就会立刻醒来,醒来后就是处理中断函数。
    • WFE(Wait For Event)等待事件,唤醒条件是唤醒事件,该事件可以是外部中断配置为事件模式,也可以是使能了中断,但没有配置NVIC。调用WFE进入的睡眠模式,产生唤醒事件时,会立刻醒来,醒来之后,一般不需要进中断函数,直接从睡的地方继续运行。
    • 睡眠模式对电路的影响是:只把CPU时钟关了,对其他电路没有任何操作。CPU时钟关了,程序就会暂停,不会继续运行了。CPU 不运行,芯片功耗就会降低。关闭电路一般有两个做法:一个是关闭时钟,另一个是关闭电源。关闭时钟,所有的运算和涉及时序的操作都会暂停。但寄存器和存储器里保存的数据还可以维持,不会消失。关闭电源,就是电路直接断电。电路的操作和数据会直接丢失。所以关闭电源比关闭时钟更省电。
  • 停机模式:SLEEPDEEP设置为1,即将深度睡眠。
    • PDDS是用来区分是停机模式还是待机模式,PDDS=0进入停机模式,PDDS=1进入待机模式,LPDS用来设置电压调节器,LPDS=0开启,LPDS=1进入低功耗模式。再调用WFI或WFE,芯片就进入停止模式了。任一外部中断唤醒。PVD、TRC闹钟、USB唤醒、ETH唤醒借道了外部中断,这4个信号也可以唤醒停止模式。
    • 对时钟的影响:CPU、定时器、串口都会停止运行,但由于没有关闭电源,所以CPU和外设的寄存器数据都是维持原状的。HSI和HSE的振荡器关闭。
  • 待机模式:SLEEPDEEP置1,PDDS=1,再调用WFI或WFE,芯片就进入待机模式了。
    • 普通外设的中断和外部中断都无法唤醒待机模式,只有:WKUP引脚的上升沿、RTC闹钟事件、NRST引脚上的外部复位、IWDG复位。把能关的全关了,只保留几个唤醒的功能。

1.6 模式选择

  • 执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式

image.png

1.7 睡眠模式

  • 执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
  • SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠
  • 在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态
  • WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
  • WFE指令进入睡眠模式,可被唤醒事件唤醒

1.8 停止模式

  • 执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
  • 1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来
  • 在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态
  • 当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟
  • 当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时
  • WFI指令进入停止模式,可被任意一个EXTI中断唤醒
  • WFE指令进入停止模式,可被任意一个EXTI事件唤醒

1.9 待机模式

  • 执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行
  • 整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电
  • 在待机模式下,所有的I/O引脚变为高阻态(浮空输入)
  • WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式

1.10 库函数

// 恢复缺省配置
void PWR_DeInit(void);
// 使能后备区域的访问
void PWR_BackupAccessCmd(FunctionalState NewState);
// 使能PVD
void PWR_PVDCmd(FunctionalState NewState);
// 配置PVD的阈值电压
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);
// 使能位于PA0位置的WKUP引脚,配合待机模式使用
void PWR_WakeUpPinCmd(FunctionalState NewState);
// 进入停止模式
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
// 进入待机模式
void PWR_EnterSTANDBYMode(void);

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);

2. WDG看门狗

2.1 WDG简介

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

2.2 IWDG框图

image.png
预分频器的输入时钟是LSI(内部低速时钟),时钟频率是40kHz。之后,时钟进入预分频器进行分频,预分频器只有8位,最大只能进行256分频。预分频寄存器IWDG_PR,可以配置分频系数。经过预分频器进行分频之后,时钟驱动递减计数器,每来一个时钟,自减一个数,递减计数器是12位的,所以最大值是2^12-1=4095,当自减到0之后,产生IWDG复位。为了避免提前复位,可以提前在重装寄存器写一个值,IWDG_RLR和定时器的ARR一样,预先写好值之后,在键寄存器里写一个特定数据,控制电路,进行喂狗,这时重装值就会复制到当前的计数器中,这样计数器就会回到重装值,重新自减运行了。
状态寄存器SR:标志电路运行的状态,

2.3 IWDG键寄存器

  • 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
  • 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
写入键寄存器的值作用
0xCCCC启用独立看门狗
0xAAAAIWDG_RLR中的值重新加载到计数器(喂狗)
0x5555解除IWDG_PR和IWDG_RLR的写保护
0x5555之外的其他值启用IWDG_PR和IWDG_RLR的写保护

2.4 IWDG超时时间

超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)
其中:TLSI = 1 / FLSI
image.png

2.5 WWDG框图

image.png

  • 时钟来源是PCLK1,即APB1的时钟,默认是36MHz,时钟进来之后,先经过一个预分频器进行分频,分频之后的时钟驱动计数器进行计数,每来一个时钟,自减一次。该计数器之后T5~T0是有效的计数值,最高位T6用来当作溢出标志位,T6=1表示计数器没溢出,T6=0表示计数器溢出。
  • WDGA是窗口看门狗的激活位,也是使能,WDGA写入1,启用窗口看门狗,使能位作用于这个与门,与门的作用就类似于一个开关,左边是控制信号,右边是输入,上边是输出,控制信号为1,则输出等于输入,开关导通,控制信号给0,则输出等于0,与输入无关,开关断开。开关右边就是复位信号的来源,有两个来源,用或门连接,也就是这两个来源任意一个都可以复位,下面这一路来源于溢出标志位T6,当计数器溢出时T6等于0。然后输入进来,这里输入有个小圆圈,代表输入取反,所以0变为1,或门有效,输出1,当最后这个使能位给1,开启看门狗后,溢出信号就直接通向复位了。T6位一旦等于0,就表示计数器溢出,就产生复位信号。在程序正常运行状态下,必须始终保证T6位为1,这样才能避免复位。
  • 喂狗的最早界限由上面的看门狗配置寄存器设置。首先需要计算一个最早界限的计数值,写入W6~W0。这些值写入之后是固定不变的。一旦执行写入WWDG_CR操作时,与门开关就会打开。写入CR就是写入计数器,也就是喂狗。在喂狗时,比较器开始工作,一旦当前计数器T6:0>窗口值W6:0,比较结果就=1,这个1,通过或门也可以去申请复位。
  • 总结:喂狗太晚,6位计数器减到0了,复位;喂狗太早,计数器的值超过窗口值了,复位。

2.6 WWDG工作特性

  • 递减计数器T[6:0]的值小于0x40时,WWDG产生复位(0x3F)
  • 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位----不能过早喂狗
  • 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位----
  • 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

image.png

2.7 WWDG超时时间

  • 超时时间:就是喂狗的最晚时间

    TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

  • 窗口时间:喂狗的最早时间

    TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

  • 其中:TPCLK1 = 1 / FPCLK1

image.png

2.8 IWDG和WWDG对比

WDG独立看门狗WWDG窗口看门狗
复位计数器减到0后计数器T[5:0]减到0后、过早重装计数器
中断早期唤醒中断
时钟源LSI(40KHz)PCLK1(36MHz)
预分频系数4、8、32、64、128、2561、2、4、8
计数器12位6位(有效计数)
超时时间0.1ms~26214.4ms113us~58.25ms
喂狗方式写入键寄存器,重装固定值RLR直接写入计数器,写多少重装多少
防误操作键寄存器和写保护
用途独立工作,对时间精度要求较低要求看门狗在精确计时窗口起作用

2.9 独立看门狗库函数

// 写使能控制,0x5555
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
// 写预分频器
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
// 写重装值
void IWDG_SetReload(uint16_t Reload);
// 重新装载寄存器,即喂狗,0xAAAA
void IWDG_ReloadCounter(void);
// 启动独立看门狗,0xCCCC
void IWDG_Enable(void);

FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);

// 查看标志位函数,来看复位是不是看门狗引起的
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
void RCC_ClearFlag(void);

2.10 窗口看门狗库函数

// 恢复缺省配置
void WWDG_DeInit(void);

// 写入预分频器
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
// 写入窗口值
void WWDG_SetWindowValue(uint8_t WindowValue);
// 使能中断
void WWDG_EnableIT(void);
// 写入计数器,即喂狗
void WWDG_SetCounter(uint8_t Counter);
// 使能窗口看门狗
void WWDG_Enable(uint8_t Counter);

FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ACM ICPS独立出版 | 2024年第三届计算与人工智能国际会议(ISCAI 2024)

会议简介 Brief Introduction 2024年第三届计算与人工智能国际会议(ISCAI 2024) 会议时间:2024年11月22 -24日 召开地点:中国大理 大会官网:www.iscai.org 2024年第三届计算与人工智能国际会议(ISCAI 2024)将围绕“计算与人工智能”的最新研究…

排序 -- 冒泡排序和快速排序

一、 交换排序 1、基本思想 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 2、常见的交换排序 1、冒泡…

Java Selenium入门程序

需求:使用chrome浏览器打开百度首页 1.配置浏览器驱动 (1)下载浏览器驱动,浏览器版本需与驱动版本一致; (2)编辑系统环境变量-->编辑Path-->填入浏览器驱动路径: 2.maven工…

【反悔贪心 反悔堆】1642. 可以到达的最远建筑

本文涉及知识点 反悔贪心 反悔堆 LeetCode1642. 可以到达的最远建筑 给你一个整数数组 heights ,表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。 当…

刷题之删除有序数组中的重复项(leetcode)

删除有序数组中的重复项 这题简单题&#xff0c;双指针&#xff0c;一个指针记录未重复的数的个数&#xff0c;另一个记录遍历的位置。 以下是简单模拟&#xff0c;可以优化&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int l0…

STL--求交集,并集,差集(set_intersection,set_union,set_difference)

set_intersection(重要) 求两个有序的序列的交集. 函数声明如下: template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_intersection(InputIterator1 _First1, //容器1开头InputIterator1 _Last1, //容器2结尾(不包含)Inp…

ChatGPT4深度解析:探索智能对话新境界

大模型chatgpt4分析功能初探 目录 1、探测目的 2、目标变量分析 3、特征缺失率处理 4、特征描述性分析 5、异常值分析 6、相关性分析 7、高阶特征挖掘 1、探测目的 1、分析chat4的数据分析能力&#xff0c;提高部门人效 2、给数据挖掘提供思路 3、原始数据&#xf…

Navicat终于免费了, 但是这个结果很奇葩

个人用下载地址: 点呀 好家伙, 每个机构最多5个用户, 对于正在审计的公司…

DAY1: 实习前期准备

文章目录 VS Code安装的插件C/CCMakeGitHub CopilotRemote-SSH收获 VS Code 下载链接&#xff1a;https://code.visualstudio.com 安装的插件 C/C 是什么&#xff1a;C/C IntelliSense, debugging, and code browsing. 为什么&#xff1a;初步了解如何在VS Code里使用C输出…

Vulnhub-Os-hackNos-1(包含靶机获取不了IP地址)

https://download.vulnhub.com/hacknos/Os-hackNos-1.ova #靶机下载地址 题目&#xff1a;要找到两个flag user.txt root.txt 文件打开 改为NAT vuln-hub-OS-HACKNOS-1靶机检测不到IP地址 重启靶机 按住shift 按下键盘字母"E"键 将图中ro修改成…

筛选Github上的一些优质项目

每个项目旁都有标签说明其特点&#xff0c;如今日热捧、多模态、收入生成、机器人、大型语言模型等。 项目涵盖了不同的编程语言和领域&#xff0c;包括人工智能、语言模型、网页数据采集、聊天机器人、语音合成、AI 代理工具集、语音转录、大型语言模型、DevOps、本地文件共享…

7-6 每日升学消息汇总

复旦附中清北比例大涨&#xff0c;从统计数据来看&#xff0c;今年复附的清北人数将创历史新高&#xff0c;达到前所未有年进43人。离上海7月9号中考出分&#xff0c;还有3天。小道消息说&#xff0c;画狮的数游天下又回来了&#xff0c;目前还未官方消息。2024第二届国际数学夏…

安卓虚拟位置修改1.25beta支持路线模拟、直接定位修改

导语:更新支持安卓14/15&#xff0c;支持路线模拟、直接定位修改&#xff0c;仅支持单一版本 无root需根据教程搭配下方链接所提供的虚拟机便可进行使用 有root且具备XP环境可直接真机运行 如你有特殊需求 重启问题设置打开XP兼容 针对具有虚拟机检测的软件 建议如下 度娘搜索…

多表查询sql

概述&#xff1a;项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系&#xff0c;分为三种&#xff1a; 一对多多对多一对一 一、多表关系 一对多 案例&#xff1a;部门与…

在CMD中创建虚拟环境并在VSCode中使用和管理

1. 使用Conda创建虚拟环境 在CMD或Anaconda Prompt中执行以下代码以创建一个新的虚拟环境&#xff1a; conda create -n my_env python 3.8 这样会创建一个名为 my_env 的环境&#xff0c;并在Anaconda环境目录下生成一个相应的文件夹&#xff0c;包含该虚拟环境所需的所有…

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换&#xff0c;非扫描模式1.6.2 连续转换&#xff0c;非扫描模式1.6.3 单次…

时间、查找、打包、行过滤与指令的运行——linux指令学习(二)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

系统学习ElastricSearch(一)

不知道大家在项目中是否使用过ElastricSearch&#xff1f;大家对它的了解又有多少呢&#xff1f;官网的定义&#xff1a;Elasticsearch是一个分布式、可扩展、近实时的搜索与数据分析引擎。今天我们就来揭开一下它的神秘面纱&#xff08;以下简称ES&#xff09;。 ES 是使用 J…

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战

嗨&#xff0c;大家好&#xff0c;我是爱搞知识的咸虾米。 今天给大家带来的是零基础入门uniapp&#xff0c;课程采用的是最新的Vue3组合式API版本&#xff0c;22年发布的uniappVue2版本获得了官方推荐&#xff0c;有很多同学等着我这个vue3版本的那&#xff0c;如果没有学过vu…