OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10503|回复: 4

【Alientek STM32 实验6】--窗口看门狗实验

[复制链接]

98

主题

408

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2010-12-14
在线时间
0 小时
发表于 2010-12-14 23:03:26 | 显示全部楼层 |阅读模式

                      3.6 窗口门狗(WWDG)实验

 

这一节,我们将向大家介绍如何使用STM32的另外一个看门狗,窗口看门狗(以下简称WWDG)。上一节,已经介绍了独立看门狗,这一节我们将介绍另外一个STM32的看门狗,窗口看门狗。本节分为如下几个部分:

3.6.1 STM32窗口看门狗简介

3.6.2 硬件设计

3.6.3 软件设计

3.6.4 下载与测试

3.6.1 STM32窗口看门狗简介

 

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

上面提到的T6即是窗口看门狗的自减计数器的第六位(最高位),该计数器的时钟来自PCLK1/4096/预设分频数。在该计数器的T6位变为0后(小于0X40),就会引起一复位。这是窗口的下限。而当计数器的值在大雨窗口配置寄存器的窗口值之前就被修改的话,也会引起一次复位,这里窗口值是上限。窗口值是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于0X40,否则窗口就不存在了。

窗口看门狗的超时公式如下:

              Twwdg=Tpclk1×4096×2^wdgtb×(t[5:0]+1);

其中:

     Twwdg:WWDG超时时间

     Tpclk1APB1ms为单位的时间间隔。

根据上面的公式,假设PCLK1=36Mhz,那么可以得到最小-最大超时时间表如下:

          3.6.1.1 36M时钟下窗口看门狗的最小最大超时表

接下来,我们介绍窗口看门狗的3个寄存器。首先介绍控制寄存器(WWDG_CR),该寄存器的各位描述如下:

                  3.6.1.1寄存器WWDG_CR各位描述

可以看出,这里我们的WWDG_CR只有低八位有效,T[6:0]用来存储看门狗的计数器值,随时更新的,每个PCLK1周期(4096×2^wdgtb)减1。当该计数器的值从0X40变为0X3F的时候,将产生看门狗复位。

WDGA位则是看门狗的激活位,该位由软件置1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。

窗口看门狗的第二个寄存器是配置寄存器(WWDG_CFR),该寄存器的各位及其描述如下:

                            3.6.1.2寄存器WWDG_ CFR各位描述

该位中的EWI是提前唤醒中断,也就是在快要产生复位的前一段时间来提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗的计数器值减到0X40的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面想WWDG_CR重新写入计数器的值,来达到喂狗的目的。注意这里你在进入中断后,你得在不大于113us的时间(PCLK136M的条件下)内重新写WWDG_CR,否则,看门狗将产生复位!

最后我们要介绍的是状态寄存器(WWDG_SR),该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位0有效,其他都是保留位。当计数器值达到40h时,此位由硬件置1。它必须通过软件写0来清除。对此位写1无效。若中断未被使能,此位也会被置1

在介绍完了窗口看门狗的寄存器之后,我们介绍要如何启用STM32的窗口看门狗。这里我们介绍的方法是用中断的方式来喂狗的。采取的步骤如下:

1)使能WWDG时钟

WWDG不同于IWDGIWDG有自己独立的40Khz时钟,不存在使能问题。而WWDG使用的是PCLK1的时钟,需要先使能时钟。

2)设置WWDG_CFRWWDG_CR两个寄存器

在时钟使能完后,我们设置WWDGCFRCR两个寄存器,对WWDG进行配置。包括使能窗口看门狗、开启中断、设置计数器的初始值、设置窗口值并设置分频数WDGTB等。

3)开启WWDG中断并分组

在设置完了WWDG后,需要配置该中断的分组及使能。这点通过我们之前所编写的MY_NVIC_Init函数实现就可以了。

4)编写中断服务函数

在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到0X3F的时候,就会引起软复位了。在终端服务函数里面也要将状态寄存器的EWIF位清空。

完成了以上4个步骤之后,我们就可以使用STM32的窗口看门狗了。这一节的实验,我们将通过LED来指示STM32是否被复位了。以及中断喂狗操作有没有进行。这里我们用DS0来指示STM32是否被复位了,如果被复位了就会点亮300msDS1用来指示中断喂狗,每次中断喂狗翻转一次。

 

3.6.2 硬件设计

 

窗口看门狗的操作本身和外部没什么关系,但是考虑到指示STM32的状态,使用了2个外部的LEDDS0DS1。其他的没有什么电路。

 

3.6.3 软件设计

 

这里,我们在之前的IWDG看门狗实例内增添部分代码来实现我们此实验。首先打开上次的工程,然后在wdg.c加入如下代码(之前代码保留):

//保存WWDG计数器的设置值,默认为最大.

u8 WWDG_CNT=0x7f;

//初始化窗口看门狗

//tr  :T[6:0],用于存储计数器的值

//wr  :W[6:0],用于存储窗口值

//fprer:窗口看门狗的实际设置

//2位有效.Fwwdg=PCLK1/4096/2^fprer.

void WWDG_Init(u8 tru8 wru8 fprer)

{                                                                            

     RCC->APB1ENR|=1<<11;          //使能wwdg时钟

     WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.                                                                         

     WWDG->CFR|=fprer<<7;    //PCLK1/4096再除2^fprer

     WWDG->CFR|=1<<9;        //使能中断

     WWDG->CFR&=0XFF80;    

     WWDG->CFR|=wr;                       //设定窗口值    

     WWDG->CR|=WWDG_CNT|(1<<7); //开启看门狗,设置7位计数器                                             

     MY_NVIC_Init(23WWDG_IRQChannel2);//抢占2,子优先级3,组2         

}

//重设置WWDG计数器的值

void WWDG_Set_Counter(u8 cnt)

{

     WWDG->CR|=(cnt&0x7F);//重设置7位计数器

}

//窗口看门狗中断服务程序

void WWDG_IRQHandler(void)

{                          

     u8 wrtr;

     wr=WWDG->CFR&0X7F;

     tr=WWDG->CR&0X7F;                                        

     if(tr<wr)WWDG_Set_Counter(WWDG_CNT);//只有当计数器的值,小于窗口寄存器的值才能写CR!!     

     WWDG->SR=0X00;//清除提前唤醒中断标志位

     LED1=!LED1;

}

新增的这三个函数都比较简单,第一个函数void WWDG_Init(u8 tru8 wru8 fprer)用来设置WWDG的初始化值。包括看门狗计数器的值和看门狗比较值等。该函数就是按照我们上面的4个思路设计出来的代码。注意到这里有个全局变量WWDG_CNT,该变量用来保存最初设置WWDG_CR计数器的值。在后续的中断服务函数里面,就又把该数值放回到WWDG_CR上。

WWDG_Set_Counter函数比较简单,就是用来复位窗口看门狗的计数器值的。该函数很简单,我们就不多说了。

最后中断服务函数里面,一定要先比较窗口计数器的值是否小于看门狗的窗口值,如果不小于,则不要修改,如果小于,才能进行修改。我们通过DS0不停的取反,来观测中断服务函数的执行了状况。我们再把这几个函数名加入到头函数里面去,以方便其他文件调用。

在完成了以上部分之后,我们就回到主函数,输入如下代码:

int main(void)

{                          

     Stm32_Clock_Init(9); //系统时钟设置

     delay_init(72);        //延时初始化

     uart_init(729600);  //串口初始化

     LED_Init();                                //初始化与LED连接的硬件接口

     LED0=0;

     delay_ms(300);   

     WWDG_Init(0X7F0X5F3);//计数器值为7f,窗口寄存器为5f,分频数为8    

     while(1)

     {

                 LED0=1;                         

     }         

}

该函数通过LED0来指示是否正在初始化。而LED1用来指示是否发生了中断。我们先让LED0300ms,然后关闭以提示有一次复位发生了。在初始化WWDG之后,我们回到死循环,关闭LED1,并等待看门狗中断的触发/复位。

编译该代码,直到编译通过为止。在没有错误了之后,我们就可以下载到MiniSTM32开发板上,看看是否结果与预期一致。

 

3.6.4 下载与测试

 

将代码下载到MiniSTM32后,可以看到DS0亮一下之后熄灭,紧接着DS1开始不停的闪烁。每秒钟闪烁5次左右,和我们预期的一致。不过注意,下载完后记得把B0设置为0

有兴趣的大家,可以在窗口看门狗的中断服务函数里面把下面这句注释掉:

     if(tr<wr)WWDG_Set_Counter(WWDG_CNT);

之后再次编译并下载代码到MiniSTM32开发板上,可以看看是什么现象?

窗口看门狗.pdf

310.02 KB, 下载次数: 454

ALIENTEK MINISTM32 实验6 窗口看门狗实验.rar

818.07 KB, 下载次数: 788

希望openedv能给大家提供一个友好的技术交流平台!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-9-4
在线时间
0 小时
发表于 2013-10-10 16:49:40 | 显示全部楼层
回复【楼主位】张洋:
---------------------------------
我觉得DS1应该每秒钟闪烁8次左右啊
回复 支持 反对

使用道具 举报

14

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-3-1
在线时间
153 小时
发表于 2014-7-9 13:33:14 | 显示全部楼层




请教一下,这段代码是窗口看门狗初始化的函数,代码里面 WWDG->CFR&=0XFF80;语句是什么作用啊,之前都对WWDG->CFR的各个位都做了相应的设置了,这样”按位与“操作以后起步是要全部失效了吗?求大神讲解一下。
我把他注释掉也没发现有什么异常的地方,,谁知道这个语句什么意思
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-9 21:00:39 | 显示全部楼层
回复【3楼】xia_yangchun:
---------------------------------
只是把最低7位清零....
其他的还是保留.
然后你看最低7位是什么意思?
然后你就明白了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-3-1
在线时间
153 小时
发表于 2014-7-9 21:56:24 | 显示全部楼层
回复【4楼】正点原子:
-------------------------------
嗯嗯,已经懂了,原子哥,是我忽略了第“0”位,从第“1”位起算了,所以导致0XFF80(1111 1111 1000 0000)与以后,认为把WDGB0位与掉了,现在懂了,纠结了一天了,醍醐灌顶,粗心大意,太不应该了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-13 12:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表