首页 > 编程知识 正文

stm32独立看门狗如何关闭(stm32休眠了还要看门狗)

时间:2023-05-05 06:44:16 阅读:75299 作者:3582

我想在谷歌之后把stm32做得更好,其实是之前自己写的笔记。 接下来一起写吧。 我自己也最好找到自己写的东西。 毕竟,yyd,博客都是写给自己的。

(现在自己好像不知道) )。

一.看门狗是指stm32,学习独立看门狗和风窗的实验。 看一眼一定是一副无神的表情啊。 看门狗是什么?

给人的印象是,看门狗在日常生活中,起到了确保安全、防止外来者工作的作用。

stm32的看门狗也有同样的意思:

看门狗就是起到一个监督单片机是否正在正常运行的作用。如果程序运行异常(跑飞),那么让系统复位,程序重新执行。

让我们看看百科全书:

在由单片机构成的微型计算机系统中,单片机的工作经常受到外界电磁场的干扰,程序弹出,陷入死循环,程序的正常工作中断, 由于单片机控制的系统不能继续运行,整个系统陷入停滞状态,导致意想不到的结果,考虑到实时监测单片机的工作状态,单片机

看门狗如何实现这些操作呢? 在讨论这个之前,我们先看看stm32的看门狗里有什么。

1.2款看门狗STM32F10xxx内置两款看门狗,提供更高的安全性、时间准确性和使用灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。

独立看门狗(IWDG)

独立的看门狗由专用的低速时钟(LSI )驱动,即使主时钟发生故障也有效。

IWDG最适合看门狗在主程序外完全独立工作,时间精度要求低的情况。

窗口看门狗(WWDG)

看门狗由APB1时钟分频后得到的时钟驱动,从可配置的时间窗口检测APP应用程序异常的太慢或太快的行为。

wdg非常适合需要看门狗在精确的时间窗口中工作的APP应用程序。

但是,只看这个确实。 有点迷茫,有点印象呢。

但是,恐怕看门狗也应该有一点概念。 我知道至少有两种看门狗。

那么在这里详细介绍一下独立看门狗吧。 窗口看门狗将保留在以下主题中。

2 .在独立看门狗之前看了独立看门狗的介绍,我们发现他有由一个专门的时钟驱动

现在我将更详细地介绍:

STM32的独立看门狗由内部专用的40Khz低速时钟驱动,即使主时钟发生故障也有效。 这里需要注意的是,独立看门狗的时钟是内部RC时钟,因此不是精确的40Khz,而是30~60Khz之间可变化的时钟。 只是,因为我们在估计时以40Khz的频率进行计算,所以看门狗对时间的要求不准确,所以时钟稍微偏移也是可以接受的。

这里是他在主程序之外工作,可以监视主程序是否正常运行。

ok,他是怎么工作的?

首先,简单地:

独立看门狗可以先设置一个时间(比如1s),如果超过这个时间,那么就代表主程序出了异常,然后让系统复位,程序重新执行。在这里这个时间的流逝我们理解成一个倒计时

但是很多时候主程序本身就是一个死循环肯定运行不止1s啊

于是我们需要在主程序之中重置这个时间(倒计时重新开始),如果主程序出现了问题—那么倒计时无法重置,但是我们的看门狗gtdhb在运行,最终超过时间,看门狗让系统复位,程序重新执行。

我想我大概理解了。

那么,如何打开看门狗,如何重置时间呢?

作为单片机,它只能在相关寄存器中操作

二、独立号狗相关寄存器先不分析单独的寄存器,先直接去框图。

首先试着从整体上把握一下。 我觉得在这里官方说的比较好。

在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。

无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位 。

其实这里就是看门狗原理的实现,倒计时是计数器计数到最后的时间

而且应该注意的是

IWDG_PR和IWDG_RLR寄 存 器 具 有 写 保 护 功 能 。

要 修 改 这 两 个 寄 存 器 的 值 , 必 须 先 向IWDG_K

R寄存器中写入0x5555。

以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。

重装载操作(即写入0xAAAA)也会启动写保护功能。

那先看一下键寄存器:

1.键寄存器(IWDG_KR)

但是我们会发现键寄存器其实只是写这三个值–那怎么自己设置时间呢?

所以主要看另外两个寄存器了–IWDG_PRIWDG_RLR

2.设置倒计时的两个寄存器–**IWDG_PR,**IWDG_RLR

先看图吧

ok,重点都标出来了,但是好像看了跟没看一样

再结合一下公式:

*Tout=(4*2^prer)rlr / 40 ms

(其中prer是IWDG_PR寄存器2进制化为十进制的值,rlr就是IWDG_RLR中的值)

Tout就是看门狗每次的倒计时T

公式的推导参考:https://blog.csdn.net/qq_37957854/article/details/105644138

所以通过对两个寄存器写入,我们就可以设置倒计时了—不要忘了写入之前的操作

还有一个寄存器来着。。这个就看一下就行:

3.状态寄存器(IWDG_SR)

状态寄存器指示预分频值和递减计数器是否正在被更新。

疑问:这个寄存器需要我们自己操作吗?

三.看门狗相关库函数讲解 1.看门狗相关库函数 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PRvoid IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLRvoid IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KRvoid IWDG_Enable(void);//使能看门狗:写0xCCCC到KRFlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

大概有些印象就行

几乎传入的参数也全都是具体的数值–分别就是设置那几个寄存器的值

我们现在直接看实验,首先是实验的目的:

2.实验目的

我们会在main.c函数中创建主程序:

开始实验后,先延迟一会,然后让一个LED亮起。

并在死循环中设置–如果按下按键,那么喂狗。

一般情况下应该就是直接喂狗,这里是为了检验看门狗,就显得很不符合常理

如果不按下按键,那么就不会喂狗,也就是说—程序会一直重启,LED呈现闪烁的效果

如果按时按下按键,程序开始喂狗,那么程序不会重启,LED灯常亮

3.开始写代码(源码分析)–运行看门狗步骤

ps:这里不分析在哪个文件,直接分析函数和代码

首先还是得

启动看门狗(初始化)

void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64IWDG_SetReload(rlr); //设置IWDG重装载值IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable(); //使能IWDG}

首先就是这个init函数的两个参数,表明自己没有设置rlr和prer,

要我们在初始化的时候自己设置**(自己设置倒计时)**

主体上:

先解除对两个寄存器的写操作,然后再分别设置寄存器, 并重新加载一遍两个寄存器—这里的代码是 *IWDG_ReloadCounter();* (这里可以留意一下吧)最后让看门狗开始执行。

然后

在main函数里面

int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(9600); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //按键初始化 delay_ms(300); //让人看得到灭IWDG_Init(4,625); //与分频数为64,重载值为625,溢出时间为1s LED0=0; //点亮LED0while(1){if(KEY_Scan(0)==WKUP_PRES)IWDG_ReloadCounter();//如果WK_UP按下,则喂狗delay_ms(10);};}

就两个操作和看门狗有关

第10行,引用初始化函数 并引入两个需要的数值— 套公式(寄存器的文章里面)

第14行 喂狗

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。