【STM32】看門狗

1.看門狗簡介

看門狗起始就是一個定時器,從功能上說它可以讓微控制器在程序發生意外(程序進入死循環或跑飛)的時候,能重新恢復到系統剛上電狀態,以保障系統出問題的時候可以重啟一次。說的簡單一點,看門狗就是能讓程序出問題時能重新啟動系統。STM32有兩個看門狗,獨立看門狗和窗口看門狗。

1.1獨立看門狗(Independent Watchdog,IWDG)

獨立看門狗號稱寵物狗,它有一個12位的遞減計數器,當計數器的值從某個值一直減到0的時候,系統就會產生一個復位信號,即IWDG_RESET。如果在計數器沒有減到0之前,刷新了計數器的值,那么就不會產生復位信號,這個動作就是我們經常說的喂狗。

1.2獨立看門狗時鐘

獨立看門狗的時候由獨立的RC振蕩器LSI提供,即使主時鐘發生故障它仍然有效,非常獨立。LSI的頻率一般在30~60KHz之間,所以獨立看門狗的定時時間并不一定非常準確,只適用于對時間精度要求比較低的場合。

在這里插入圖片描述

上圖中,配置的IWDG時鐘CK_IWDG=32KHz。

1.3獨立看門狗計數器時鐘

遞減計數器的時鐘由LSI經過一個8位的預分頻器得到,我們可以操作預分頻器寄存器IWDG_PR來設置分頻因子,分頻因子可以是:[4,8,16,32,64,128,256],計數器時鐘CK_CNT=CK_IWDG/IWDG_PR。

1.4重裝載寄存器

重裝載寄存器是一個12位的寄存器,里面裝著要刷新到計數器的值,這個值的大小決定著獨立看門狗的溢出時間。超時時間Tout=1/CK_CNT*rlv,rlv是重裝載寄存器的值。

若IWDG_PR=32,rlv=2000,所以CK_CNT=32KHz/32=1KHz,Tout=1/1000*2000=2s。意味著2s之內我們就得喂狗,不然系統就會重啟。

1.5標準庫演示
#ifndef __BSP_IWDG_H
#define __BSP_IWDG_H#ifdef __cplusplus
extern "C"{#endif#include "stm32f4xx.h"void Init_IWDG(uint8_t prv,uint16_t rlv);
void IWDG_Feed(void);#ifdef __cplusplus
}
#endif#endifc
#include "bsp_iwdg.h"/*
* 設置 IWDG 的超時時間
* Tout = prv/LSICLK * 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 之間,根據溫度和工作場合會有一定的漂移,我
*    們的STM32F407中為32KHz,所以獨立看門狗的定時時間并不一定非常精確,只適用于對時間精度
*    要求比較低的場合。
*
* rlv:預分頻器值,取值范圍為:0-0XFFF
* 函數調用舉例:
* Init_IWDG(IWDG_Prescaler_32 ,1000);  // IWDG 1s 超時溢出
*            (32/LSICLK)*1000 = 1s
*/
void Init_IWDG(uint8_t prv,uint16_t rlv)
{// 使能 預分頻寄存器PR和重裝載寄存器RLR可寫IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);// 設置預分頻器值IWDG_SetPrescaler(prv);// 設置重裝載寄存器值IWDG_SetReload(rlv);// 把重裝載寄存器的值放到計數器中IWDG_ReloadCounter();// 使能 IWDGIWDG_Enable();
}void IWDG_Feed(void)
{// 把重裝載寄存器的值放到計數器中,喂狗,防止IWDG復位// 當計數器的值減到0的時候會產生系統復位IWDG_ReloadCounter();
}
int main(void)
{Init_LED();//	//設置中斷分組
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//	
//	Init_USART();Init_IWDG(IWDG_Prescaler_32,1000);/* Infinite loop */while (1){}
}

上述代碼思路為:Init_LED()中會將LED點亮,然后開啟獨立看門狗,設置的溢出時間為1s,那么1s后由于沒有喂狗,mcu會復位,LED也會滅,但是由于時間太快了,肉眼應該無法看到。所以,我們使用了示波器進行測試LED的輸入電平。

在這里插入圖片描述

int main(void)
{Init_LED();//	//設置中斷分組
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//	
//	Init_USART();Init_IWDG(IWDG_Prescaler_32,1000);/* Infinite loop */while (1){IWDG_Feed();}
}

