ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

看門狗定時器(WDT,Watch Dog Timer)是單片機的一個重要組成部分,在單片機程序的調試和運行中都有重要的意義。它的主要功能是在發生軟件故障時,將單片機復位重啟。

9.1 看門狗應用背景

在單片機的實際開發和應用場合當中,往往並不是完全理想完美的情況,因此要應對各種突發事件。

1、實際開發編寫程序的時候,有一些極其特殊的情況在邏輯上並未考慮周全,在實際運行時突然發生了,這個時候程序可能進入死循環等各種異常情況而無法正常運行功能,此時在不能完善功能的情況下,最好的辦法就是重啟整個系統。

2、產品在實際運行時,有時會出現突發性的惡劣運行環境,比如高強度雷電,機械接觸產生的靜電等。惡劣的運行環境有可能導致單片機出現突發性異常情況,解決這種問題最好的辦法就是重啟整個系統。

看門狗本質是一個定時器,通過設定定時時間確認程序運行是否正常。例如某一個功能程序,按照正常時序流程,程序從打開看門狗定時器開始,運行到程序的第50行,綜合考慮所有的因素,時間不可能超過10ms,那麼就可以打開看門狗定時器,設定定時時間10ms,在第51行處復位定時時間(俗稱餵狗)。當程序正常運行時,運行到第51行程序餵狗,定時器不會溢出;當程序出現異常時,運行了10ms都沒有運行到第51行,程序不會按時餵狗,此時看門狗定時器產生溢出,自動復位單片機。

STM32F103內置獨立看門狗和窗口看門狗兩類看門狗,提供了更高的安全性、時間的精確性和使用的靈活性。

9.1.1 獨立看門狗

獨立看門狗(IWDG)顧名思義它是獨立運行的,由專用的低速時鐘LSI驅動。優點是當系統主時鐘發生故障或停止運行時它仍然有效,不受程序運行及中斷的影響,缺點是LSI精度受環境影響較大,精度不高,因此IWDG適用於對時間精度要求不高的場合。

IWDG是一個12位的遞減計數器,首先根據所需要設定的時間計算出初值,然後將初值寫入到重裝載寄存器中,啟動IWDG後開始倒計時,當計數器計到0時會產生一個復位信號,引起系統復位。因此按照正常邏輯時序運行程序的話,必須在計數器計到0之前餵狗,IWDG結構如圖9-1所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-1 IWDG結構圖

1、LSI時鐘

LSI的時鐘主頻為40KHz,由於LSI時鐘本身不準確,受環境影響會發聲一定的漂移現象,其頻率會在30KHz到60KHz之間變化,因此餵狗時應該給出一定的餘量。

2、鍵寄存器(IWDG_KR)

鍵寄存器是一個只寫的控制寄存器,向其寫入命令字可以實現相應的配置功能。由於IWDG能夠導致系統復位,為了防止意外復位,IWDG的預分頻寄存器和重裝載寄存器具有寫保護功能,防止寄存器數據被隨意篡改。要修改這兩個寄存器的值,必須先向鍵寄存器中寫入0x5555,取消寫保護功能,除此之外間鍵寄存器控制IWDG的重裝載使能和啟動IWDG功能,鍵寄存器控制字命令如表9-1所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

3、預分頻寄存器(IWDG_PR)

定時器的預分頻係數可以設置為0~2N(N為預分頻寄存器的位數)中的任意一個數,而IWDG的預分頻寄存器稍有不同,IWDG_PR寄存器的有效位只有3位,設置參數對應的分頻係數如表9-2所示。寫入到IWDG_PR寄存器的參數會自動轉化為相應的預分頻係數傳遞到IWDG的8位預分頻器中。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

4、重裝載寄存器(IWDG_RLR)

重裝載寄存器是一個12位的寄存器,用於存儲用戶設定的計數值,其設置範圍

為0~4095。IWDG的計時時間為:(預分頻值/時鐘頻率)*重裝載值,其所能設定的最大復位時間為 :(1/40KHz)×256×4096= 26.2s左右。

5、狀態寄存器(IWDG_SR)

狀態寄存器只有最低兩位RVU和PVU位有效,分別表示重裝載值和預分頻值更新

狀態,當相應寄存器正在進行數據更新時,對應的狀態位由硬件置“1”,更新完畢後由硬件清“0”,只有當RVU和PVU為0時,表示重裝載值和預分頻值已經更新完畢。

9.1.2 IWDG配置流程

