深入理解ARM體系架構(gòu)(S3C6410)---S3C6410看門狗源碼實例
S3C6410看門狗定時器的功能:
本文引用地址:http://m.butianyuan.cn/article/201611/317826.htmThe S3C6410XRISC microprocessor watchdog timer is used to resume the controller operation wheneverit is disturbed by malfunctions such as noise and system errors. The watchdogtimer generates the reset signal.
It can be usedas a normal 16-bit interval timer to request interrupt service.Advantagein using WDT instead of PWM timer is that WDT generates the reset signal.
FEATURES
The WatchdogTimer includes the following features:
• Normal interval timer mode with interruptrequest.
• Internal reset signal is activated when thetimer count value reaches 0 (time-out).
• Level-triggered Interrupt mechanism.
看門狗模塊包括一個8位預(yù)分頻器,一個分頻器,一個16bit計數(shù)器。它的8位預(yù)分頻器把PCLK分頻后,再被分頻得到4種頻率,16分頻,32分頻,64分頻,128分頻。WatchDog可以選擇工作于哪種頻率下。S3C2440用3個寄存器對WatchDog進(jìn)行操作:
看門狗定時器計數(shù)寄存器(WTCNT)
Figure 34-1shows the functional block diagram of the watchdog timer. The watchdog timeruses only PCLK as its source clock. The PCLK frequency is prescaled to generatethe corresponding watchdog timer clock, and the resulting frequency is dividedagain.
The prescalervalue and the frequency division factor are specified in the watchdog timercontrol (WTCON)register. Valid prescaler values range from 0 to 28-1. Thefrequency division factor can be selected as 16, 32, 64,or 128.
Use thefollowing equation to calculate the watchdog timer clock frequency and theduration of each timer clock cycle:
t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )
注意:
1、Once the watchdog timer is enabled, the value ofwatchdog timer data (WTDAT) register cannot be automatically reloaded into thetimer counter (WTCNT). For this reason, an initial value must be written to thewatchdog timer count (WTCNT) register, before the watchdog timer starts.
2、When the S3C6410 is in debug mode using EmbeddedICE, the watchdog timer must not operate.The watchdog timer can determinewhether or not it is currently in the debug mode from the CPU coresignal(DBGACK signal). Once the DBGACK signal is asserted, the reset output ofthe watchdog timer is not activated as the watchdog timer is expired.
看門狗寄存器映射:
1、WATCHDOG TIMER CONTROL(WTCON) REGISTER
WTCON允許用戶使能看門狗定時器,從不同四個源選擇時鐘,使能中斷,使能看門狗定時器輸出。S3C6410看門狗定時器用于系統(tǒng)故障后復(fù)位。如果不希望復(fù)位,則使能定時器無效。
The WTCONregister allows the user to enable/disable the watchdog timer, select the clocksignal from 4 different sources, enable/disable interrupts, and enable/disablethe watchdog timer output.
The Watchdogtimer is used to resume the S3C6410 restart on mal-function after its power on.At this time,disable the interrupt generation and enable the Watchdog timeroutput for reset signal.
If controllerrestart is not desired and if the user wants to use the normal timer only,which is provided by the Watchdog timer, enable the interrupt generation anddisable the Watchdog timer output for reset signal.
注意:Initial state of ‘Reset enable/disable’ is 1(reset enable). If user do notdisable this bit, S3C6410 will be rebooted in about 5.63sec (In the case ofPCLK is 12MHz). So at boot loader, this bit should be disabled before undercontrol of Operating System, or Firmware.
2、WATCHDOG TIMER DATA (WTDAT) REGISTER
WTDAT用于確定超時期限。WTDAT的內(nèi)容在最初的定時器操作時不能自動加載到定時器計數(shù)其中。但使用0x8000將驅(qū)使第一次超時,在這種情況下,WTDAT的值將自動載入WTCNT。
The WTDATregister is used to specify the time-out duration. The content of WTDAT cannotbe automatically loaded into the timer counter at initial watchdog timeroperation. However, using 0x8000 (initial value of WTCNT)will drive the firsttime-out. Then, the value of WTDAT will be automatically reloaded into WTCNT.
3、WATCHDOG TIMER COUNT(WTCNT) REGISTER
The WTCNT register contains the current count values for the watchdogtimer during normal operation.
注意:The content of the WTDAT register cannot be automatically loaded into thetimer count register when the watchdog timer is enabled initially, so the WTCNTregister must be set to an initial value before enabling it.
定義寄存器:
- //watchdog
- #define
WTCON (*(volatile unsigned *)(0x7E004000)) - #define
WTDAT (*(volatile unsigned *)(0x7E004004)) - #define
WTCNT (*(volatile unsigned *)(0x7E004008))
初始化函數(shù):
- void
init_watchdog() - {
WTDAT = 0xff; WTCNT = 0x8000; WTCON = 0XC021;//Prescaler value為6,16分頻 - }
在mian函數(shù)中調(diào)用:
- init_watchdog();
- while(1);
評論