day04-看门狗实验
1、在stm32F4中,有两个看门狗,独立看门狗(IWDG)和窗口看门狗(WWDG),参考手册中给出的一段解释:
此器件具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门 狗外设(独立和窗口)均可用于检测并解决由
软件错误导致的故障;当计数器达到给定的超 时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 独立看门狗 (IWDG) 由
其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,
通过可配置的时间窗 口来检测应用程序非正常的过迟或过早的操作。 IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完
全独立工作,并且对时 间精度要求较低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程 序。
2、独立看门狗工作过程,正点原子中一段描述:
在关键字寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其 复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,
会产生一个复位信号(IWDG_RESET)。 无论何时,只要关键字寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新 加载到计数器
中从而避免产生看门狗复位 。 IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。
将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新 被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。 接下来,我们介绍预分频寄存器 (IWDG_PR),该寄存器用来设置看门狗时钟的分频系数, 最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是 保留位。
3、独立看门狗配置步骤:
1、取消寄存器写保护,IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable)
2、设置独立看门狗的预分配系数和重装载值,void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);、void IWDG_SetReload(uint16_t Reload);
3、重载计数值,喂狗动作,IWDG_ReloadCounter();
4、启动看门狗,IWDG_Enable();
看门狗的溢出时间计算:Tout=(4*2^prer)*rlr/32 ms,prer:分频系数0-7,rlr:重装载值;

4、独立看门狗配置例程:
1、独立看门狗初始化
// 看门狗溢出时间: Tout=((4*2^prer)*rlr)/32 (ms) void IWDG_Init(u8 prer, u16 rlr) { // 取消寄存器写保护 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 设置预分频系数 IWDG_SetPrescaler(prer); // 设置装载计数值 IWDG_SetReload(rlr); // 重装载计数值 IWDG_ReloadCounter(); // 启动看门狗 IWDG_Enable(); }
2、喂狗动作:
// 喂独立看门狗 void IWDG_Feed() { IWDG_ReloadCounter(); // 重新装载计数值 }
3、主函数中,喂狗间隔大约4s,如果4s内没有及时按下按键喂狗,程序复位,led0状态重新加载
int main(void) { u8 key; delay_init(168); LED_Init(); KeyInit(); delay_ms(200); IWDG_Init(4,2500); // 溢出时间大约4s LED0 = 0; while(1) { key = KeyScan(); if(key == 2) { IWDG_Feed(); } } }
窗口看门狗后面继续再学习

浙公网安备 33010602011771号