STM32F10x系列内置有两个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。
独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。但是,独立看门狗的时钟并不是准确的40Khz,而是在30~60Khz之间变化的一个时钟。
使用独立看门狗我们需要用到几个寄存器:
1)键寄存器(IWDG_KR),在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从复位值0xFFF递减计数。当计数器计数到末尾0x00时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR总被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
2)预分频寄存器(IWDG_PR),低3位有效,具有写保护功能。要改变预分频因子,I状态寄存器(WDG_SR)的PVU位必须为0.
3)重装载寄存器(IWDG_RLR)低12位有效,具有写保护功能。每当向键寄存器(IWDG_KR)写入0xAAAA时,重装载值会被传送到计数器中,随后计数器从这个值开始递减计数。
启动独立看门狗需要进行一下操作:
1)向键寄存器(IWDG_KR)写入0x5555,通过写入值取消预分频寄存器(IWDG_PR)和重装载寄存器(IWDG_RLR)的写保护。喂狗时间:Tout=40Khz/(4*2^prer)*rlr)
2)向键寄存器(IWDG_KR)写入0xAAAA,是STM32重新加载IWDG_RLR的值到看门狗计数器里面。
3)向键寄存器(IWDG_KR)写入0xCCCC,启动STM32的看门狗。
参考程序:
/***************************************************************************************
****************************************************************************************
* FILE : IWDG.c
* Description : Init Independent watchdog
* prer:Prescaler : 0~7 (the last 3 bit are effective)
* Division factor=4*2^prer. <=256
* rlr::IWGD_RLR: low 12 bit are effective
* Time calculate: Tout=40K/((4*2^prer)*rlr)
*
* Study STM32 record.
*
* History:
LED0 PB.0
KEY01 PB.5
KEY00 PB.4
KEY10 PC.10
* Version Name Date Description
1.0 Penny 2013/6/18
****************************************************************************************
****************************************************************************************/
#include "ms5.h"
void IWDG_Init(u8 prer, u16 rlr)
{
IWDG->KR=0x5555; //使能预分频寄存器IWDG->PR 和重装载寄存器IWDG->RLR写功能
IWDG->PR=prer; //设置预分频值: LSI/32=40Khz/4*2^pre
IWDG->RLR=rlr; //设置重加载值: 重加载寄存器IWDG->RLR
IWDG->KR=0xAAAA; //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG->KR=0xCCCC; //使能看门狗
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG->KR=0xAAAA; //reload
}
|