基于mini2440的看门狗(裸机)
在由單片機(jī)構(gòu)成的微型計(jì)算機(jī)系統(tǒng)中,由于單片機(jī)的工作常常會(huì)受到來(lái)自外界電磁場(chǎng)的干擾,造成程序的跑飛,而陷入死循環(huán),程序的正常運(yùn)行被打斷,由單片機(jī)控制的系統(tǒng)無(wú)法繼續(xù)工作,會(huì)造成整個(gè)系統(tǒng)的陷入停滯狀態(tài),發(fā)生不可預(yù)料的后果,所以出于對(duì)單片機(jī)運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)測(cè)的考慮,便產(chǎn)生了一種專門用于監(jiān)測(cè)單片機(jī)程序運(yùn)行狀態(tài)的芯片,俗稱"看門狗",s3c2440中也集成了看門狗,在受到干擾或者系統(tǒng)錯(cuò)誤時(shí)是芯片復(fù)位。s3c2440的看門狗有兩個(gè)特點(diǎn):1、提供16bit的時(shí)間間隔的中斷。2、128個(gè)PCLK的周期復(fù)位信號(hào)。看門狗的結(jié)構(gòu):
看門狗定時(shí)器頻率計(jì)算如下:
分頻值從0到2的8次方減1,分頻系數(shù)可選:16、32、64、128。s3c2440看門狗操作需要三個(gè)寄存器:WTCON、WTDAT、WTCNT。分別是看門狗控制、限時(shí)、計(jì)數(shù)。在啟動(dòng)時(shí)候WTDAT不會(huì)自動(dòng)裝載到WTCNT,所以初始化時(shí)一定要寫定時(shí)值到WTCNT中。
測(cè)試程序:
測(cè)試中我們將分頻值設(shè)置為249,分頻系數(shù)設(shè)置為16。可計(jì)算看門狗時(shí)間間隔t_watchdog為0.00008s,設(shè)置4秒中斷一次的話那么WTDAT的值應(yīng)設(shè)置為50000。每次中斷蜂鳴器響起,并用串口顯示相關(guān)信息。程序如下:
主程序部分:
看門狗部分:
?
?
#include "2440addr.h"unsigned char watchdog_flag = 0;//看門狗中斷標(biāo)志 void __irq watchdog_interrupt(void);/*看門狗初始化*/ void watchdog_set(unsigned int wtcnt) {/*開(kāi)始時(shí)不自動(dòng)裝載因此需先設(shè)置計(jì)數(shù)值*/rWTDAT = wtcnt;rWTCNT = wtcnt;/*使用中斷但不復(fù)位CPU*/rWTCON |= (249<<8 | 1<<5 | 1<<2 | 0);rINTSUBMSK &= ~(1<<13);//允許看門狗中斷rINTMSK &= ~(1<<9);/*設(shè)置中斷向量*/pISR_WDT_AC97 = (unsigned)watchdog_interrupt; }/*喂狗操作*/ void feed_watchdog(unsigned int wtcnt) {rWTCNT = wtcnt; }/*看門狗中斷服務(wù)函數(shù)*/ void __irq watchdog_interrupt(void) {rSUBSRCPND |= 1<<13;//清除中斷rSRCPND |= 1<<9;rINTPND |= 1<<9;watchdog_flag = 1;//設(shè)置用戶中斷標(biāo)志 }
運(yùn)行結(jié)果:
?
源代碼地址:http://download.csdn.net/detail/a16839678/6272069
?
總結(jié)
以上是生活随笔為你收集整理的基于mini2440的看门狗(裸机)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CAS 之 集成RESTful API
- 下一篇: php 时间 (年,月,星期,天,小时,