如果我們在巡航中一直喂狗,那么mcu就不會復位。

2.窗口看門狗(Window Watchdog,WWDG)

窗口看門狗號稱警犬,它也有一個遞減計數器不斷的往下遞減計數,當減到一個固定值0x40時還不喂狗的話,就會產生復位,這個值叫窗口的下限,是固定值,不能改變。不同的是,窗口看門狗的計數器在減到某一個數之前喂狗也會產生復位,這個值叫窗口的上限,上限值由用戶獨立設置。窗口看門狗計數器的值必須在上窗口和下窗口之間才可以喂狗,這就是窗口看門狗中窗口兩個字的含義。

IWDG與WWDG區別

RLR是重裝載寄存器,用來設置獨立看門狗的計數器的值。TR是窗口看門狗的計數器的值,由用戶獨立設置,WR是窗口看門狗的上窗口值,由用戶獨立設置。

在出現下述兩種情況之一時產生看門狗復位:

  1. 當喂狗的時候如果計數器的值大于窗口上限值。
  2. 當計數器的數值從0x40減到0x3F。

如果啟動了看門狗并且使能中斷,當遞減計數器等于0x40時產生早期喚醒中斷(EWI),這個中斷我們稱它為死前中斷或者叫遺囑中斷, 在中斷函數里面我們應該出來最重要的事情,而且必須得快,因為遞減計數器再減一次,就會產生系統復位。

注意事項:

  1. 上限值必須大于0x40,否則就無窗口了。
  2. 窗口看門狗時鐘來源PCLK1(APB1總線時鐘)分頻后。
2.1標準庫演示
#ifndef __BSP_WWDG_H
#define __BSP_WWDG_H#ifdef __cplusplus
extern "C"{#endif#include "stm32f4xx.h"#define WWDG_CNT    0x7Fvoid Init_WWDG(uint8_t tr, uint8_t wr, uint32_t prv);
void WWDG_Feed(void);#ifdef __cplusplus
}
#endif#endif
#include "bsp_wwdg.h"
#include "stdio.h"/* WWDG 配置函數
* tr :遞減計時器的值, 取值范圍為:0x7f~0x40
* wr :窗口值,取值范圍為:0x7f~0x40
* prv:預分頻器值,取值可以是
*      @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
*      @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
*      @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
*      @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
*/
void Init_WWDG(uint8_t tr, uint8_t wr, uint32_t prv)
{//使能窗口看門狗時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);// 設置預分頻器值WWDG_SetPrescaler(prv);// 設置重裝載寄存器值WWDG_SetWindowValue(wr);// 使能 WWDGWWDG_Enable(WWDG_CNT&tr);//配置中斷控制器并使能中斷NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;NVIC_Init(&NVIC_InitStruct);WWDG_ClearFlag();//清楚標志位WWDG_EnableIT();//使能中斷
}void WWDG_IRQHandler(void)
{WWDG_SetCounter(WWDG_CNT);WWDG_ClearFlag();
}void WWDG_Feed(void)
{printf("WWDG_Feed\r\n");// 把重裝載寄存器的值放到計數器中,WWDG_SetCounter(WWDG_CNT);
}
int main(void)
{Init_USART();Init_LED();//設置中斷分組NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);Init_WWDG(0x7f,0x5f,WWDG_Prescaler_8);printf("hello,this is stm32f407\r\n");/* Infinite loop */while (1){//-----------------------------------------------------// 這部分應該寫需要被WWDG監控的程序,這段程序運行的時間// 決定了窗口值應該設置成多大。//-----------------------------------------------------// 計時器值,初始化成最大0X7F,當開啟WWDG時候,這個值會不斷減小// 當計數器的值大于窗口值時喂狗的話,會復位,當計數器減少到0X40// 還沒有喂狗的話就非常非常危險了,計數器再減一次到了0X3F時就復位// 所以要當計數器的值在窗口值和0X40之間的時候喂狗,其中0X40是固定的。if ( (WWDG->CR & 0X7F) < 0x5f ){// 喂狗,重新設置計數器的值為最大0X7FWWDG_Feed();}}
}

注意,我們試過了在死前中斷中喂狗,但是好像來不及,mcu還是重啟了。所以,我們在main函數中進行了計數判斷喂狗。

