14.4.2 窗口看門狗實驗
功能:程序一運行使得接在PB5上的LED1亮300ms后關(guān)閉,進入死循環(huán)。等待WWDG中斷的到來,在中斷里面,喂狗,并對PE5上的LED2進行翻轉(zhuǎn)操作??梢钥吹絃ED2不停的閃爍,LED1只在剛啟動的時候閃一下。
(1)在上一個實驗的wdg.h文件的函數(shù)列表區(qū)域添加以下代碼。
void WWDG_Init( u8 tr, u8 wr, u8 fprer ) ; //窗口看門狗初始化
(2)在上一個實驗的wdg.c文件末尾添加以下代碼。
/***************************************************
Name :WWDG_IRQHandler
Function :窗口看門狗中斷服務(wù)程序
Paramater :None
Return :None
***************************************************/
void WWDG_IRQHandler()
{
WWDG->CR = 0x7F ; //重設(shè)置7位計數(shù)器
WWDG->SR = 0x00 ; //清除提前喚醒中斷標(biāo)志位
LED2 != LED2 ;
}
/***************************************************
Name :WWDG_Init
Function :窗口看門狗初始化
Paramater :
tr:計數(shù)器值
wr:窗口值
fprer:分頻系數(shù)
Return :None
***************************************************/
void WWDG_Init( u8 tr, u8 wr, u8 fprer )
{
RCC->APB1ENR |= 1<<11 ; //使能wwdg時鐘
WWDG->CFR |= fprer<<7 ; //PCLK1/4096再除2^fprer
WWDG->CFR &= 0xFF80 ;
WWDG->CFR |= wr ; //設(shè)定窗口值
WWDG->CR |= tr&0x7F ; //設(shè)定計數(shù)器值
WWDG->CR |= 1<<7 ; //開啟看門狗
NVIC_Init( 2, 3, WWDG_IRQn, 2 ) ; //搶占2,子優(yōu)先級3,組2
WWDG->SR = 0x00 ; //清除提前喚醒中斷標(biāo)志位
WWDG->CFR |= 1<<9 ; //使能提前喚醒中斷
}
注:由于在中斷服務(wù)函數(shù)中引用了LED2,所以需要添加頭文件#include “l(fā)ed.h”。
(3)創(chuàng)建led.h文件,并輸入以下代碼。
#ifndef _LED_H_
#define _LED_H_
#include "sys.h"
/*********************************************************************************************************
硬 件 端 口
*********************************************************************************************************/
#define LED1 PBout( 5 ) //定義LED1端口
#define LED2 PEout( 5 ) //定義LED2端口
/*********************************************************************************************************
函 數(shù) 列 表
*********************************************************************************************************/
void LED_Init( void ) ; //LED初始化
#endif
(4)創(chuàng)建led.c文件,并輸入以下代碼。
#include "led.h"
/***************************************************
Name :LED_Init
Function :LED初始化
Paramater :None
Return :None
***************************************************/
void LED_Init()
{
RCC->APB2ENR |= 1<<3 ;
GPIOB->CRL &= 0xFF0FFFFF ;
GPIOB->CRL |= 0x00300000 ;
RCC->APB2ENR |= 1<<6 ;
GPIOE->CRL &= 0xFF0FFFFF ;
GPIOE->CRL |= 0x00300000 ;
LED1 = 1 ;
LED2 = 1 ;
}
(5)在1.c文件中輸入以下代碼。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "led.h"
#include "wdg.h"
/***************************************************
Name :main
Function :主函數(shù)
Parameter :None
Return :None
***************************************************/
int main()
{
STM32_Clock_Init( 9 ) ; //STM32時鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LED_Init() ; //LED初始化
LED1 = 0 ; //點亮DS0
delay_ms( 300 ) ; //延時300ms,讓人可以看到DS0亮的狀態(tài)
WWDG_Init( 0x7F, 0x5F, 3 ) ; //計數(shù)器值為7f,窗口寄存器為5f,分頻數(shù)為8
while( 1 )
{
LED1 = 1 ; //熄滅LED1
}
}
14.5 為何STM32要同時存在窗口看門狗與獨立看門狗
14.5.1 獨立看門狗的使用條件
(1)程序跑飛
(2)出現(xiàn)死循環(huán)
(3)睡眠與休眠不合理
(4)外部主晶振損壞
(5)需要重新復(fù)位,且不保留任何數(shù)據(jù)
14.5.2 窗口看門狗使用條件
(1)軟件邏輯出現(xiàn)錯誤
(2)死機或者死循環(huán)
(3)軟件執(zhí)行不按預(yù)期效果執(zhí)行
(4)軟件需要重新復(fù)位,但是保留所有數(shù)據(jù)
14.5.3 兩者的區(qū)別
(1)獨立看門狗使用內(nèi)部專用40kHz低速時鐘
窗口看門狗則使用PCLK1的時鐘
(2)獨立看門狗沒有中斷,超時直接復(fù)位
窗口看門狗有中斷,超時可以在中斷服務(wù)函數(shù)中操作或者喂狗
(3)獨立看門狗一般用于避免程序跑飛或者死循環(huán)
窗口看門狗則是為了避免程序不按照預(yù)先設(shè)定的邏輯執(zhí)行
(4)獨立看門狗是12位遞減操作
窗口看門狗則是6位遞減操作
-
單片機
+關(guān)注
關(guān)注
6059文章
44828瀏覽量
645034 -
看門狗
+關(guān)注
關(guān)注
10文章
577瀏覽量
71475 -
STM32
+關(guān)注
關(guān)注
2285文章
10987瀏覽量
361477 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2283瀏覽量
95869 -
定時器
+關(guān)注
關(guān)注
23文章
3273瀏覽量
116821
發(fā)布評論請先 登錄
STM32中的獨立看門狗和窗口看門狗是什么

ALIENTEK_MINISTM32_實驗5_獨立看門狗實驗
ALIENTEK_MINISTM32_實驗6_窗口看門狗實驗
stm32看門狗時間計算 獨立看門狗和窗口看門狗的特性是什么
STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)

STM32的看門狗配置詳情解說

基于STM32、FreeRTOS 實現(xiàn)硬件看門狗+軟件看門狗監(jiān)測多任務(wù)的方法
MCU學(xué)習(xí)筆記_IWDG獨立看門狗

STM32學(xué)習(xí)心得十六:獨立看門狗實驗

評論