新四季網

stm32電子時鐘設計(正點原子STM32Mini板資料連載)

2023-05-23 14:44:26

1)實驗平臺:正點原子STM32mini開發板2)摘自《正點原子STM32 不完全手冊(HAL 庫版)關注官方微信號公眾號,獲取更多資料:正點原子

第十章 獨立看門狗(IWDG)實驗

這一章,我們將向大家介紹如何使用 STM32 的獨立看門狗(以下簡稱 IWDG)。STM32 內

部自帶了 2 個看門狗:獨立看門狗(IWDG)和窗口看門狗(WWDG)。這一章我們只介紹獨

立看門狗,窗口看門狗將在下一章介紹。在本章中,我們將通過按鍵 WK_UP 來餵狗,然後通

過 DS0 提示復位狀態。本章分為如下幾個部分:

10.1 STM32 獨立看門狗簡介

10.2 硬體設計

10.3 軟體設計

10.4 下載驗證

10.1 STM32 獨立看門狗簡介

STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然

有效。這裡需要注意獨立看門狗的時鐘是一個內部 RC 時鐘,所以並不是準確的 40Khz,而是

在 30~60Khz 之間的一個可變化的時鐘,只是我們在估算的時候,以 40Khz 的頻率來計算,看

門狗對時間的要求不是很精確,所以,時鐘有些偏差,都是可以接受的。

獨立看門狗有幾個寄存器與我們這節相關,我們分別介紹這幾個寄存器,首先是鍵值寄存

器 IWDG_KR,該寄存器的各位描述如圖 10.1.1 所示:

圖 10.1.1 IWDG_KR 寄存器各位描述

在鍵寄存器(IWDG_KR)中寫入 0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位

值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。 無

論何時,只要鍵寄存器 IWDG_KR 中被寫入 0xAAAA, IWDG_RLR 中的值就會被重新加載到

計數器中從而避免產生看門狗復位 。

IWDG_PR 和 IWDG_RLR 寄存器具有防寫功能。要修改這兩個寄存器的值,必須先向

IWDG_KR 寄存器中寫入 0x5555。將其他值寫入這個寄存器將會打亂操作順序,寄存器將重新

被保護。重裝載操作(即寫入 0xAAAA)也會啟動防寫功能。

接下來,我們介紹預分頻寄存器(IWDG_PR),該寄存器用來設置看門狗時鐘的分頻係數,

最低為 4,最高位 256,該寄存器是一個 32 位的寄存器,但是我們只用了最低 3 位,其他都是

保留位。預分頻寄存器各位定義如圖 10.1.2 所示:

圖 10.1.2 IWDG_ PR 寄存器各位描述

在介紹完 IWDG_PR 之後,我們介紹一下重裝載寄存器。該寄存器用來保存重裝載到計數

器中的值。該寄存器也是一個 32 位寄存器,但是只有低 12 位是有效的,該寄存器的各位描述

如圖 10.1.3 所示:

圖 10.1.3 重裝載寄存器各位描述

只要對以上三個寄存器進行相應的設置,我們就可以啟動 STM32F1 的獨立看門狗。獨立

看 門 狗 相 關 的 庫 函 數 操 作 函 數 在 文 件 stm32f1xx_hal_iwdg.c 和 對 應 的 頭 文 件

stm32f1xx_hal_iwdg.h 中。

接下來我們講解一下通過庫函數來配置獨立看門狗的步驟:

1)取消寄存器防寫(向 IWDG_KR 寫入 0X5555)

首先我們必須取消 IWDG_PR 和 IWDG_RLR 寄存器的防寫,這樣才可以設置寄存器

IWDG_PR 和 IWDG_RLR 的值。取消防寫和設置預分頻係數以及重裝載值在 HAL 庫中是通

過函數 HAL_IWDG_Init 實現的。該函數聲明為:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

該函數只有一個入口參數 hiwdg,該參數是 IWDG_HandleTypeDef 結構體指針類型。接下

來我們看看結構體 IWDG_HandleTypeDef 定義:

typedef struct

{

IWDG_TypeDef *Instance;

IWDG_InitTypeDef Init;

}IWDG_HandleTypeDef;

成員變量 Instance 用來設置看門狗寄存器基地址,實際上在 HAL 庫中已經通過標識符定義

了,這裡對於獨立看門狗直接設置為標識符 IWDG 即可。

成員變量 Init 是一個 IWDG_InitTypeDef 結構體類型,該結構體只有 2 個成員變量,分別用

