单片机
返回首页

STM32笔记之十三:恶搞,两只看门狗

2015-09-29 来源:eefocus

a)        目的:

了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用法。

b)        相同:

都是用来探测系统故障,通过编写代码定时发送故障清零信号(高手们都管这个代码叫做“喂狗”),告诉它系统运行正常。一旦系统故障,程序清零代码(“喂狗”)无法执行,其计数器就会计数不止,直到记到零并发生故障中断(狗饿了开始叫唤),控制CPU重启整个系统(不行啦,开始咬人了,快跑……)。

c)        区别:

独立看门狗Iwdg——我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。(这条狗是借来的,见谁偷懒它都咬!)主要用于监视硬件错误。

窗口看门狗wwdg——我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。(这条狗是老板娘养的,老板不干活儿他不管!)主要用于监视软件错误。

d)        初始化函数定义:鉴于两只狗作用差不多,使用过程也差不多初始化函数栓一起了,用的时候根据情况删减。

void WDG_Configuration(void);

e)        初始化函数调用:

WDG_Configuration();

f)        初始化函数

void WDG_Configuration()                //看门狗初始化

{

//软件看门狗初始化

  WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms

// (PCLK1/4096)/8= 244 Hz (~4 ms)

   WWDG_SetWindowValue(65);                    //计数器数值

  WWDG_Enable(127);                   //启动计数器,设置喂狗时间

// WWDG timeout = ~4 ms * 64 = 262 ms

   WWDG_ClearFlag();                   //清除标志位

  WWDG_EnableIT();                    //启动中断

//独立看门狗初始化

  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写

  IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频

  IWDG_SetReload(349);                 //计数器数值

  IWDG_ReloadCounter();                //重启计数器

  IWDG_Enable();                       //启动看门狗

}

g)        RCC初始化:只有软件看门狗需要时钟初始化,独立看门狗有自己的时钟不需要但是需要systic工作相关设置。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

h)        独立看门狗使用systic的中断来喂狗,所以添加systic的中断打开代码就行了。软件看门狗需要在NVIC打开中断添加如下代码:

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中断等级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //响应中断优先级

  NVIC_Init(&NVIC_InitStructure);                        //打开中断

i)        中断程序,软件看门狗在自己的中断中喂狗,独立看门狗需要使用systic的定时中断来喂狗。以下两个程序都在stm32f10x_it.c文件中。

void WWDG_IRQHandler(void)

{

  WWDG_SetCounter(0x7F);          //更新计数值

WWDG_ClearFlag();               //清除标志位

}

void SysTickHandler(void)

 IWDG_ReloadCounter();         //重启计数器(喂狗)

}

j)        注意事项:

i.        有狗平常没事情可以不理,但是千万别忘了喂它,否则死都不知道怎么死的!

ii.        初始化程序的调用一定要在systic的初始化之后。

iii.        独立看门狗需要systic中断来喂,但是systic做别的用处不能只做这件事,所以我写了如下几句代码,可以不影响systic的其他应用,其他systic周期代码也可参考:

第一步:在stm32f10x_it.c中定义变量

int Tic_IWDG;           //喂狗循环程序的频率判断变量

第二步:将SysTickHandler中喂狗代码改为下面:

Tic_IWDG++;             //变量递增

if(Tic_IWDG>=100)       //每100个systic周期喂狗

 IWDG_ReloadCounter();//重启计数器(喂狗)

  Tic_IWDG=0;          //变量清零

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 开关电源的基本组成及工作原理

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章