IWDG主要性能:
• 自由运行的递减计数器
• 时钟由独立的振荡器提供(可在停止和待机模式下工作)
• 看门狗被激活后,则在计数器计数至0x0000 时产生复位。
IWDG功能描述:
在键寄存器(IWDG_KR)中写入0xCCCC。开始启动独立看门狗;此时计数器开始从其复位值0xFFF 递减计数。当计数器计数到末尾0x000 时,会产生一个复位信号(IWGD_RESET)。无论何时,只要在键寄存器IWDG_KR 中写入0xAAAA,IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位。
看门狗寄存器保护:
IWDG_PR 和IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。状态寄存器指示预分频值和递减计数器是否正在被更新。
下图为预分频寄存器IWDG_PR
由上图可知分频系数有最低的三位来决定4-256分频
独立看门狗(IWDG)
Tout=((4×2^prer) ×rlr) /40Khz
独立看门狗由内部专门的 40Khz 低速时钟(LSI)驱动。
其中 Tout 为看门狗溢出时间(单位为 s);
prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;
(4×2^prer)整体为实际预分频值,预分频值可取值为4/8/16/32/64/128/256。
rlr 为看门狗的重装载值(IWDG_RLR 的值);
#include "WWDG.h"
#include "led.h"
void wwdg_init(u8 prer,u16 rlr)
{
RCC->CSR|=RCC_CSR_LSION;//开启内部低速时钟
IWDG->KR=0X5555;//使能对IWDG->PR和IWDG->RLR的写
IWDG->PR=prer; //设置分频系数
IWDG->RLR=rlr; //从加载寄存器 IWDG->RLR
IWDG_Feed();//reload
IWDG->KR=0XCCCC;//使能看门狗
}
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload
}
int main(void)
{
u8 flage=0;
delay_init(); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
uart_nvic_init(SystemCoreClock/1000000,115200); //串口初始化为115200
LED1=1;
KEY_Init();
printf("uart ok!\r\n");
wwdg_init(4,625);
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)//按键喂狗函数
{
flage=30;
IWDG_Feed();
LED1=0;
}
delay_ms(500);
if (flage>0)
{
flage--;
IWDG_Feed();
printf("IWDG_Feed ok!\r\n");
}
}
}
看门狗的时间的计算在上面我们已经给出了计算的方法,大家看不懂的结合上面的计算过程看一下