來設置獨立看門狗的預分頻係數和重裝載值,定義如下:

typedef struct

{

uint32_t Prescaler;

uint32_t Reload;

}IWDG_InitTypeDef;

成員變量 Lock 是一個鎖存變量,該變量在 HAL 庫中當操作配置 IWDG 之前設置為鎖住

LOCK,當配置操作完成之後設置為 UNLOCK,實際上是一個操作狀態標識符。

成員變量 State 也是 HAL 定義的一個過程標識符,用來記錄 IWDG 處理狀態。

HAL_IWDG_Init 函數使用的一般方法為:

IWDG_HandleTypeDef IWDG_Handler; //獨立看門狗句柄

IWDG_Handler.Instance=IWDG;

//獨立看門狗

IWDG_Handler.Init.Prescaler=IWDG_PRESCALER_64; //設置 IWDG 分頻係數

IWDG_Handler.Init.Reload=500; //重裝載值

HAL_IWDG_Init(&IWDG_Handler);

上面程序的作用是初始化 IWDG,設置分頻係數為 64,重裝載值為 500。設置完預分頻系

數和重裝載值後,我們就可以知道看門狗的餵狗時間(也就是看門狗溢出時間),該時間的計算

方式為:

Tout=((4×2^prer) ×rlr) /32

其中 Tout 為看門狗溢出時間(單位為 ms);prer 為看門狗時鐘預分頻值(IWDG_PR 值),

範圍為 0~7;rlr 為看門狗的重裝載值(IWDG_RLR 的值);

比如我們設定 prer 值為 4(4 代表的是 64 分頻,HAL 庫中可以使用宏定義標識符

IWDG_PRESCALER_64),rlr 值為 500,那麼就可以得到 Tout=64×500/32=1000ms,這樣,看

門狗的溢出時間就是 1s,只要你在一秒鐘之內,有一次寫入 0XAAAA 到 IWDG_KR,就不會

導致看門狗復位(當然寫入多次也是可以的)。這裡需要提醒大家的是,看門狗的時鐘不是準確

的 32Khz,所以在餵狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。

2)重載計數值餵狗(向 IWDG_KR 寫入 0XAAAA)

在 HAL 中重載計數值的函數是 HAL_IWDG_Refresh,該函數聲明為:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

該函數有一個入口參數為前面講解的 IWDG_HandleTypeDef 結構體類型指針,它的作用是

把值0xAAAA寫入到IWDG_KR寄存器,從而觸發計數器重載,即實現獨立看門狗的餵狗操作。

3) 啟動看門狗(向 IWDG_KR 寫入 0XCCCC)

HAL 庫函數裡面啟動獨立看門狗的函數是__HAL_IWDG_START:

__HAL_IWDG_START(hiwdg);

通過上面 3 個步驟,我們就可以啟動 STM32F1 的獨立看門狗了,使能了看門狗,在程序

裡面就必須間隔一定時間餵狗,否則將導致程序復位。利用這一點,我們本章將通過一個 LED

燈來指示程序是否重啟,來驗證 STM32F1 的獨立看門狗。

在配置看門狗後,DS0 將常亮,如果 KEY_UP 按鍵按下,就餵狗,只要 KEY_UP 不停的

按,看門狗就一直不會產生復位,保持 DS0 的常亮,一旦超過看門狗定溢出時間(Tout)還沒

按,那麼將會導致程序重啟,這將導致 DS0 熄滅一次。

10.2 硬體設計

本實驗用到的硬體資源有:

1) 指示燈 DS0

2) WK_UP 按鍵

3) 獨立看門狗

前面兩個在之前都有介紹,而獨立看門狗實驗的核心是在 STM32 內部進行,並不需要外

部電路。但是考慮到指示當前狀態和餵狗等操作,我們需要 2 個 IO 口,一個用來輸入餵狗信

號,另外一個用來指示程序是否重啟。餵狗我們採用板上的 WK_UP 鍵來操作,而程序重啟,則是通過 DS0 來指示的。

10.3 軟體設計

軟體設計我們依舊是在上一章代碼的基礎上修改,因為沒用到外部中斷,所以先去掉 exti.c

(注意,此時 HARDWARE 組僅剩:led.c 和 key.c),然後在 HARDWARE 文件夾下面新建一個

WDG 的文件夾,用來保存與看門狗相關的代碼。再打開工程,新建 wdg.c 和 wdg.h 兩個文件,

並保存在 WDG 文件夾下,並將 WDG 文件夾加入頭文件包含路徑。

