打印
[应用相关]

看门狗的使用

[复制链接]
1140|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhouhuanの|  楼主 | 2016-10-23 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设我们有个软件有时候会内存出错,或者陷入死循环,那么我们就可以通过独立看门狗来使得该器件复位。
废话少说:
代码示例:伸手党快来!
//----------------------
void IWDG_Init()
{
//Enable write access to IWDG_PR and IWDG_RLR registers
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//Configure the IWDG prescaler
IWDG_SetPrescaler(IWDG_Prescaler_16); //10k
//Configure the IWDG counter value
IWDG_SetReload(2500); // Bits11:0 RL[11:0]: Watchdog counterreload value ~ Only 12bit ~max value = 4096
IWDG_ReloadCounter();
IWDG_Enable();
}
//----------------------
What?这代码是怎么写出来的,Don't worry,Let me tell you !
由于我们使用的是st官方的库,因此有很多文档说明!看看注释就知道啦!如下:
1、首先,打开官方库的任一template:使用keil MDK 打开如下目录
stsw-stm32062.zip\STM32F2xx_StdPeriph_Lib_V1.1.0\Project\STM32F2xx_StdPeriph_Template\MDK-ARM
这样你就会在左手边看到一个如下图一样的文件。简要查看下,我们所要使用的是IWDG这个功能。因此肯定是stm32f2xx_iwdg.c这个文件啦!(f2xx系列的库才有注释,10x的没有。。不过差不多,可能10x的教程相对较多。



打开后就有相关的详细介绍了!
*===================================================================
* How to use this driver
*===================================================================
* 1. Enable write access to IWDG_PR and IWDG_RLR registersusing
* IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function
*
* 2. Configure the IWDG prescaler using IWDG_SetPrescaler()function
*
* 3. Configure the IWDG counter value using IWDG_SetReload()function.
* This value will be loaded in the IWDG counter each time thecounter
* is reloaded, then the IWDG will start counting down from thisvalue.
*
* 4. Start the IWDG using IWDG_Enable() function, when the IWDGis used
* in software mode (no need to enable the LSI, it will beenabled
* by hardware)
*
* 5. Then the application program must reload the IWDG counterat regular
* intervals during normal operation to prevent an MCU reset,using
* IWDG_ReloadCounter() function.
别说看不懂哈!
如下验证整个看门狗的过程:
IWDG_Init();
IWDG_ReloadCounter();
printf("SysInit\r\n");
while(1)
{
Delay_us(1000);
IWDG_ReloadCounter();
printf("1000 \r\n");
Delay_us(10000);
IWDG_ReloadCounter();
printf("10000 \r\n");
Delay_us(100000);
IWDG_ReloadCounter();
printf("100000 \r\n");
Delay_us(200000);
IWDG_ReloadCounter();
printf("200000 \r\n");
Delay_us(300000);
IWDG_ReloadCounter();
printf("200000 \r\n");
Delay_us(400000);
IWDG_ReloadCounter();
printf("400000 \r\n");
Delay_us(500000);
IWDG_ReloadCounter();
printf("500000 \r\n");
Delay_us(600000);
IWDG_ReloadCounter();
printf("600000 \r\n");
Delay_us(700000);
IWDG_ReloadCounter();
printf("700000 \r\n");
Delay_us(800000);
IWDG_ReloadCounter();
printf("800000 \r\n");
Delay_us(900000);
IWDG_ReloadCounter();
printf("900000 \r\n");
Delay_us(1000000);
IWDG_ReloadCounter();
printf("1000000 \r\n");
IWDG_ReloadCounter();
Delay_us(2000000);
printf("2000000\r\n");
}
这样,设置的看门狗必须为每1s喂狗一次,因此,到最后的延时2s的打印函数是不会被打印出来的,直接又一次复位了.
另外,需要注意的是:
1.独立看门狗的ReloadCounter寄存器只有12位~!意思就是,最大值为2的12次方 =4096,千万不能超出!
沙发
bbapple| | 2016-10-23 17:36 | 只看该作者
有某个寄存器按照时钟源不断的递减(有只狗,不断的消耗能量),当该寄存器为0时则会触发系统复位(狗会叫),为了不使得寄存器为0,我们就要按时的重新设置寄存器的值(喂狗),这样当软件正常工作时(正常喂狗,狗就不会叫)不断的重设寄存器就不会导致复位。当万一软件陷入死循环,不再重设寄存器(没有喂狗,狗就会叫)。这样就会产生复位了。

使用特权

评论回复
板凳
handleMessage| | 2016-10-23 17:42 | 只看该作者
独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。

使用特权

评论回复
地板
bbapple| | 2016-10-23 17:47 | 只看该作者
handleMessage 发表于 2016-10-23 17:42
独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。 ...

独立看门狗主要用于监视硬件错误。精确度要求比较低。

使用特权

评论回复
5
xia00| | 2016-10-23 17:56 | 只看该作者
独立看门狗的时钟源为LSI,尽管主时钟出错,它还是能保持激活状态。

使用特权

评论回复
6
hfdy01| | 2016-10-23 17:56 | 只看该作者
窗口看门狗的时钟源为APB1时钟,并且可以修改分频值吧。

使用特权

评论回复
7
CallReceiver| | 2016-10-23 18:04 | 只看该作者
stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位。

使用特权

评论回复
8
boy1990| | 2016-10-23 18:05 | 只看该作者
CallReceiver 发表于 2016-10-23 18:04
stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位。 ...

窗口看门狗还可以触发一个中断

使用特权

评论回复
9
sourceInsight| | 2016-10-23 18:08 | 只看该作者
独立看门狗:可参看RM(reference Manual)的Independent watchdog (IWDG)

使用特权

评论回复
10
feiqi1| | 2016-10-23 18:10 | 只看该作者
今天学习到了看门狗还分独立看门狗和窗口看门狗

使用特权

评论回复
11
androidbus| | 2016-10-23 18:13 | 只看该作者
使用看门狗目的是当程序走入死循环或者硬件异常时,可以自动复位。

使用特权

评论回复
12
litengg| | 2016-10-23 18:14 | 只看该作者
看门狗用的很多,原来功能也很强大呀

使用特权

评论回复
13
Bjorn| | 2016-10-23 20:22 | 只看该作者

独立看门狗使用的是独立时钟源,不受系统时钟影响

使用特权

评论回复
14
robter| | 2016-10-24 07:59 | 只看该作者
很好很好,学习了

使用特权

评论回复
15
309030106| | 2016-10-26 22:00 | 只看该作者
窗口看门狗的时钟源为APB1时钟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

1557

帖子

2

粉丝