一.简介
STM32有两个看门狗:独立看门狗(IWDG),窗口看门狗。独立看门狗是一个12位的递减计数器,当计数器的值从某个值减到0的时候,系统产生复位信号
二IWDG功能剖析
1.独立看门狗时钟
IWDG的clock由Independent的RC振荡器LSI提供,独立的 ,频率为30-60khz,一般40khz,所以IWDG的定时实际不是非常精准,使用低精度
2.count clock
递减count的clock由LSI(Low Speed Internal)经过8bit的Prescaler得到,我们operate presacler register IWDG_PR设置分频因子,因子[4,8,16,32,64,128,256],CK_CNT=40/(4*2^PRV)(Prescaler Value),一个CNT Clock-> cnt-1
3.CNT
它是一个12bit的递减CNT,MAX=0XFF,减到0,产生IWDG_RESET,重新启动,刷新CNT value的动作“喂狗”
4.Reload Register
里面装着刷新到CNT的值,值得大小决定独立看门狗的溢出时间,T_out = (4*2^prv)/40*rlv
5.键寄存器
属于Control Register,三种模式
6.Status Register
SR只有bit 0,PVU和bit 1
三实战
IWDG属于单片机内部资源,只需要一个外部按键和LED
(1)IWDG配置函数
voidIWDG_Config(uint_8 prv,uint16_t rlv)
{
//使能PR and RLR可写
IWDG_WriteAcessCmd( IWDG_WriteAcess_Enable);
//sset prescaler value
IWDG_SetPresacler(prv);
//set Reload value
IWDG_ReloadCounter();
//enable IWDG
IWDG_Enable;
}
(3)喂狗函数
void IWDG_Feed(void)
{
//RLR的value to CNT,w喂狗,放置Reset
//CNT->0 --- Reset
IWDG_ReloadCounter();
}
(3)main函数
int main()
{
LED_Config();
Delay(0x8FFFFF);
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != REST)
{
LED_RED;
RCC_ClearFlag();
}
else
{
LED_BLUE;
}
Key_GPIO_Config();
IWDG_Config(IWDG_Prescaler_64,625)//t=RLR/f=625/40000/64=1s
while(1)
{
if(Key_Scan(PA,PA13) == KEY_ON)
{
IWDG_FEED;
LED_GREEN;
}
}
}
}