在 wdg.c 裡面輸入如下代碼:

#include "wdg.h"

IWDG_HandleTypeDef IWDG_Handler; //獨立看門狗句柄

//初始化獨立看門狗

//prer:分頻數:IWDG_PRESCALER_4~IWDG_PRESCALER_256

//rlr:自動重裝載值,0~0XFFF.

//時間計算(大概):Tout=((4*2^prer)*rlr)/32 (ms).

void IWDG_Init(u8 prer,u16 rlr)

{

IWDG_Handler.Instance=IWDG;

IWDG_Handler.Init.Prescaler=prer;

//設置 IWDG 分頻係數

IWDG_Handler.Init.Reload=rlr;

//重裝載值

HAL_IWDG_Init(&IWDG_Handler);

//初始化 IWDG,默認會開啟獨立看門狗

}

//餵獨立看門狗

void IWDG_Feed(void)

{

HAL_IWDG_Refresh(&IWDG_Handler); //餵狗

}

該代碼就 2 個函數,void IWDG_Init(u8 prer,u16 rlr)是獨立看門狗初始化函數,就是按照

上面介紹的步驟來初始化獨立看門狗的。該函數有 2 個參數,分別用來設置與預分頻數與重裝

寄存器的值的。通過這兩個參數,就可以大概知道看門狗復位的時間周期為多少了。其計算方

式上面有詳細的介紹,這裡不再多說了。

void IWDG_Feed(void)函數,該函數用來餵狗,因為 STM32 的餵狗只需要向關鍵字寄存器

寫入 0XAAAA 即可,也就是調用庫函數 HAL_IWDG_Refresh,所以這個函數也是很簡單的。

iwdg.h 內容比較簡單,主要是一些函數申明,這裡我們忽略不講解。

接下來我們看看主函數,主程序裡面我們先初始化一下系統代碼,然後啟動按鍵輸入和看

門狗,在看門狗開啟後馬上點亮 LED0(DS0),並進入死循環等待按鍵的輸入,一旦 KEY_UP

有按鍵,則餵狗,否則等待 IWDG 復位的到來。該部分代碼如下:

int main(void)

{

HAL_Init; //初始化 HAL 庫

Stm32_Clock_Init(RCC_PLL_MUL9); //設置時鐘,72M

delay_init(72);

//初始化延時函數

uart_init(115200);

//初始化串口

LED_Init;

//初始化 LED

KEY_Init;

//初始化按鍵

delay_ms(100); //延時 100ms 再初始化看門狗,LED0 的變化"可見"

IWDG_Init(IWDG_PRESCALER_64,500);//分頻數為 64,重載值為 500,溢出時間為 1s

LED0=0;

while(1)

{

if(KEY_Scan(0)==WKUP_PRES) //如果 WK_UP 按下,餵狗

{

IWDG_Feed;

//餵狗

}

delay_ms(10);

}

}

上面的代碼,鑑於篇幅考慮,我們沒有把頭文件給列出來(後續實例將會採用類同的方式

處理),因為以後我們包含的頭文件會越來越多,大家想看,可以直接打開光碟相關源碼查看。

至此,獨立看門狗的實驗代碼,我們就全部編寫完了,接著要做的就是下載驗證了,看看我們

的代碼是否真的正確。

10.4 下載驗證

在編譯成功之後,我們就可以下載代碼到 MiniSTM32 開發板上,實際驗證一下,我們的程

序是否正確。下載代碼後,可以看到 DS0 不停的閃爍,證明程序在不停的復位,否則只會 DS0

常亮。這時我們試試不停的按 WK_UP 按鍵,可以看到 DS0 就常亮了,不會再閃爍。說明我們

的實驗是成功的

,
同类文章
貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

貓咪多久需要擠肛門腺(貓咪肛門腺到底要不要擠)

鏟屎官最近聞到自家的貓咪散發出一股臭味,久久揮散不去,走哪帶哪。 貓咪也開始頻繁在地上摩擦自己的屁股,這是貓咪需要擠肛門腺了嘛? 鏟屎官立刻就某度了一下,結果有人說要擠!有人說不要擠!這給人整暈乎了,到底是擠還是不擠啊! 本篇文章就幫鏟屎官們理理清楚,先出結論:不用擠!
寧波流浪狗愛心救助直播(寧波最暖心物業)

寧波流浪狗愛心救助直播(寧波最暖心物業)

