独立看门狗实验
? ? ? 独立看门狗:就是一个12位的递减计数器(最大值为0xFFF),当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作称为喂狗。看门狗功能由VDD电压域供电,在停止模式和待机模式下仍能工作。
键值寄存器IWDG_KR:0~15位有效;
预分寄存器IWDG_PR:0~2位有效;(有写保护功能,要操作先取消写保护)
重装载寄存器IWDG_RLR:0~11位有效;(有写保护功能,要操作先取消写保护)
状态寄存器IWDG_SR:0~1位有效;
1.IWDG独立看门狗操作库函数:
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分组;写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值;写RLR
void IWDG_ReloadCounter(void);//喂狗
void IWDG_Enable(void);//使能看门狗
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频更新
2.独立看门狗操作步骤
- 取消寄存器写保护:WDG_WriteAccessCmd();
- 设置独立看门狗的预分频,确定时钟: IWDG_SetPerscaler();
- 设置看门狗重装载值,确定溢出时间: IWDG_SetReload();
- 使能看门狗: IWDG_Enable();
- 应用程序喂狗: IWDG_ReloadCounter();
溢出时间计算:Tout=((4*2^prer)*rlr)/40
实例:
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
|