通常應用獨立看門狗時,首先估算程序執行一個整週期循環的時間,比如20ms,程序執行完畢後執行“餵狗”操作,由於LSI精度不高,因此要留有一定餘量。假設設定IWDG溢出時間是25ms,如果經過25ms後還未餵狗,說明程序出現故障,IWDG會觸發系統復位,程序重新執行。

已知定時時間為25ms,LSI時鐘頻率為40KHz,根據公式:定時時間(s)=(預分頻數/時鐘頻率)*重裝載值,可以得出 重裝載值*預分頻值=1000,如果設置4分頻,則重裝載值為250,實際寫入到重裝載寄存器的值要減1即為249。

IWDG配置流程如下:

1、取消IWDG寄存器寫保護

2、設置IWDG預分頻係數

3、設置IWDG重裝載值

4、重載計數器的初值

5、啟動看門狗

IWDG配置函數如下所示:

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

9.1.3 獨立看門狗實驗

本節根據獨立看門狗的特點設計獨立看門狗大約每隔1s左右計數器溢出,一旦溢出,將觸發復位。在主循環中通過延時函數模擬程序執行時間,當延時小於1s時,在IWDG計數器溢出前餵狗,不觸發系統復位;當延時大於1s時,IWDG計數器將溢出,導致系統復位。當正常餵狗時,LED1閃爍一次後保持熄滅,否則LED1持續閃爍。(由於延時函數並不精確,加之IWDG時鐘有誤差,所以定時時間並非準確的1000ms)

具體代碼如下:

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

9.2 窗口看門狗

窗口看門狗(WWDG)與獨立看門狗(IWDG)一樣也是用來監測由外部干擾或不可預見的邏輯條件造成的應用程序跑飛而進入死循環。但是窗口看門狗比獨立看門狗要靈敏。如果將獨立看門狗比做中華田園犬的話,窗口看門狗便是警犬。窗口看門狗與獨立看門狗對比如下:

1、IWDG的計數器是12位的;WWDG的計數器是7位的。 2、IWDG的計數器從設定值遞減到0時產生復位信號;WWDG是小於0x40產生復位。

3、IWDG餵狗只有下限;WWDG既有上限,又有下限。

4、IWDG沒有中斷;WWDG有中斷。

5、IWDG由LSI提供時鐘,時鐘精度低;WWDG由APB1總線時鐘提供,時鐘精度高。

6、當系統時鐘發生故障時,IWDG可以正常運行,WWDG停止運行。

WWDG相對於IWDG可以設置一個窗口值(即計數上限),當7位遞減計數器的值處於窗口值與0x40之間時(稱之為窗口期),可以進行“餵狗”——即重新裝載計數器,過早或過晚“餵狗”都會導致系統復位。試想一下:IWDG只要在計數器遞減到0之前餵狗都有效,這就存在隱患,如果程序跑飛後又回到原程序或者由於不可知的原因跳過了一段程序後執行了餵狗操作,IWDG是無法檢測到程序異常情況。如果使用WWDG,可以根據程序正常執行的時間設置一個窗口值(上限),當發生以下兩種情況時都可以達到復位的效果:

1、當窗口看門狗計數器的值小於0x40;

2、當窗口看門狗計數器在窗口外被重新裝載。

因此如果程序過早或過晚執行餵狗操作,都會被認定為異常,從而引起系統復位。

同時WWDG相對於IWDG還具有一箇中斷,當窗口計數器計數到0x40時中斷,該中斷不是用於日常“餵狗”,“餵狗”應該放在中斷之前。如果進入WWDG中斷,表示之前的“餵狗”操作沒有被執行,那麼系統肯定出現了異常。此時如果不採取措施,下一個看門狗時鐘週期(計數到0x3F時)將會發生復位,因此該中斷可以讓程序在復位前有一個緊急處理的機會,比如保存重要數據,或者提供最後一次餵狗的機會,因此該中斷中的操作也被稱之為CPU“死前遺囑”,窗口看門狗結構如圖9-2所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-2 窗口看門狗內部結構示意圖

1、時鐘源

PCLK1為APB1總線時鐘,時鐘頻率最大為36MHz,通過設置APB1總線時鐘預分頻係數,可以改變PCLK1的時鐘頻率,一般默使用36MHz。

2、窗口看門狗控制寄存器(WWDG_CR)

窗口看門狗控制寄存器主要包含兩部分:窗口看門狗使能位(WDGA)和7位計數器(T[6:0])。窗口看門狗使能位用來啟動窗口看門狗;計數器用來進行倒計數,每經過(4096x2WDGTB)個PCLK1週期減1。當計數器值從0x40變為0x3F時(即T6位由1變成0),產生看門狗復位。

3、窗口看門狗配置寄存器(WWDG_CFR)

窗口看門狗配置寄存器由三部分組成:提前喚醒中斷使能位(EWI)、預分頻器(WDGTB)和7位窗口值。如果設置“提前喚醒中斷使能位”為1時,計數器計到0x40時便會產生中斷,該位無法軟件清零,即軟件只能使能中斷,但是無法失能中斷,只有產生復位後會自動清零該位,通常程序初始化會再次使能。

預分頻器主要設置預分頻係數WDGTB,使得計數器每經過(4096x2WDGTB)個PCLK1週期減1,預分頻器有2個數據位,分別位於WWDG_CFR寄存器的第7和第8位,可以設置4種分頻方式,其參數如表9-3所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

窗口值用於設定計數上限,防止程序異常後過早“餵狗”,窗口值最大可以設置為27-1=127,最小必須大於0x40。

4、狀態寄存器(WWDG_SR)

該寄存器主要包含一個“提前喚醒中斷標誌位”,當計數器值達到0x40時,此位會被硬件置’1’,如果使能“提前喚醒中斷使能位”,當標誌位置1時程序將會進入WWDG中斷,該位需要由軟件清“0”。

9.2.1 配置WWDG

WWDG配置流程與IWDG相比,要設置窗口上限和配置中斷,其中計數器遞減至窗口上限的值的時間要大於等於被檢測程序所執行的時間,窗口下限值默認為0x40,保證上限值一定要大於0x40,否則窗口期將不存在。窗口看門狗時序圖如圖9-3所示,其中W[6:0]為設置的窗口上限值。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-3 窗口看門狗時序圖

窗口看門狗超時時間計算公式如下:

Twwdg = (4096×2WDGTB×(T[5:0]+1)) /Fpclk1;

其中:

Twwdg: WWDG 超時時間

Fpclk1: APB1 的時鐘頻率

WDGTB:WWDG 的預分頻係數

當PCLK1=最大36Mhz時,窗口看門狗超時週期入表9-4所示

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

比如:設置預分頻係數WDGTB=0時,即WWDG時鐘頻率為36Mhz / 4096,當計數初值為0x41時,此時超時值最小,即等於1個計時週期,約為113us,當計數初值為0x7F時,此時值最大,即等於64個計時週期,約為7.28ms。實際開發中,通過改變預分頻係數和計數值,選擇合適的超時週期。

WWDG配置流程如下:

1、使能WWDG時鐘

2、設值WWDG預分頻係數

3、設置WWDG窗口值(計數上限)

4、使能WWDG(使能的同時也將計數初值寫入到計數器)

5、設置WWDG中斷優先級

6、清除WWDG提前喚醒中斷標誌位

7、使能WWDG提前喚醒中斷

8、編寫WWDG中斷服務函數(根據實際需求選擇最後一次餵狗或者保存重要數據)

注意:由於窗口看門狗中斷觸發後,將會在1個計時週期後觸發單片機復位,因此該中斷的執行的時間應該小於一個計時週期,即最小為113us,最大為910us。如果保存數據至外部存儲器,比如EEPROM或Flash,時間往往是不夠的,此時可以選擇保存數據至STM32的備份區域。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

9.2.2 窗口看門狗實驗

窗口看門狗實驗與獨立看門狗類似,通過延時函數模擬程序運行時間,只不過由於窗口看門狗具體餵狗窗口期,需要嚴格計算程序的執行時間,否則造成提前餵狗。同時由於窗口看門狗具有中斷,該中斷可以用於餵狗,也可以保存數據,例程中選擇在提前喚醒中斷中進行最後一次餵狗,防止系統復位。此時需要注意一種情況:即在中斷和主循環中都有餵狗程序時,防止中斷餵狗後,又返回主程序執行餵狗,導致提前餵狗,使得系統復位。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

9.3 密碼鎖實驗

9.3.1 設計要求

日常生活中越來越多的場所逐漸使用智能鎖來替代傳統機械式,相比於傳統機械鎖,智能鎖具有安全性高,不需要隨身攜帶鑰匙,美觀,可靠等優點。按照識別方式智能鎖分為指紋識別鎖、IC識別鎖以及電子密碼鎖等,無論哪種方式,智能鎖通常都是將數據存放在EEPROM或者FLASH中。本節結合利用觸摸屏以及EEPROM設計一款虛擬按鍵界面的電子密碼鎖。