救人一命 勝造七級浮屠 那救狗一命呢? 天熱了 小動物們都很愛折騰啊 論壇上剛來了一隻最不要臉的邊牧犬 現在又有了一隻錯估自己頭型 伸進欄杆卻出不來的流浪狗 …… (拍的略糊,可這小眼神看著又慘又想笑) 東論網友@quyd拍攝 終於,這副慘狀引來好心
蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

蜘蛛俠新角色首曝(蜘蛛俠新女友黑貓)

2021年還剩下幾天就將成為過去式,而未來式的2022年也是站在了接力點前,而伴隨著2022年虎年的到來,關於漫威這段時間的很多消息傳聞也是不斷湧現出來,有關於後續的項目作品的,也有關於之前漫威項目新消息的。 所以,今天咱們就來看看,漫威這段時間都有哪些新消息曝光: 【1】8個漫威秘
狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

狗突然的對主人叫心臟都要嚇壞了(主人以為狗狗躺在血泊中)

家裡養了狗,那真就是隨時準備迎接新驚喜,尤其是柯基這種渾身上下散發著「智慧」氣質的狗狗。 這隻超可愛的柯基叫作Cartier,它的主人在泰國大城經營著一家咖啡館兒,平時它就跟主人在店裡呆著,四處遛遛什麼的。 前幾天主人像往常一樣讓Cartier出門自己上廁所然後等它回來。結果等了好久
貓超卡划算嗎(10元貓超卡又來了)

貓超卡划算嗎(10元貓超卡又來了)

前言:收到顯示器,黑色背景下全是彩色亮點,換貨; 不過27寸4K的屏幕,用電腦真的爽,比筆記本爽多了,雖然我這個筆記本是16寸的。01 10元貓超卡又來? 一、活動概覽 活動地址:https://developer.aliyun.com/adc/series/activity/serv
戰神貓熊滿級(娜貓的雙子指令形態登場)

戰神貓熊滿級(娜貓的雙子指令形態登場)

在最新的特攝雜誌上,出現了比較有趣的劇照,首先就是關於女騎假面騎士娜貓的新形態。雖然是女騎,但其實她的新形態比較少,目前一直都是在使用這個節拍形態,終於有了新的形態了。另外就是之前因為基洛利而下線的假面騎士棕熊,似乎並沒有死亡,然後再度歸來。然後就是假面騎士極狐和邪魔徒的立場了,似乎是合作了?因為
世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

世界排名前10最聰明的狗貴賓(能記住一千多個單詞)

2021年5月10日,Hub City Animal Project宣布展出一座銅像,以紀念「世界上最聰明的狗狗」——Chaser。 她有多聰明呢?她在1歲時就能記住約4百個單詞,在三歲時,她的詞彙量已經超過了一千個! Chaser飼主的女兒Bianchi還說道,除了知道哪個單詞對應
淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

淘寶目前暢銷的玩具(天貓618四大類玩具熱賣榜)

截止6月20日23:59,天貓「618年中大促」落下帷幕。與往年鋪天蓋地的宣傳相比,今年整個活動周期都顯得有些安靜,平臺方甚至沒在活動結束第一時間發布最終成交額數據。這不免讓人忐忑:今年的行情是否很差? 從玩具業來看,不是很樂觀。中外玩具全媒體中心記者從部分廠商處獲悉,由於疫情對經濟造成的
愛養貓的女生什麼性格(養女兒如養貓)

愛養貓的女生什麼性格(養女兒如養貓)

在眾多想生兒子的家庭中,不全是因為重男輕女,而是有些夫妻感覺養女兒後經歷失望和傷心,許多方面要比養男孩更操心。 可女兒不是一直被稱為爸爸媽媽的貼心小棉襖嗎?為何會有人這樣比喻女兒呢?這不得不提有些女孩總在感情中犯傻的情況。 不久前的假期我參加了多場婚禮,現場有許多新娘新郎的長輩,在一聲聲祝
已滅絕的金剛鸚鵡(最高可賣上萬歐元)

已滅絕的金剛鸚鵡(最高可賣上萬歐元)

金剛鸚鵡原產於巴西的亞馬遜熱帶雨林地區。圖據《國家地理》網站 金剛鸚鵡是色彩豔麗的大型鸚鵡,羽毛五彩斑斕,像彩虹一樣漂亮。平均體長在90-100釐米左右。它們智商很高,模仿能力超強,平均壽命有65年之久。由於廣受喜歡,金剛鸚鵡長期以來成為不法分子走私的對象。據美國《國家地理》雜誌報導,隨