孟村县做网站,涿州市建设局网站,怎么制作网站建设,平顶山市建设局网站本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.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 …本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.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简介
PWRPower Control电源控制PWR负责管理STM32内部的电源供电部分可以实现可编程电压监测器和低功耗模式的功能可编程电压监测器PVD可以监控VDD电源电压当VDD下降到PVD阀值以下或上升到PVD阀值之上时PVD会触发中断用于执行紧急关闭任务低功耗模式包括睡眠模式Sleep、停机模式Stop和待机模式Standby可在系统空闲时降低STM32的功耗延长设备使用时间
1.2 电源框图 上面是模拟部分供电包括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 上电复位和掉电复位 当VDD、VDDA电压过低时内部电路直接产生复位让STM32复位住不要乱操作。在复位与不复位之间设置了一个40mV迟滞电压大于上限POR时解除复位小于下限PDR时复位。设置两个阈值的作用 就是防止电压在某个阈值附近波动时造成输出也来回抖动。复位信号Reset是低电平有效的所以在前面和后面电压过低时是复位的。 中间电压正常的时候不复位。
1.4 可编程电压监测器 与上电复位和掉电复位差不多。但首先它的这个阈值电压是可以使用程序指定的可以自定义调节。
1.5 低功耗模式 睡眠模式通过WFI和WFE就可进入WFI和WFE是内核的指令。 WFIWait For Interrupt等待中断。唤醒条件是任一中断通过WFI指令进入睡眠模式当任何外设发生任何中断时芯片就会立刻醒来醒来后就是处理中断函数。WFEWait For Event等待事件唤醒条件是唤醒事件该事件可以是外部中断配置为事件模式也可以是使能了中断但没有配置NVIC。调用WFE进入的睡眠模式产生唤醒事件时会立刻醒来醒来之后一般不需要进中断函数直接从睡的地方继续运行。睡眠模式对电路的影响是只把CPU时钟关了对其他电路没有任何操作。CPU时钟关了程序就会暂停不会继续运行了。CPU 不运行芯片功耗就会降低。关闭电路一般有两个做法一个是关闭时钟另一个是关闭电源。关闭时钟所有的运算和涉及时序的操作都会暂停。但寄存器和存储器里保存的数据还可以维持不会消失。关闭电源就是电路直接断电。电路的操作和数据会直接丢失。所以关闭电源比关闭时钟更省电。 停机模式SLEEPDEEP设置为1即将深度睡眠。 PDDS是用来区分是停机模式还是待机模式PDDS0进入停机模式PDDS1进入待机模式LPDS用来设置电压调节器LPDS0开启LPDS1进入低功耗模式。再调用WFI或WFE芯片就进入停止模式了。任一外部中断唤醒。PVD、TRC闹钟、USB唤醒、ETH唤醒借道了外部中断这4个信号也可以唤醒停止模式。对时钟的影响CPU、定时器、串口都会停止运行但由于没有关闭电源所以CPU和外设的寄存器数据都是维持原状的。HSI和HSE的振荡器关闭。 待机模式SLEEPDEEP置1PDDS1再调用WFI或WFE芯片就进入待机模式了。 普通外设的中断和外部中断都无法唤醒待机模式只有WKUP引脚的上升沿、RTC闹钟事件、NRST引脚上的外部复位、IWDG复位。把能关的全关了只保留几个唤醒的功能。
1.6 模式选择
执行WFIWait For Interrupt或者WFEWait For Event指令后STM32进入低功耗模式 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简介
WDGWatchdog看门狗看门狗可以监控程序的运行状态当程序因为设计漏洞、硬件故障、电磁干扰等原因出现卡死或跑飞现象时看门狗能及时复位程序避免程序陷入长时间的罢工状态保证系统的可靠性和安全性看门狗本质上是一个定时器当指定时间范围内程序没有执行喂狗重置计数器操作时看门狗硬件电路就自动产生复位信号STM32内置两个看门狗 独立看门狗IWDG独立工作对时间精度要求较低窗口看门狗WWDG要求看门狗在精确计时窗口起作用
2.2 IWDG框图 预分频器的输入时钟是LSI内部低速时钟时钟频率是40kHz。之后时钟进入预分频器进行分频预分频器只有8位最大只能进行256分频。预分频寄存器IWDG_PR可以配置分频系数。经过预分频器进行分频之后时钟驱动递减计数器每来一个时钟自减一个数递减计数器是12位的所以最大值是2^12-14095当自减到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
2.5 WWDG框图 时钟来源是PCLK1即APB1的时钟默认是36MHz时钟进来之后先经过一个预分频器进行分频分频之后的时钟驱动计数器进行计数每来一个时钟自减一次。该计数器之后T5~T0是有效的计数值最高位T6用来当作溢出标志位T61表示计数器没溢出T60表示计数器溢出。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复位 2.7 WWDG超时时间 超时时间就是喂狗的最晚时间 TWWDG TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] 1) 窗口时间喂狗的最早时间 TWIN TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0]) 其中TPCLK1 1 / FPCLK1 2.8 IWDG和WWDG对比
WDG独立看门狗WWDG窗口看门狗复位计数器减到0后计数器T[5:0]减到0后、过早重装计数器中断无早期唤醒中断时钟源LSI40KHzPCLK136MHz预分频系数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);