stm32 看门狗配置
1.独立看门狗:
1) 取消寄存器写保护(向 IWDG_KR 写入 0X5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能或者失能
2) 设置独立看门狗的预分频系数和重装载值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
注意的是分频的取值范围为0~7,且计算时间为Tout=((4×2^prercaler) ×reload) /40
3) 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
4) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
IWDG_Enable(); //使能 IWDG
这里要注意的是一旦开启了看门狗,就关闭不了了,除非重启。
1 void IWDG_Init(u8 prer,u16 rlr) 2 { 3 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能对寄存器 I 写操作 4 IWDG_SetPrescaler(prer); //②设置 IWDG 预分频值:设置 IWDG 预分频值 5 IWDG_SetReload(rlr); //②设置 IWDG 重装载值 6 IWDG_ReloadCounter(); //③按照 IWDG 重装载寄存器的值重装载 IWDG 计数器 7 IWDG_Enable(); //④使能 IWDG 8 } 9 //喂独立看门狗 10 void IWDG_Feed(void) 11 { 12 IWDG_ReloadCounter();//reload 13 }
2.窗口看门狗:
1) 使能 WWDG 时钟
由于WWDG和IWDG不一样,WWDG使用的是PCLK1时钟,因此使用前要使能时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
2) 设置窗口值和分频数
void WWDG_SetWindowValue(uint8_t WindowValue);
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
3) 开启 WWDG 中断并分组
WWDG_EnableIT(); //开启窗口看门狗中断
接下来是进行中断优先级配置,这里就不重复了,使用 NVIC_Init()函数即可。
4) 设置计数器初始值并使能看门狗
void WWDG_Enable(uint8_t Counter);
5) 编写中断服务函数
1 u8 WWDG_CNT=0x7f; 2 //初始化窗口看门狗 3 //tr :T[6:0],计数器值 4 //wr :W[6:0],窗口值 5 //fprer:分频系数(WDGTB) ,仅最低 2 位有效 6 //Fwwdg=PCLK1/(4096*2^fprer). 7 void WWDG_Init(u8 tr,u8 wr,u32 fprer) 8 { 9 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能 10 WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT. 11 WWDG_SetPrescaler(fprer); //设置 IWDG 预分频值 12 WWDG_SetWindowValue(wr); //设置窗口值 13 WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counter 14 WWDG_ClearFlag(); //清除提前唤醒中断标志位 15 WWDG_NVIC_Init(); //初始化窗口看门狗 NVIC 16 WWDG_EnableIT(); //开启窗口看门狗中断 17 } 18 //重设置 WWDG 计数器的值 19 void WWDG_Set_Counter(u8 cnt) 20 { 21 WWDG_Enable(cnt); //使能看门狗,设置 counter . 22 } 23 //窗口看门狗中断服务程序 24 void WWDG_NVIC_Init() 25 { 26 NVIC_InitTypeDef NVIC_InitStructure; 27 NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断 28 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2 29 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2 30 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 31 NVIC_Init(&NVIC_InitStructure); //NVIC 初始化 32 } 33 void WWDG_IRQHandler(void) 34 { 35 WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位 36 WWDG_ClearFlag(); //清除提前唤醒中断标志位 37 LED1=!LED1; //LED 状态翻转 38 }
知识来源:STM32F1开发指南-库函数版本_V3.1