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 

原文地址:https://www.cnblogs.com/zengsf/p/7201611.html