14. 從0學ARM-exynos4412-看門狗裸機程式編寫
阿新 • • 發佈:2021-02-10
# 看門狗
## 一、概念
看門狗的簡稱是WDT(Watch Dog Timer),exynos4412scp中的看門狗定時器(WDT)是一種定時裝置。
### 1. 工作原理
由(一般需要客戶編寫)軟體讀寫定時器相關的暫存器,開啟看門狗,並設定計數時間(以秒或分鐘計算),定時器計數計滿,由軟體清零,以表明系統狀態正常,這時,定時器計數重新開始,反覆,否則,看門狗認為系統異常或有其他特定事件發生,觸發系統復位訊號,或提供中斷,系統正常後重復定時器計數。
這樣只要軟體正常執行,就不會出現復位或觸發中斷。當軟體宕機或執行出錯時,由看門狗定時器對系統進行復位或觸發中斷,從而保證系統的正常執行。
看門狗的定時時間可以由使用者設定,這樣可以根據需要在指定的時間內復位系統。
### 2. 作用
看門狗的作用是微處理器收到干擾進入錯誤狀態後,使系統在一定時間間隔內復位。因此看門狗是保證系統長期、可靠和穩定執行的有效措施。目前大部分的嵌入式晶片內部都集成了看門狗定時器來提高系統執行的可靠性。
4412處理器的看門狗是當系統由於噪音和系統錯誤而出現故障後,用於處理器的復位操作,也可以作為一個通用的16位定時器來請求中斷操作。看門狗定時器產生128個PCLK週期的復位訊號。主要特性有如下兩個。
1)通用的中斷方式的16位定時器。
2)當計數器減到0(發生溢位)時,產生128個PCLK週期的復位訊號。
### 3. Watchdog Timer Block Diagram
![Watchdog Timer Block Diagram](https://img-blog.csdnimg.cn/20201123162127390.png#pic_center)
看門狗模組包括一個預比例因子放大器,一個四分頻的分頻器,一個16位計數器。
看門狗的時鐘訊號源來自PCLK,為了得到寬範圍的看門狗訊號,PCLK先被預分頻,然後再進過分頻器分頻。預分頻比例因子和分頻器的分頻值,都可以由看門狗控制暫存器(WTCON)決定,預分頻比例因子的範圍是0~255,分頻器的分頻比可以是16、32、64或128。看門狗定時器時鐘週期的計算如下:
![clock分頻公式](https://img-blog.csdnimg.cn/20201123162205237.png#pic_center)
式中Prescaler value 為預分頻比例放大器的值;Divison_factor是四分頻的分頻比,可以是16、32、64或128。
### 4. 工作流程
一旦看門狗定時器被允許,看門狗定時器資料暫存器(WTDAT)的值就不能被自動地裝在到看門狗定時器(WTCNT)中。因此,看門狗啟動前要將一個初始值寫入看門狗計數器(WTCNT)中。
【注意】
當4412用嵌入式ICE除錯時,看門狗定時器的復位功能就不被啟動,看門狗定時器能從CPU核心訊號判斷出當前CPU是否處於除錯狀態。如果看門狗定時器確定當前模式是除錯模式,儘管看門狗產生溢位訊號,但是仍然不會產生復位訊號。
每個時鐘週期都會將看門狗定時計數器WTCNT裡的值減1,當計數器WTCNT裡的值變為0時開始執行超時操作,首先,判斷看門狗控制暫存器裡bit2 WTCON[2]設定情況,如果為1則產生中斷訊號,引起系統中斷,如果為0不做任何操作,進入復位訊號產生器,如果WTCON[0]位為1,則產生控制器復位訊號,否則不做任何操作。每次超時操作之後,看門狗WTCON會自動載入看門狗資料暫存器WTDAT裡的使用者設定值,繼續執行遞減操作。
## 二、暫存器設定
### 1)看門狗定時器控制暫存器(WTCON)
![WTCON](https://img-blog.csdnimg.cn/20201123162317623.png#pic_center)
WTCON暫存器的內容包括:
1. WDT timer:[5] 使用者是否啟動看門狗定時器、
2. Clock select:[4:3] 4個分頻比的選擇、
3. Interrupt generation:[2] 是否允許中斷產生、
4. Reset enable/disable: [0] 是否允許復位操作等。
1) 使用起看門狗功能
開啟看門狗復位功能、允許中斷、16分頻、開啟看門狗定時器、Prescaler value設定為249
```c
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2)|(1 << 0);
```
2)當普通定時器使用
如果使用者想把看門狗定時當做一般定時器使用,應該中斷使能,禁止看門狗定時器復位。
```c
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2);
```
### 2) 看門狗定時器資料暫存器(WTDAT)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201123162410612.png#pic_center)
WTDAT用於指定超時時間,在看門狗把復位功能禁止並開啟中斷使能後,此時看門狗定時器就是一個普通的定時器,使用方法和普通定時器一樣。當使用復位功能後,由於WTCNT的值減到0時,系統就會復位,所以WTDAT的值裝不進看門狗計數暫存器(WTCNT)中。復位後初始值為0x8000。
### 3) 看門狗計數暫存器(WTCNT) 喂狗用
WTCNT包含看門狗定時器工作的時候,計數器的當前計數值。WTCNT描述如下:
![WTCNT](https://img-blog.csdnimg.cn/20201123162438612.png#pic_center)
### 4) WTCLRINT
寫入任意值清中斷。
![WTCLRINT ](https://img-blog.csdnimg.cn/20201123170709743.png#pic_center)
## 三、看門狗定時器的程式編寫
### 1、看門狗軟體程式設計流程
因為看門狗是對系統地復位或中斷的操作,所以不需要外圍的硬體電路。要實現看門狗的功能,只需要對看門狗的暫存器組進行操作,即對看門狗的控制暫存器(WTCON)、看門狗資料暫存器(WTDAT)、看門狗計數暫存器(WTCNT)的操作。
**其一般流程如下:**
1) 設定看門狗中斷操作,包括全域性中斷和看門狗中斷使能及看門狗中斷向量的定義,如果只是進行復位操作,這一步不用設定。
2) 對看門狗控制暫存器(WTCON)的設定,包括設定預分頻比例因子、分頻器的分頻值,中斷使能和復位使能等。
3) 對看門狗資料暫存器(WTDAT)和看門狗計數暫存器(WTCNT)的設定。
4) 啟動看門狗定時器。
```c
void do_irq(void)
{
static int a = 1;
int irq_num;
irq_num = CPU0.ICCIAR&0x3ff; //獲取中斷號
switch(irq_num)
{ case 75:
printf("in the WDT interrupt!\n");
//WDT.WTCNT = 25000;//喂狗
WDT.WTCLRINT = 0;
ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 11); //清GIC中斷標誌位
break;
}
CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num; //清cpu中斷標誌位
}
void wdt_init(void)
{
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2)|(1 << 0);//復位使能
//WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2); //關閉復位使能
WDT.WTDAT = 25000;
ICDDCR = 1; //使能分配器
ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 11); //使能相應中斷到分配器
ICDIPTR.ICDIPTR18 = ICDIPTR.ICDIPTR18 & (~(0xff << 24))|(0x1 << 24); //選擇CPU介面
CPU0.ICCPMR = 255; //中斷遮蔽優先順序
CPU0.ICCICR = 1; //使能中斷到CPU
}
int main (void)
{
wdt_init();
printf("hello reset!\n");
while(1)
{
WDT.WTCNT = 25000;//喂狗,如果一旦停止喂狗,系統就reset
mydelay_ms(100);
}
return 0;
}
```
上述是正確執行的程式碼,將WDT.WTCNT = 25000; 註釋掉,就會停止喂狗,超時後系統就會r