14. 從0學ARM-exynos4412-看門狗裸機程序編寫


看門狗

一、概念

看門狗的簡稱是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
看門狗模塊包括一個預比例因子放大器,一個四分頻的分頻器,一個16位計數器。

看門狗的時鍾信號源來自PCLK,為了得到寬范圍的看門狗信號,PCLK先被預分頻,然后再進過分頻器分頻。預分頻比例因子和分頻器的分頻值,都可以由看門狗控制寄存器(WTCON)決定,預分頻比例因子的范圍是0~255,分頻器的分頻比可以是16、32、64或128。看門狗定時器時鍾周期的計算如下:

clock分頻公式
式中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
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

WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2)|(1 << 0);

2)當普通定時器使用
如果用戶想把看門狗定時當做一般定時器使用,應該中斷使能,禁止看門狗定時器復位。

WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2);

2) 看門狗定時器數據寄存器(WTDAT)

在這里插入圖片描述
WTDAT用於指定超時時間,在看門狗把復位功能禁止並打開中斷使能后,此時看門狗定時器就是一個普通的定時器,使用方法和普通定時器一樣。當使用復位功能后,由於WTCNT的值減到0時,系統就會復位,所以WTDAT的值裝不進看門狗計數寄存器(WTCNT)中。復位后初始值為0x8000。

3) 看門狗計數寄存器(WTCNT) 喂狗用

WTCNT包含看門狗定時器工作的時候,計數器的當前計數值。WTCNT描述如下:
WTCNT

4) WTCLRINT

寫入任意值清中斷。
WTCLRINT

三、看門狗定時器的程序編寫

1、看門狗軟件程序設計流程

因為看門狗是對系統地復位或中斷的操作,所以不需要外圍的硬件電路。要實現看門狗的功能,只需要對看門狗的寄存器組進行操作,即對看門狗的控制寄存器(WTCON)、看門狗數據寄存器(WTDAT)、看門狗計數寄存器(WTCNT)的操作。

其一般流程如下:

  1. 設置看門狗中斷操作,包括全局中斷和看門狗中斷使能及看門狗中斷向量的定義,如果只是進行復位操作,這一步不用設置。

  2. 對看門狗控制寄存器(WTCON)的設置,包括設置預分頻比例因子、分頻器的分頻值,中斷使能和復位使能等。

  3. 對看門狗數據寄存器(WTDAT)和看門狗計數寄存器(WTCNT)的設置。

  4. 啟動看門狗定時器。

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; 注釋掉,就會停止喂狗,超時后系統就會reset。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM