简介:窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。
库函数中用中断的方式来喂狗的方法,窗口看门狗库函数相关源码和定义分布在文件stm32f10x_wwdg.c 文件和头文件 stm32f10x_wwdg.h 中。步骤如下:
1)使能 WWDG 时钟
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 中断的函数为:
WWDG_EnableIT(); //开启窗口看门狗中断
接下来是进行中断优先级配置,使用 NVIC_Init()函数即可。
4)设置计数器初始值并使能看门狗
这一步在库函数里面是通过一个函数实现的:
void WWDG_Enable(uint8_t Counter);
该函数既设置了计数器初始值,同时使能了窗口看门狗。
5)编写中断服务函数
在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。
完成了以上 5 个步骤之后,我们就可以使用 STM32 的窗口看门狗了。
1.static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大. */
2.
3./**
4. * 初始化窗口看门狗
5. * tr :T[6:0],计数器值
6. * wr :W[6:0],窗口值
7. * fprer:分频系数(WDGTB),仅最低2位有效
8. * Fwwdg=PCLK1/(4096*2^fprer).
9. */
10.void WWDG_Init(u8 tr,u8 wr,u32 fprer)
11.{
12.// RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /*WWDG时钟使能*/
13.
14. WWDG_SetPrescaler(fprer); /*设置IWDG预分频值*/
15. WWDG_SetWindowValue(wr); /*设置窗口值*/
16.
17. WWDG_CNT=tr&WWDG_CNT; /* 初始化WWDG_CNT. */
18. WWDG_Enable(WWDG_CNT); /*使能看门狗 , 设置 counter . */
19. WWDG_ClearFlag(); /*清除提前唤醒中断标志位*/
20.
21. WWDG_NVIC_Init();/* 初始化窗口看门狗 NVIC */
22. WWDG_EnableIT(); /* 开启窗口看门狗中断 */
23.}
24.
25./**
26. * 窗口看门狗中断服务程序
27. */
28.void WWDG_NVIC_Init(void)
29.{
30. NVIC_InitTypeDef NVIC_InitStructure;
31. NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; /*WWDG中断*/
32. /* 抢占2,子优先级3 */
33. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
34. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
35. NVIC_Init(&NVIC_InitStructure);/* NVIC初始化*/
36.}
37.
38./**
39. * 重设置WWDG计数器的值
40. */
41.void WWDG_Set_Counter(u8 cnt)
42.{
43. WWDG_Enable(cnt); /*使能看门狗 , 设置 counter . */
44.}
45.
46./**
47. * 看门狗中断服务程序
48. */
49.void WWDG_IRQHandler(void)
50.{
51. WWDG_Set_Counter(WWDG_CNT);
52. WWDG_ClearFlag(); /*清除提前唤醒中断标志位*/
53. LED1 = ~LED1; /*LED状态翻转 */
54.}
调用:WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);/* 计数器值为 7f,窗口寄存器为 5f,分频数为 8 */
上一篇:关于SYSTick的一些问题
下一篇:关于STM32的systick定时器的详细说明
推荐阅读最新更新时间:2024-10-27 13:49
设计资源 培训 开发板 精华推荐
- KIT33912EVME,用于 MC33912 SBC、直流电机预驱动器的评估套件
- LT8390IUFD 98% 效率、48W、12V/4A 微型降压-升压稳压器的典型应用电路
- LTM4643MPV 4V 至 20V 输入、4 相、1.2V/12A 降压稳压器的典型应用,具有温度监控功能
- #第五届立创电子设计大赛#直流可调电源
- LTM8067EY 2kVAC 隔离模块稳压器的典型应用电路
- 【武汉理工大学电子设计竞赛校赛】 BTN驱动
- 使用 Analog Devices 的 ADL5902ACPZ-R7 的参考设计
- TEA1721通用市电白色家电反激SMPS演示板
- MIKROE-3500,用于 STM32 STM32F205ZG 的 MCU 卡
- ZR431GTA 可调精密齐纳并联稳压器的典型应用