00 .目錄文章目錄00 .目錄01 .窗口監(jiān)控概述02 .硬件設計03 .編程步驟04 .程序示例05 .測試結果06 .附錄07 .聲明
01 .窗口監(jiān)控介紹
窗口監(jiān)視(WWDG )通常用于監(jiān)視由于外部干擾或意外邏輯條件而導致的APP應用程序脫離正常操作序列而出現(xiàn)的軟件故障。 除非倒計時計數器的值在T6位(WWDG-CR的第6位)為0之前刷新,否則看門狗電路在達到預設時間時將發(fā)生MCU復位。 在遞減計數器達到窗口配置寄存器(WWDG-CFR )的值之前,如果刷新7位遞減計數器值(控制寄存器),也會發(fā)生MCU復位。 這表明遞減計數器必須在有限的時間窗口中刷新。 他們的關系可以在圖12.1.1中說明:
在圖12.1.1中,T[6:0]是WWDG_CR的后7位,W[6:0]是WWDG-CFR的后7位。 T[6:0]是窗口監(jiān)視的計數器,W[6:0]是窗口監(jiān)視的上窗口,并且下窗口的值是固定的(0X40 )。 當窗口監(jiān)視的計數器刷新到頂部窗口值以外或低于底部窗口值時,將發(fā)生復位。
上窗口值(W[6:0] )由用戶自行設置,根據實際要求設計窗口值,但請確保窗口值大于0X40。 否則,窗口就不存在了。
看門狗的超時公式如下。
twwdg=(40962^wdgTB) t[5:0]1)/Fpclk1;
其中:
Twwdg:WWDG超時時間(單位為毫秒)。
Fpclk1:APB1的時鐘頻率(單位為Khz ) )。
WDGTB:WWDG預分頻系數
T[5:0] :監(jiān)視窗口的計數器低6位
02 .硬件設計本實驗使用的硬件資源如下:
1 )指示燈DS0和DS1
2 )窗口監(jiān)控
窗口監(jiān)視是STM32F4的內部資源,僅通過軟件設置即可正常工作。
03 .編程步驟1) 使能 WWDG 時鐘
wdg與IWDG不同,IWDG有自己的32Khz時鐘,沒有啟用問題。 WWDG使用的是PCLK1時鐘,因此必須首先啟用時鐘。
RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ wwdg,ENABLE ); //WWDG時鐘使能2) 設置窗口值和分頻數
設定窗口值的函數如下。
voidwwdg _ setwindowvalue (uint8_ twindowvalue; 該函數的一個條目參數是窗口值,很容易理解。
設定分頻數的函數如下。
voidwwdg _ set prescaler (uint 32 _ tw wdg _ prescaler; 此函數只有一個入口參數:分頻值。
3) 開啟 WWDG 中斷并分組
打開WWDG中斷的函數如下。
WWDG_EnableIT (; //打開窗口監(jiān)視中斷,然后配置中斷優(yōu)先級,但這里不重復。 NVIC_Init ) )函數就可以了。
4) 設置計數器初始值并使能看門狗
這個步驟是由庫函數中的函數實現(xiàn)的。
voidwwdg_enable(uint8_tcounter ); 該函數在設定計數器初始值的同時,啟用窗口監(jiān)視。
庫函數還提供了用于設置計數器值的獨立函數。
voidwwdg _ set counter (uint8_ t counter;5) 編寫中斷服務函數
最后,還是為窗口監(jiān)視創(chuàng)建中斷服務函數。 用這個函數喂狗。 請快點喂狗。 否則,當窗口看門狗計數器的值減少到0X3F時,將引起軟復位。 在中斷服務函數中也清空狀態(tài)寄存器的EWIF位。
04 .程序示例wwdg.h
# ifndef _ wwdg _ h _ # define _ _ wwdg _ h _ # include ' sys.h ' /初始化函數voidwwdg_init(8tr、u8 wr、u32 //中斷處理# endif/* _ wwdg _ h _ */http://www.Sina.com /
# include ' wwdg.h ' # include ' led.h ' /保存wwdg計數器的設置值默認為最多. u8 WWDG_CNT=0X7F; //初始化函數//tr計數器的值//wr窗口值//fprer預分頻值voidwwdg_init(U8tr、u8 wr、u32fp rer (nvic _ inittypedefnvic _ init strer 啟用WWDG時鐘RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ wwdg,啟用); //設置預分頻wwdg_setprescaler(FPrer ); //設置窗口值wwdg_setwindowvalue(wrwwdg_CNT )//啟用看門狗wwdg_enable(wwdg_CNT ); //中斷nvic _ init struct.nvic _ IRQ channel=wwdg _ irqn; nvic _ init struct.nvic _ irqchannelcmd=enable; nvic _ init struct.nvic _ irqchannelpreemptionpriority=2; nvic _ init struct.nvic _ irqchannelsubpriority=2; nvic_init(nvic_initstruct; //清除早期喚醒中斷標志位WWDG_ClearFlag (; //打開早期喚醒中斷WWDG_EnableIT; //中斷處理函數voidwwdg_IRQHandler(void )//早期喚醒中斷標志WWDG_ClearFlag ); wdg_setcounter(wwdg_CNT; LED2=! LED2; } main.c
# include ' sys.h ' # include ' delay.h ' # include ' usart.h ' # include ' led.h ' # include ' BEP.h ' delay_init(168; LED_Init (; KEY_Init (; LED1=0; LED2=0; elay_ms(300; wdg_init(0x7f,0X5F,WWDG_Prescaler_8); //計數器值為7f,窗口寄存器為5f,分頻為8瓦時(1) {LED1=1; }05 .測試結果顯示,DS0點亮后立即熄滅,之后DS1繼續(xù)閃爍。 一秒鐘閃爍20次左右。
06 .附錄wwdg.c
URL:【STM32】STM32系列教程總結
07 .聲明本教程參考了正點原子《STM32 F4 開發(fā)指南》