1. 概述
STM32有兩個看門狗,一個是獨立看門狗,另外一個是窗口看門狗,獨立看門狗號稱寵物狗,窗口看門狗號稱警犬。
一般情況下,使用頻次較高是獨立看門狗,也即是通常意義的看門狗。
2. 獨立看門狗(IWDG)
一個12位的遞減計數器,最大值為0XFFF,當計數器的值從某個值一直減到0的時候,系統就會產生一個復位信號,即IWDG_RESET。如果在計數沒減到0之前,刷新了計數器的值的話,那么就不會產生復位信號,這個動作就是我們經常說的喂狗。看門狗功能由 VDD 電壓域供電,在停止模式和待機模式下仍能工作.
看門狗時鐘
獨立看門狗的時鐘由獨立的RC振蕩器LSI提供,即使主時鐘發生故障它仍然有效,非常獨立。LSI的頻率一般在30~60KHZ之間,根據溫度和工作場合會有一定的漂移,我們一般取40KHZ,所以獨立看門狗的定時時間并一定非常精確,只適用于對時間精度 要求比較低的場合。
計數器時鐘
遞減計數器的時鐘由LSI經過一個8位的預分頻器得到,我們可以操作預分頻器寄存器IWDG_PR來設置分頻因子,分頻因子可以是:[4,8,16,32,64,128,256,256],計數器時鐘CK_CNT= 40/ 4*2^PRV,一個計數器時鐘計數器就減一。
鍵寄存器
一旦獨立看門狗啟動,它就關不掉,只有復位才能關掉
應用場景
獨立看門狗一般用來檢測和解決由程序引起的故障。
PS: 可以在系統上電開始的時候檢查是否因看門狗引起的復位【RCC_GetFlagStatus(RCC_FLAG_IWDGRST)】
代碼實例
/*
* 設置 IWDG 的超時時間
* Tout = prv/40 * rlv (s)
* prv可以是[4,8,16,32,64,128,256]
* prv:預分頻器值,取值如下:
* @arg IWDG_Prescaler_4: IWDG prescaler set to 4
* @arg IWDG_Prescaler_8: IWDG prescaler set to 8
* @arg IWDG_Prescaler_16: IWDG prescaler set to 16
* @arg IWDG_Prescaler_32: IWDG prescaler set to 32
* @arg IWDG_Prescaler_64: IWDG prescaler set to 64
* @arg IWDG_Prescaler_128: IWDG prescaler set to 128
* @arg IWDG_Prescaler_256: IWDG prescaler set to 256
*
* 獨立看門狗使用LSI作為時鐘。
* LSI 的頻率一般在 30~60KHZ 之間,根據溫度和工作場合會有一定的漂移,我
* 們一般取 40KHZ,所以獨立看門狗的定時時間并一定非常精確,只適用于對時間精度
* 要求比較低的場合。
*
* rlv:預分頻器值,取值范圍為:0-0XFFF
* 函數調用舉例:
* IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超時溢出
* (64/40)*625 = 1s
*/
void bsp_IWDG_Config(uint8_t prv ,uint16_t rlv)
{
// 使能 預分頻寄存器PR和重裝載寄存器RLR可寫
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
// 設置預分頻器值
IWDG_SetPrescaler( prv );
// 設置重裝載寄存器值
IWDG_SetReload( rlv );
// 把重裝載寄存器的值放到計數器中
IWDG_ReloadCounter();
// 使能 IWDG
IWDG_Enable();
}
// 喂狗
void bsp_IWDG_Feed(void)
{
// 把重裝載寄存器的值放到計數器中,喂狗,防止IWDG復位
// 當計數器的值減到0的時候會產生系統復位
IWDG_ReloadCounter();
}
3. 窗口看門狗(WWDG)
窗口看門狗跟獨立看門狗一樣,也是一個遞減計數器不斷的往下遞減計數,當減到一個固定值0X40時還不喂狗的話,產生復位,這個值叫窗口的下限,是固定的值,不能改變。這個是跟獨立看門狗類似的地方,不同的地方是窗口看門狗的計數器的值在減到某一個數之前喂狗的話也會產生復位,這個值叫窗口的上限,上限值由用戶獨立設置。窗口看門狗計數器的值必須在上窗口和下窗口之間才可以喂狗,這就是窗口看門狗中窗口兩個字的含義.
窗口看門狗時鐘
窗口看門狗時鐘來自PCLK1,PCLK1最大是45M,由RCC時鐘控制器開啟。
計數器時鐘和計數器
計數器時鐘由CK計時器時鐘經過預分頻器分頻得到,分頻系數由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK計時器時鐘=PCLK1/4096,計數器的時鐘CNT_CK=PCLK1/4096/(2^WDGTB)。
計數器是一個遞減計數器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],當7個位全部為1時是0X7F,這個是最大值,當遞減到T6位變成0時,即從0X40變為0X3F時候,會產生看門狗復位。計數器的值只能是:0X40~0X7F之間,實際上用來計數的是T[5:0]。當遞減計數器遞減到0X40的時候,還不會馬上產生復位,如果使能了提前喚醒中斷:CFR位9 EWI 置1,則產生提前喚醒中斷,如果真進入了這個中斷的話,就說明程序肯定是出問題了, 那么在中斷服務程序里面我們就需要做最重要的工作,比如保存重要數據,或者報警等,這個中斷我們也叫它死前中斷。
應用場景
WWDG一般被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。
PS: 可以在系統上電開始的時候檢查是否因看門狗引起的復位【RCC_GetFlagStatus(RCC_FLAG_WWDGRST)】
代碼實例
//用于記錄看門狗 遞減計數器的值,方便喂狗函數直接使用
static uint8_t m_bsp_wwdg_cnt ;
// WWDG 中斷優先級初始化
static void bsp_WWDG_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/* WWDG 配置函數
* tr :遞減計時器的值, 取值范圍為:0x7f~0x40,超出范圍會直接復位
* wr :窗口值,取值范圍為:0x7f~0x40
* prv:預分頻器值,取值可以是
* @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(45MHz)/4096)/1 約10968Hz 91us
* @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(45MHz)/4096)/2 約5484Hz 182us
* @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(45MHz)/4096)/4 約2742Hz 364us
* @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(45MHz)/4096)/8 約1371Hz 728us
*
* 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40為最小wr最小值) prv = WWDG_Prescaler_8
* ~728 * (127-80) = 34.2ms < 刷新窗口 < ~728 * 64 = 46.6ms
* 也就是說調用WWDG_Config進行這樣的配置,若在之后的34.2ms前喂狗,系統會復位,在46.6ms后沒有喂狗,系統也會復位。
* 需要在刷新窗口的時間內喂狗,系統才不會復位。
*/
void bsp_WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{
m_bsp_wwdg_cnt = tr;//保存CNT配置,用在喂狗函數
// 開啟 WWDG 時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
// 設置預分頻器的值
WWDG_SetPrescaler( prv );
// 設置上窗口值
WWDG_SetWindowValue( wr );
// 設置計數器的值,使能WWDG
WWDG_Enable(tr);
// 清除提前喚醒中斷標志位
WWDG_ClearFlag();
// 配置WWDG中斷優先級
bsp_WWDG_NVIC_Config();
// 開WWDG 中斷
WWDG_EnableIT();
}
// 喂狗
void bsp_WWDG_Feed(void)
{
// 喂狗,刷新遞減計數器的值,設置成最大WDG_CNT=0X7F
WWDG_SetCounter( m_bsp_wwdg_cnt );
}
上一篇:秉火429筆記之十五 DMA--直接存儲區訪問
下一篇:秉火429筆記之十一 Systick--滴答定時器
推薦閱讀
史海拾趣
隨著全球環保意識的提高,BROTHER公司也積極踐行環保理念,推動綠色生產。公司注重節能減排和資源循環利用,采用環保材料和生產工藝,減少對環境的影響。同時,BROTHER還開展了一系列環保公益活動,宣傳環保理念,提高公眾環保意識。通過踐行環保理念,BROTHER不僅贏得了社會的認可和尊重,還為公司的可持續發展奠定了堅實基礎。
以上五個故事只是BROTHER公司在電子行業發展歷程中的一部分縮影。實際上,BROTHER的發展還涉及更多的細節和方面。但無論如何,BROTHER始終堅持創新、質量、服務和環保的理念,不斷追求卓越和完美,為電子行業的發展做出了重要貢獻。
倍(DBIC)公司深知人才是企業發展的核心動力。因此,公司高度重視人才培養和團隊建設。公司建立了完善的培訓體系,為員工提供豐富的培訓資源和學習機會。同時,倍(DBIC)公司還積極引進優秀人才,構建了一支高效、專業的團隊。這支團隊在公司的發展中發揮了重要作用,為公司創造了巨大的價值。
DB Unlimited始終將客戶放在心中最重要的位置。公司堅持以客戶為中心的服務理念,為客戶提供全方位、高品質的服務。無論是售前咨詢、售后服務還是技術支持等方面,DB Unlimited都始終秉持著專業、高效、熱情的態度,贏得了客戶的廣泛贊譽和信賴。這種客戶至上的服務理念也成為了公司不斷發展壯大的重要保障之一。
請注意,以上故事框架僅供參考,實際的故事需要根據DB Unlimited公司的真實發展歷程和具體事實進行編寫。
博通集成自成立以來,始終致力于無線通訊技術的研發與創新。公司團隊不斷攻克技術難關,推出了多款具有市場競爭力的產品。其中,公司自主研發的首款Wi-Fi寬帶收發樣片在2015年成功通過測試,這一技術突破為公司在無線通訊領域的發展奠定了堅實基礎。此后,公司不斷推出創新產品,涵蓋無線數傳芯片和無線音頻芯片等多個領域,廣泛應用于智能家居、智能交通等領域。
為了適應市場的快速變化和公司業務的不斷擴張,Altech公司決定將深圳工廠整體搬遷至廣州南沙。這一搬遷不僅優化了公司的生產布局,還為公司提供了更加廣闊的市場發展空間。搬遷后的工廠引進了先進的生產設備和技術,進一步提升了公司的生產效率和產品質量。
憑借在鋁合金導體領域的卓越成就和持續創新,Altech公司成功獲得了國家級高新技術企業的認定。這一榮譽不僅是對公司技術實力和創新能力的肯定,也為公司未來的發展提供了有力的支持。作為國家級高新技術企業,Altech公司將繼續加大研發投入,推動技術創新,為電子行業的發展做出更大的貢獻。
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 編輯 一看到傳感器字樣,想是以后用的到,先收藏,呵呵 概述 ---PS壓力傳感器是一種利用半導體膜片結構制成的電子式壓力傳感器,它可將空氣壓力這一物理量變換成電信號, 并能夠高精度、線性地檢測 ...… 查看全部問答∨ |
ENH064V1-300/450/600 尺寸大小: 6.4" 分辨率: VGA 640 x 480 接口: 6-bits TTL interface 亮度 : 350/450/600nit(cd/m2) 顯示模式:Normally White 響應時間:Rise 30ms/ Fall 50ms 功耗:5.6/5.6/8.5W 工作溫度:0℃---+55℃ 儲藏溫度:-25 ...… 查看全部問答∨ |
我很努力的做畢設,倒了最后看見我的畢設題目卻盲目了... 題目是《基于STR750的硬件設計》還有一個人是軟件設計 題目要求是:要求學生學習嵌入式開發硬件平臺知識、軟件知識。對已有的技術資料進行消化整理,以STR750為核心硬件完成一款有創意的 ...… 查看全部問答∨ |
|
Proteus7.6完美版--破解+漢化 很多朋友說破解了以后不能用,我看了一下,確實如此,我又到網上搜了一下,搜到這個Proteus_7.6_SP4_0.96_,我試了一下,元件能放上去了,大家可以試一下 下面是這個破解文件,請一定按照read me 文件里的說明進行操 ...… 查看全部問答∨ |
2000年到2009年十年間,中國的IC設計公司的命運跌宕起伏。十年來,始終沒有一家IC公司能夠在中國市場扛起旗幟,可謂是各領風騷一二年。天天談芯 成立于1999年10月的中星微電子,除了CMOS數碼圖像處理芯片“星光N號”取得成功,公司依靠“星光中國 ...… 查看全部問答∨ |
usb鍵盤的驅動按道理來說,在menuconfig選上HID就可以了 我的問題是,在/dev/下壓根就沒有input,還要手動mkdir /dev/input 然后,mknod /dev/input/kbd c 13 64 問題來了,這下 如果 cat /dev/input/kbd ,按鍵盤是可以看到信息,但是,console ...… 查看全部問答∨ |
這段程序,俺不知道為什么會有延時功能,按俺的想法,是沒辦法實現了。菜鳥一只,先謝謝各位了 程序如下://-------------------------------------------------- // Description : Hold program for 0 ~ 65535 ms // Input Value ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- “USB 3.1 規范及重要測試需考慮的因素”江湖令,一起在吐槽中成長
- 回帖有獎 | QSPICE體驗官招募令,分享心得贏好禮!
- 提交WEBENCH設計,就能參與轉盤抽獎!
- 意法半導體工業峰會2019( 深圳 )
- TI有獎直播:使用 MSPM0 AEC-Q100 MCU 設計更智能的汽車系統
- 英飛凌&英恒|如何選擇一顆合適的車用MOSFET
- MPS商城小程序上線 注冊、分享、下載干貨都可贏好禮——下單還返現!
- 力源&安森美有獎直播:RSL15 - 安森美更高效更智能更安全的 BLE 5.2 藍牙芯片
- 7月21日有獎直播|ADI開關/多路復用器系列產品的典型應用
- 25美分實現25種功能的TI MSP430鐵電超值微控制器方案即將直播!快來報名圍觀!