密碼鎖基本功能如下:

1、可以更改密碼;

2、具有加密功能;

3、具有錯誤報警功能,超過輸入錯誤次數,輸入鎖定;

4、採用觸摸屏構造虛擬按鍵界面;

5、輸入密碼正確後RGB顯示綠光,表示開鎖成功;

9.3.2 設計思路

該實驗中採用虛擬按鍵,即通過TFT-LCD構造數字按鍵0~9以及功能按鍵Enter和Ese,通過觸摸數字所在的區域獲取該區域對應的數據,從而代替傳統物理按鍵。密碼鎖主要分為兩種狀態,分別是鎖定狀態和開啟狀態,平時為鎖定狀態,只有輸入密碼成功後才切換為開啟狀態,開鎖成功RGB將顯示綠光。密碼存儲在EEPROM中,系統第一次啟動時需要設置密碼,之後在開鎖成功後按Enter鍵可以更改密碼。輸入密碼時,如果想重新輸入可以按Ese鍵清空密碼輸入區,連續四次輸入錯誤時,系統將鎖定按鍵60s。

如果忘記密碼,更改EEPROM中密碼的存儲地址或者密碼的長度,重啟後可重新設置密碼。

具體代碼如下:

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

9.4 事件記錄器實驗

9.4.1 項目需求

在實際產品應用中,經常會有記錄某一段時間內的數據的需求。比如監控某一個區域內近1個月的溫溼度情況,每分鐘記錄一次;記錄某一個水域最近幾年每天上午8點的水位;記錄電動汽車最近三個月電壓變化曲線,每1分鐘記錄一次;記錄某一個路口最近一週的車流量,每1秒記錄一次……

用來保存所記錄數據的設備有很多種,Flash就是一種常用的器件。本小節定製一個任務,記錄過去7天內的溫溼度信息,每1分鐘記錄一次時間以及溫溼度信息,並且通過指令可以任意查詢。

9.4.2 設計思路

首先確定數據格式,數據需要佔用“年+月+日+小時+分鐘+溫度+溼度”共8個字節。總共需要存儲60*24*7=10080條數據,每個扇區最大可以存儲4096÷8=512條數據,存儲這7天的數據總共需要20個扇區。由於Flash擦除是整扇區擦除,所以寫滿最後一個扇區再回頭寫第1個扇區時會擦掉第1扇區的所有數據,所以這裡多使用1個扇區共21個扇區作為數據記錄區。為了保證程序斷電或者復位導致重啟後能夠從斷點繼續記錄,在記錄區後使用一個扇區存儲校驗碼,驗證程序時第一次啟動還是重啟,重啟時遍歷記錄區查找斷點。

通過串口發送“R-read 年-月-日 時:分:秒 讀取次數”即可讀取從發送時間開始後的n次數據,注意由於間隔1分鐘記錄一次數據,默認秒為00,同時讀取次數至少為1。比如發送“R-read 2018-7-11 10::46:00 10”,即讀取2018年7月11日11時12分00秒之後的10條數據記錄,如圖9-4所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-4 串口發送指令讀取記錄器數據

如果指令錯誤,將返回發送的內容;如果發送的時間超出記錄器記錄的時間範圍,將返回“Record Error.”;如果未輸入讀取次數,或讀取次數小於1,將返回“bad parameter.”

從發送時間開始輸出數據,如果未查詢到相應數據,返回“No data found.”

當輸出數據量較大時,應設置合適的串口輸出數據緩衝區大小,否則會出現輸出錯誤。例程設置輸出緩衝區為4096字節,最多可以輸出90多條數據,再多就需要增加串口輸出緩衝區的大小。

9.4.3 程序設計

記錄器結構主要分為兩部分,一是記錄數據,二是讀取數據。為了方便理解將程序拆分為兩部分介紹,實際以參考例程為準,其中記錄數據流程如圖9-5所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-5 記錄器記錄數據流程圖

記錄器讀取數據流程與之前第六章發送指令讀取Flash數據的原理一樣,僅僅是解析指令與執行的動作不同,因此不再介紹串口監測及收發的相關流程,記錄器發送指令讀取數據流程如圖9-6所示。

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

圖9-6 記錄器讀取數據流程圖

具體代碼如下:

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器

ARM嵌入式編程與實戰應用(STM32F1系列 第9章密碼鎖與事件記錄器


分享到:


相關文章: