STM32F407ZGT6看门狗

/**********************独立看门狗***************************/

1、独立看门狗相当于12位计数器,它的计数值减至0就会产生复位。

2、特殊值作用:

1)0x5555:取消写保护,使用户可以操作PR、RLR寄存器;

2)0xaaaa:使重载寄存器RLR的值能传送至12位计数器中;

3)0xcccc:软件开启独立看门狗;

3、独立看门狗一旦开启会一直存在,必须在其复位的时候进行关闭。

4、独立看门狗使用LSI,也就是说没有了外部时钟它也不会受到影响。

5、LSI不是直接就供给12位递减计数器的,而是需要经过一个8位的预分频器PR之后。

6、因为独立看门狗有自己专门的时钟LSI(40KHz),所以编程时不需要配置使能时钟这一步。

7、因为计数器是12位的,所以装载初值时不能超过0xfff。

8、为什么分频系数范围是0~6?在IWDG_SetPrescaler()函数右键go to definition,然后在assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler))的IS_IWDG_PRESCALER上继续右键go to definition,就到了下图一所示内容,从图中可以看到分频系数参数右边括号的立即数,范围就是从0x00~0x06,查过计算公式的都知道:Tout=([4*(2^prescaler)]/40)*reload,其中40代表40KHz,reload代表需要装载的初值,那前面[4*(2^prescaler)]这堆是什么鬼?为什么要这么写?既然分频器是8位的,那我们写成2^0、2^1、2^3...2^8不好吗?非得搞得这么麻烦?实际上,它的这种做法纯属为了计算方便,本质含义就是为了最终构成4的倍数方便40进行整除而得来的,其实公式也不需要死记,找到STM32F4xx中文参考手册关于独立看门狗这章的框图,如下图二,LSI的40KHz进来除以总的分频系数4*(2^prescaler)得到一个单位时钟(单位仍为频率),然后取倒数得到单位时间,再乘以装载的初值(也就是次数),于是就得到了整个的溢出周期。

 

 

9、编程步骤:

1)开启寄存器访问:IWDG_WriteAccessCmd();

2)设置分频系数和装载值:IWDG_SetPrescaler();  IWDG_SetReload();

3)重载计数器:IWDG_ReloadCounter();

4)启动独立看门狗:IWDG_Enable();

/**********************窗口看门狗***************************/

1、窗口看门狗是7位的递减计数器,最大值为0x7f。

2、递减下限值为0x40,也就是窗口下限值,是固定值不能被改变。

3、窗口上限值为用户自定义,比0x40大,和独立看门狗不一样的是,必须在窗口的两个限定值之间(0x40<x<user)进行喂狗才不会导致复位。

4、因为窗口下限值是固定的0x40,所以可以利用中断方式判断计数器是否递减到了0x40,如果到了就进入中断对看门狗进行喂狗,这样就可以避免系统产生复位,同时可以避免用户自己通过公式计算溢出时间的麻烦。

5、编程步骤:

1)使能WWDG时钟:RCC_APB1PeriphClockCmd();

2)设置分频系数和上窗口值:WWDG_SetPrescaler();  WWDG_SetWindowValue();  

3)设置计数器值并使能WWDG:WWDG_Enable();

4)设置中断和分组:NVIC_Init();  NVIC_PriorityGroupConfig();

5)清除中断标志并开启中断:WWDG_ClearFlag();  WWDG_EnableIT();

6)编写中断服务程序

 

posted @ 2020-02-25 04:51  migui  阅读(511)  评论(0)    收藏  举报