1. IWDG是什么?
IWDG本质上就是定时器,只不过这个定时器比较特殊不会自动将重装载值写入计数器中。一旦开启需要在其计数器为0前将其重装载值重新写入计数器中,否则到0时会产生一个复位操作,所以该定时器因其功能被形象的叫做看门狗,即需要在骨头啃完前给它替换一个新骨头。
2. IWDG的特性
(1)IWDG的时钟源是LSI(内部低速时钟),可在待机和停止模式下运行
(2)IWDG的计数方式为递减计数,并在减到0时产生复位
3. IWDG配置过程以及示例代码
3.1 IWDG的配置流程梳理
配置的流程框图:
IWDG初始化流程:
(1) 开启LSI并等待其准备就绪
(2) 使能对IWDG_PR和IWDG_RLR的写访问(使能后才能对其进行写操作)
(3) 确保RVU和PVU都已复位(复位后才能将值写入)
(4) 写入我们想设置的预分频(IWDG_PR)和重装载值(IWDG_RLR)
(5) 将我们写的重载装值写入计数器
(6) 禁止对IWDG_PR和IWDG_RLR的写访问
(7) 启动IDWG,开始倒计时
相关寄存器功能:
3.2 IWDG初始化示例
//重装载值为x秒
void IWDG_Init(u16 x)
{
//开启LSI时钟
RCC_LSICmd(ENABLE);
//等待LSI准备完毕
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
//打开对预分频和重载值的写访问
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//等待上一次对预分频写值操作完成
while(IWDG_GetFlagStatus(IWDG_FLAG_PVU) == SET);
//32分频
IWDG_SetPrescaler(IWDG_Prescaler_256);
//等待上一次对重载值写值操作完成
while(IWDG_GetFlagStatus(IWDG_FLAG_RVU) == SET);
//设置重载值为1000
IWDG_SetReload(125*x);
//将重装载值写入计数器
IWDG_ReloadCounter();
//关闭对预分频和重载值的写访问
IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable);
//使能独立看门狗
IWDG_Enable();
}