窗口看门狗 WWDG
一,窗口看门狗
二,喂狗注意事项
三,程序设计
1.检查复位状态,有助于观察当前工作的可靠性
/* Check if the system has resumed from WWDG reset ,检查是否窗口看门狗导致的复位,如果发现由窗口看门狗导致的复位,输出打印信息*/if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET){ /* WWDGRST flag set */printf("wwdg reset cpu\r\n");/* Clear reset flags */RCC_ClearFlag();}else{/* WWDGRST flag is not set */printf("normal reset cpu\r\n");}delay_ms(500);delay_ms(500);
2. 看门狗的初始化
/* WWDG configuration ,窗口看门狗的配置*//* Enable WWDG clock ,使能看门狗的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);/* 窗口看门狗的时钟 = (PCLK1 (42MHz)/4096)/8 = 1281 Hz (~780 us) */WWDG_SetPrescaler(WWDG_Prescaler_8);/* Set Window value to 80; WWDG counter should be refreshed only when the counteris below 80 (and greater than 0x40) otherwise a reset will be generated 设置窗口的上限值为80*/WWDG_SetWindowValue(80);/* 设置计数值的初值为127,则窗口看门狗的超时时间 = 780 us * 64 = 49.92 ms 这个时候窗口刷新时间如下~780 * (127-80) = 36.6ms < refresh window < ~780 * 64 = 49.9ms*/WWDG_Enable(127);//WWDG NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //窗口看门狗中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //清空提前唤醒中断标志位 WWDG_ClearFlag();//使能提前唤醒中断WWDG_EnableIT();
3. 看门狗中断服务函数
void WWDG_IRQHandler(void) {if(WWDG_GetFlagStatus()==SET){//进行喂狗WWDG_SetCounter(127);//清空提前唤醒中断标志位 WWDG_ClearFlag(); } }
![](/assets/blank.gif)
![](/assets/blank.gif)
#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_usart.h" #include "stdio.h" #include "sys.h"static GPIO_InitTypeDef GPIO_InitStructure; static USART_InitTypeDef USART_InitStructure; static NVIC_InitTypeDef NVIC_InitStructure; //重定义fputc函数 int fputc(int ch, FILE *f) { USART_SendData(USART1,ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; } void delay_us(uint32_t nus) { uint32_t temp; SysTick->LOAD =SystemCoreClock/8/1000000*nus; //时间加载 SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //使能滴答定时器开始倒数 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器 }void delay_ms(uint16_t nms) { uint32_t temp; SysTick->LOAD=SystemCoreClock/8/1000*nms; //时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //能滴答定时器开始倒数 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器 } void LED_Init(void) { //使能GPIOE,GPIOF时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE); //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //LED0和LED1对应IO口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式,GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,驱动LED需要电流驱动GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIOF,把配置的数据写入寄存器 //GPIOE13,PE14初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //LED2和LED3对应IO口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE,把配置的数据写入寄存器 GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10); //GPIOF9,PF10设置高,灯灭GPIO_SetBits(GPIOE,GPIO_Pin_13 | GPIO_Pin_14); }void USART1_Init(uint32_t baud) {RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10//USART1 初始化设置USART_InitStructure.USART_BaudRate = baud; //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启相关中断//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 }int main(void) { LED_Init(); //系统定时器初始化,时钟源来自HCLK,且进行8分频,//系统定时器时钟频率=168MHz/8=21MHz SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置中断优先级分组2 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//串口1,波特率115200bps,开启接收中断USART1_Init(115200);/* Check if the system has resumed from WWDG reset ,检查是否窗口看门狗导致的复位,如果发现由窗口看门狗导致的复位,输出打印信息*/if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET){ /* WWDGRST flag set */printf("wwdg reset cpu\r\n");/* Clear reset flags */RCC_ClearFlag();}else{/* WWDGRST flag is not set */printf("normal reset cpu\r\n");}delay_ms(500);delay_ms(500);/* WWDG configuration ,窗口看门狗的配置*//* Enable WWDG clock ,使能看门狗的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);/* 窗口看门狗的时钟 = (PCLK1 (42MHz)/4096)/8 = 1281 Hz (~780 us) */WWDG_SetPrescaler(WWDG_Prescaler_8);/* Set Window value to 80; WWDG counter should be refreshed only when the counteris below 80 (and greater than 0x40) otherwise a reset will be generated 设置窗口的上限值为80*/WWDG_SetWindowValue(80);/* 设置计数值的初值为127,则窗口看门狗的超时时间 = 780 us * 64 = 49.92 ms 这个时候窗口刷新时间如下~780 * (127-80) = 36.6ms < refresh window < ~780 * 64 = 49.9ms*/WWDG_Enable(127);//WWDG NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //窗口看门狗中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //清空提前唤醒中断标志位 WWDG_ClearFlag();//使能提前唤醒中断 WWDG_EnableIT();while(1){ #if 0//进行喂狗WWDG_SetCounter(127);//清空提前唤醒中断标志位 WWDG_ClearFlag(); #endif} }void WWDG_IRQHandler(void) {if(WWDG_GetFlagStatus()==SET){//进行喂狗WWDG_SetCounter(127);//清空提前唤醒中断标志位 WWDG_ClearFlag(); } }void USART1_IRQHandler(void) //串口1中断服务程序 {uint8_t d;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断 {} }
wwdg.c
转载于:https://www.cnblogs.com/xiangtingshen/p/10964839.html
窗口看门狗 WWDG相关推荐
- STM32—窗口看门狗(WWDG)
STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) STM32-窗口看门狗(WWDG) 窗口看门狗(WWDG) WWDG 简介 WWDG 功能框图剖析 窗口看门狗时钟 计数器时钟 计数器 窗口 ...
- 【STM32】窗口看门狗 WWDG 实验代码详解
文章目录 main.c wwdg.c wwdg.h main.c #include "led.h" #include "delay.h" #include &q ...
- STM32学习笔记——窗口看门狗WWDG介绍及配置
WWDG 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在T6位(WWDG->CR 的第六位)变成0前被刷新,看门狗 ...
- 【STM32学习笔记】(15)——窗口看门狗(WWDG)详解
窗口看门狗(WWDG)概述 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在T6位变成0前被刷新,否则看门狗电路在达到预置 ...
- 7、【STM32】独立看门狗和窗口看门狗(IWDG、WWDG)实验
前言 使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx 学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接. 注:本文档添加了对代码的在线调试功能,有助 ...
- 独立看门狗和窗口看门狗的区别
独立看门狗(IWDG--Independent watchdog):使用外部的的时钟,芯片的主频不工作了也能正常工作.只有喂狗时间的上限,没有下限.即如果上限是1s,只需在1s内喂狗看门狗就正常,两次 ...
- STM32—看门狗详解入门(独立看门狗、窗口看门狗)
目录 一.什么是看门狗? 二.独立看门狗IWDG 1.特点.本质及原理 2.配置 3.main.c代码 三.窗口看门狗WWDG 1.特点.本质及原理 2.配置 3.main.c代码 四.独立看门狗与窗 ...
- STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
版权声明:本文为博主原创文章,欢迎转载 https://blog.csdn.net/ZLK1214/article/details/78308058 程序开启了WWDG的Early wakeup ...
- WWDG 窗口看门狗 知识详解
目录 1. WWDG简介 2. WWDG功能框图解析 3. 启动方式 (1)软件启动 (2)硬件启动 4. WWDG超时图解及超时时间计算 1. WWDG简介 独立看门狗(Independent Wa ...
最新文章
- 帮朋友招聘赴北京微软ASP.NET开发工程师
- IT菜鸟,希望大家赐教
- Win7部署基础知识(7):使用Imagex捕获和安装映像
- zabbix 监控 elasticsearch
- python兼职 在家工作-在家兼职的人或者是自由职业的人都在做什么?
- STM32 电机教程 22 - 基于ST MCLIB无感FOC算法变有感(HALL)FOC算法
- WIN10 OpenGL GLFW+GLAD 开发环境搭建
- Java基础提升篇:equals()方法和“==”运算符
- 实现业务数据的同步迁移 · 思路一
- hiho一下 第六十六周
- IOS发布应用照片大小
- TimescaleDB 简单试用
- javascript基础之拖拽(1)(详细篇)--dataTransfer对象
- 更新CocoaPods1.1.0碰到的问题及知识点
- 数据结构1800题-错题集-第七章
- pycharm-.db文件打不开问题
- ETL过程中数据清洗(脏数据处理)小结
- onvif python3 推送音频_Python3-onvif协议之相机截图
- 怎么理解本征无序态的蛋白质(Intrinsically disordered proteins)
- 【爬虫】哔哩哔哩校园招聘信息
热门文章
- LeetCode 383. 赎金信
- 蝶变 java_蝶变(Debian)_Xfce_新立得软件管理_安装不上软件了,怎么处理?
- 【区块链108将】天算汪波:区块链为预测市场创造了新的交易场景
- TensorFlow BERT fine-tune 训练中断解决办法 或 使用开源模型继续fine-tune 参数配置
- 使用alertmanager对监控对象进行报警(邮件)二
- 数字以及字符串的排序
- SSH登录Linux的两种方式
- 医学图像分割的半监督学习综述
- 企业如何实现便捷化文档管理
- Captcha验证码使用,算术,中文,数字