?? wdg.c
字號:
#include "wdg.h"
#include "led.h"
//Mini STM32開發板
//看門狗 驅動代碼
//V1.2
//加入了窗口看門狗相關函數
//2010/5/31
//初始化獨立看門狗
//prer:分頻數:0~7(只有低3位有效!)
//分頻因子=4*2^prer.但最大值只能是256!
//rlr:重裝載寄存器值:低12位有效.
//時間計算(大概):Tout=40K/((4*2^prer)*rlr)值.
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG->KR=0X5555;//使能對IWDG->PR和IWDG->RLR的寫
IWDG->PR=prer; //LSI/32=40Khz/4*2^pre
IWDG->RLR=rlr; //從加載寄存器 IWDG->RLR
IWDG->KR=0XAAAA;//reload
IWDG->KR=0XCCCC;//使能看門狗
}
//喂獨立看門狗
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload
}
//保存WWDG計數器的設置值,默認為最大.
u8 WWDG_CNT=0x7f;
//初始化窗口看門狗
//tr :T[6:0],用于存儲計數器的值
//wr :W[6:0],用于存儲窗口值
//fprer:窗口看門狗的實際設置
//低2位有效.Fwwdg=PCLK1/4096/2^fprer.
void WWDG_Init(u8 tr,u8 wr,u8 fprer)
{
RCC->APB1ENR|=1<<11; //使能wwdg時鐘
WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
WWDG->CFR|=fprer<<7; //PCLK1/4096再除2^fprer WWDG->CFR|=1<<9; //使能中斷
WWDG->CFR&=0XFF80; WWDG->CFR|=wr; //設定窗口值
WWDG->CR|=WWDG_CNT|(1<<7); //開啟看門狗,設置7位計數器
MY_NVIC_Init(2,3,WWDG_IRQChannel,2);//搶占2,子優先級3,組2
}
//重設置WWDG計數器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG->CR|=(cnt&0x7F);//重設置7位計數器}
//窗口看門狗中斷服務程序
void WWDG_IRQHandler(void)
{
u8 wr,tr;
wr=WWDG->CFR&0X7F;
tr=WWDG->CR&0X7F;
if(tr<wr)WWDG_Set_Counter(WWDG_CNT);//只有當計數器的值,小于窗口寄存器的值才能寫CR!!
WWDG->SR=0X00;//清除提前喚醒中斷標志位
LED1=!LED1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -