找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1987|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32之窗口看門狗

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-4 20:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)驗(yàn)現(xiàn)象:
這是基于窗口看門狗的實(shí)驗(yàn),剛開始初始化時(shí)LED2閃了一下,后來就保持亮著,而LED1卻不斷的在閃爍,這是因?yàn)橹袛嗪瘮?shù)運(yùn)行的緣故。

實(shí)驗(yàn)平臺(tái):
基于STM32F103C8T6的彩屏開發(fā)板

實(shí)驗(yàn)步驟:
1)使能WWDG 時(shí)鐘
WWDG 不同于IWDG,IWDG 有自己獨(dú)立的40Khz 時(shí)鐘,不存在使能問題。而WWDG
使用的是PCLK1 的時(shí)鐘,需要先使能時(shí)鐘。
2)設(shè)置WWDG_CFR 和WWDG_CR 兩個(gè)寄存器
在時(shí)鐘使能完后,我們?cè)O(shè)置 WWDG 的CFR 和CR 兩個(gè)寄存器,對(duì)WWDG 進(jìn)行配置。包
括使能窗口看門狗、開啟中斷、設(shè)置計(jì)數(shù)器的初始值、設(shè)置窗口值并設(shè)置分頻數(shù)WDGTB 等。
3)開啟WWDG 中斷并分組
在設(shè)置完了 WWDG 后,需要配置該中斷的分組及使能。這點(diǎn)通過我們之前所編寫的
MY_NVIC_Init 函數(shù)實(shí)現(xiàn)就可以了。
4)編寫中斷服務(wù)函數(shù)
在最后,還是要編寫窗口看門狗的中斷服務(wù)函數(shù),通過該函數(shù)來喂狗,喂狗要快,否則當(dāng)
窗口看門狗計(jì)數(shù)器值減到0X3F 的時(shí)候,就會(huì)引起軟復(fù)位了。在終端服務(wù)函數(shù)里面也要將狀態(tài)
寄存器的EWIF 位清空。

實(shí)驗(yàn)代碼:
         wwdg.h
#ifndef WWDG_H
#define WWDG_H
void WWDG_Init(u8,u8,u8);//聲明看門狗的初始化函數(shù)
void WWDG_Reset(void);//重新給遞減計(jì)數(shù)器賦值
#endif


         wwdg.c
#include"common.h"
#include"wwdg.h"
#include"led.h"
//tr :T[6:0],用于存儲(chǔ)計(jì)數(shù)器的值
//wr :W[6:0],用于存儲(chǔ)窗口值
//fprer:窗口看門狗的實(shí)際設(shè)置
u8 WWDG_CNT=0x7f;
void WWDG_Init(u8 tr ,u8 wr,u8 fprer )
{
RCC->APB1ENR|=1<<11; //開啟窗口看門狗的時(shí)鐘
WWDG_CNT=tr&WWDG_CNT; //主要是為了防止用戶寫錯(cuò)數(shù)據(jù)造成巨大偏差
WWDG->CFR|=fprer<<7; //預(yù)分頻時(shí)基設(shè)置
WWDG->CFR|=1<<9;  //開啟提前喚醒中斷
WWDG->CFR&=0xff8;   //保證上面兩個(gè)設(shè)置的正確性
WWDG->CFR|=wr;    //給遞減計(jì)數(shù)器賦初值
WWDG->CR|=WWDG_CNT;   //給窗口寄存器賦值
WWDG->CR|=1<<7;   //啟用看門狗
MY_NVIC_Init(2,3,WWDG_IRQChannel,2);//設(shè)置中斷的分組和優(yōu)先級(jí)
}
//重新給遞減計(jì)數(shù)器賦值
void WWDG_Reset(void)
{
WWDG->CR=0x7f;
}
//中斷服務(wù)函數(shù)
void WWDG_IRQHandler(void)
{
u8 tr,wr;
tr=(WWDG->CR&0x7f);//讀取窗口寄存器的值
wr=(WWDG->CFR&0x7f);//讀取遞減計(jì)數(shù)器的值
if(tr<wr)//當(dāng)遞減計(jì)數(shù)器的值小于窗口的才能給遞減計(jì)數(shù)器重新復(fù)制,不然會(huì)復(fù)位的
  WWDG_Reset();
WWDG->SR=0x0; //去除提前喚醒中斷標(biāo)志
LED1=!LED1;  //LED反向
}

第一個(gè)函數(shù)void WWDG_Init(u8 tr,u8 wr,u8 fprer)用來
設(shè)置WWDG的初始化值。包括看門狗計(jì)數(shù)器的值和看門狗比較值等。注意到這里有個(gè)全局變量WWDG_CNT,該變量用來保存最初設(shè)置WWDG_CR計(jì)數(shù)器的值。在后續(xù)的中斷服務(wù)函數(shù)里面,就又把該數(shù)值放回到WWDG_CR上。
WWDG_Set_Counter 函數(shù)比較簡(jiǎn)單,就是用來復(fù)位窗口看門狗的計(jì)數(shù)器值的。該函數(shù)很簡(jiǎn)
單。
最后中斷服務(wù)函數(shù)里面,一定要先比較窗口計(jì)數(shù)器的值是否小于看門狗的窗口值,如果不
小于,則不要修改,如果小于,才能進(jìn)行修改。我們通過LED1 不停的取反,來觀測(cè)中斷服務(wù)函
數(shù)的執(zhí)行了狀況。我們?cè)侔堰@幾個(gè)函數(shù)名加入到頭函數(shù)里面去,以方便其他文件調(diào)用。


       主函數(shù)
#include<stm32f10x_lib.h>
#include"common.h"
#include"led.h"
#include"key.h"
#include"wwdg.h"
int main(void)
{
Stm32_Clock_Init(9);  //系統(tǒng)時(shí)鐘設(shè)置
delay_init(72);   //延時(shí)初始化
LED_Init();    //LED初始化
KEY_Init();  //按鍵的初始化
WWDG_Init(0x7f,0x5f,3);
LED2=0;
delay_ms(300);
while(1)
{
  LED2=1;  
}
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表