主函數中我們把WWDG的計數器的值設置 為0X7F,上窗口值設置為0X5F,分頻系數為8分頻。在while死循環中,我們不斷讀取計數器的值, 當計數器的值減小到小于上窗口值的時候,我們喂狗,讓計數器重新計數。

在while死循環中,一般是我們需要監控的程序,這部分代碼的運行時間,決定了上窗口值應該設置為多少,當監控的程序運行完畢之后, 我們需要執行喂狗程序,比起獨立看門狗,這個喂狗的窗口時間是非常短的,對時間要求很精確。如果沒有在這個窗口時間內喂狗的話, 那就說明程序出故障了,會產生提前喚醒中斷,最后系統復位。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35754.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用英文介紹孟買:Mumbai India‘s Transforming MEGACITY

Mumbai: India’s Transforming MEGACITY Link: https://www.youtube.com/watch?vtWD_-Rzrn8o Summary First Paragraph: Mumbai, India’s financial and entertainment capital, is undergoing a major transformation. With its contiguous urban population nearing 25…

神經網絡實現AND門:邏輯運算的智能化飛躍

神經網絡實現AND門&#xff1a;邏輯運算的智能化飛躍 在人工智能的早期探索中&#xff0c;人們就夢想著用機器模擬人腦的邏輯思考能力。AND邏輯函數作為最基本的邏輯運算之一&#xff0c;其在神經網絡中的實現&#xff0c;標志著我們向智能化邁出了堅實的一步。本文將詳細解釋…

web圖片怎么導入ps?這個方法給你輕松解決!

隨著WebP格式圖片因其體積小、加載快的優勢在網站中日益普及&#xff0c;對于圖片編輯者來說&#xff0c;能夠直接在Photoshop中打開和編輯WebP文件變得尤為重要。 WebPShop插件應運而生&#xff0c;它是一個專為Photoshop設計的模塊&#xff0c;支持打開和保存WebP圖像&#…

ATFX匯市:澳大利亞5月CPI大增0.4百分點,降息預期顯著降溫

ATFX匯市&#xff1a;據澳大利亞統計局數據&#xff0c;澳大利亞5月加權CPI年率為4%&#xff0c;高于前值3.6%&#xff0c;高于預期3.8%&#xff0c;顯示出澳大利亞通脹率頗具韌性。5月份數據公布之前&#xff0c;月度CPI年率平均波幅不足0.1個百分點&#xff0c;呈現出橫盤震蕩…

《數字圖像處理》實驗報告六

一、實驗任務與要求 比較采用不同的色彩空間對彩色圖像處理的效果&#xff0c;處理包括&#xff1a; a&#xff09;直方圖均衡化 b&#xff09;圖像增強 二、實驗報告 &#xff08;一&#xff09;RGB色彩空間的直方圖均衡化 / 銳化處理 1、matlab 實現代碼&#xff1a; %…

C語言 用getchar函數讀入兩個字符給c1和c2,然后分別用putchar函數和printf函數輸出

用getchar函數讀入兩個字符給c1和c2&#xff0c;然后分別用putchar函數和printf函數輸出這兩個字符并且解答以下三個問題&#xff1a; 1.變量c1和c2應定義為字符型&#xff0c;整形&#xff0c;還是二者皆可&#xff1f; 2.要求輸出c1和C2的ASCII碼&#xff0c;應如何處理&am…

推薦系統(LLM去偏?) | (WSDM24)預訓練推薦系統:因果去偏視角

::: 大家好&#xff01;今天我分享的文章是來自威斯康星大學麥迪遜分校和亞馬遜AWS AI實驗室的最新工作&#xff0c;文章所屬領域是推薦系統和因果推理&#xff0c;作者針對跨域推薦中的偏差問題提出了一種基于因果去偏的預訓練推薦系統框架PreRec。 ::: 原文&#xff1a;Pre-t…

【MySQL進階之路 | 小結篇】MySQL鍵約束KEY與索引INDEX

1. 鍵約束 關鍵字key 比如UNIQUE KEY就是一個唯一性約束&#xff0c;用于確保表中的某一列或多列的組合具有唯一性&#xff0c;不允許有重復值.當定義一個唯一性約束的時候&#xff0c;會自動創建一個唯一性索引來支持這一約束&#xff0c;這意味著它同時也起到了索引的作用.…

mobaXterm上傳文件進度一直為0%

在這里修改了senssion、重啟都沒有用 最后發現是文件存放的路徑中不能有中文&#xff0c;改了之后就成功上傳了

開展FMEA培訓時需要做好哪些準備?

FMEA&#xff08;失效模式與影響分析&#xff09;作為一種預防性的質量工具&#xff0c;正逐漸成為當代企業提升產品競爭力的關鍵。然而&#xff0c;很多企業在開展FMEA時&#xff0c;卻常常因為準備工作不足而事倍功半。那么&#xff0c;開展FMEA培訓時需要做好哪些準備呢&…

Jenkins流水線發布,一篇就解決你的所有疑惑

這次搭建的項目比較常規,前端是react寫的,后端是springboot,并且由于是全棧開發,所以是在同一個項目中。接下來我演示下怎么用jenkins進行自動化發布。 1.jenkins必裝插件 這里用到的是jenkinsFile主要是基于Groovy這個沙盒,有些前置插件。這里使用maven進行打包,所以需…

springboot實現json文件生成,壓縮為zip文件并在瀏覽器下載

示例 RestController public class FileController {private static final Logger logger LoggerFactory.getLogger(FileController.class);private static final String filePath "/fileTemp";Autowiredprivate ObjectMapper objectMapper;GetMapping("/v1/…

測試基礎16:測試用例設計方法-測試大綱法

課程大綱 1、應用場景 驗證頁面跳轉&#xff1a;有多個窗口/頁面&#xff0c;每個窗口/頁面有多個動作&#xff0c;每個動作之間有相互的聯系的場景。看點擊后&#xff0c;頁面跳轉正確與否。 2、設計步驟 step1.列出大綱&#xff1a;列出涉及的頁面和頁面可執行的動作。 s…

生命在于學習——Python人工智能原理(4.7)

四、Python的程序結構與函數 4.4 函數 函數能將代碼劃分為若干模塊&#xff0c;每一個模塊可以相對獨立的實現某一個功能&#xff0c;函數有兩個主要功能&#xff0c;分別是降低編程難度和實現代碼復用&#xff0c;函數是一種功能抽象&#xff0c;復用它可以將一個復雜的大問…

深拷貝與淺拷貝的理解

深拷貝和淺拷貝是復制對象時的兩種不同方式&#xff0c;它們之間的區別在于它們如何處理對象的引用類型成員。 淺拷貝&#xff08;Shallow Copy&#xff09; 淺拷貝是指創建一個新對象&#xff0c;這個新對象是對原對象的字段的一個精確副本。對于字段中的基本數據類型&#…

【C#】找不到屬性集方法。get只讀屬性用了反射設置setValue肯定報錯

歡迎來到《小5講堂》 這是《C#》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。 溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01; 背景 找不到屬性集方法。get只讀屬性用了反射設置setValue肯定報錯 報錯…

IPFoxy Tips:匿名海外代理IP的使用方法及注意事項

在互聯網上&#xff0c;隱私和安全問題一直備受關注。為了保護個人隱私和數據安全&#xff0c;使用匿名代理IP是一種常用的方法。匿名代理IP可以隱藏用戶的真實IP地址&#xff0c;使用戶在訪問網站時更加隱秘和安全。 本文將介紹匿名代理IP的基本原理和核心功能。 基本原則 匿…

2024期權交易傭金手續費最低是多少?期權交易有哪些成本?

顯性成本 期權交易的顯性成本包含期權交易的傭金和交易所費用&#xff0c;分別支付給券商和交易所&#xff0c;統一由券商代收。 傭金 期權傭金是期權交易時支付給券商的費用&#xff0c;傭金通常以交易金額的一定比例計算&#xff0c;可以是固定費用&#xff0c;也可以是滑…

用兩個鐘,我又在VMWARE上搞了一套內部網配置

最近要學es&#xff0c;所以打算自己用虛擬機搞個NAT&#xff0c;又搞了兩個鐘。為了不再費勁嘗試&#xff0c;也為了造福大眾&#xff0c;所以選擇搞一份NAT筆記&#xff01;&#xff01;&#xff01;&#xff01; 1.初始化網關和DNS 我們給網關配置一個地址192.168.96.1&…

【多模態】BEiT v2

鏈接&#xff1a;https://arxiv.org/pdf/2208.06366 論文&#xff1a;BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation&#xff1a;Masked image modeling (MIM) 任務在自監督表征學習上取得了不錯的成績&#xff0c;但是現…