<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > s3c2440看門狗定時器的應(yīng)用

          s3c2440看門狗定時器的應(yīng)用

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          看門狗定時器的主要作用是在程序因為干擾而跑飛后,能夠使系統(tǒng)復(fù)位,不至于使系統(tǒng)永遠的死下去。

          它的原理與一般的定時器沒有多大區(qū)別,就是先要設(shè)置好一段時間,當超過這段時間后,就從當前運行的程序中跳出進入中斷處理程序中。但兩者的主要差別是,一般的定時器中斷是我們希望它發(fā)生的,因此我們不會在定時器中斷發(fā)生前的那個時間段內(nèi)干預(yù)它;而看門狗定時器中斷是我們不希望它發(fā)生的,因此我們要想方設(shè)法地避免其發(fā)生。主要的方法就是在中斷發(fā)生前,重新對看門狗定時器的寄存器進行賦值,使它的定時器重新開始計時。這種方法俗稱喂狗,形象地比喻就是一條看門狗每隔一段時間(比如說一個小時)就會餓,所以就要叫喚,唯一使它不叫的方法就是給它喂食,那么下次叫喚的時間就是從當前喂食起的一個小時后。因此只要在上次喂食后的一個小時內(nèi)再給它喂食,它就永遠不會叫喚。

          s3c2440的看門狗定時器不僅可以引起系統(tǒng)復(fù)位,還可以引起一般的中斷,因此s3c2440的看門狗定時器可以當作一般的定時器使用。

          器的時鐘頻率的公式為:
          PCLK÷(Prescaler + 1)÷Division
          其中Prescaler的取值范圍為0~255,Division的取值為16,32,64和128。例如,當PCLK為50MHz時,設(shè)置Prescaler為249,Division為16,則看門狗定時器的時鐘頻率為12.5kHz。這兩個參數(shù)由寄存器WTCON提供,除此以外,該寄存器還可以設(shè)置是否有效看門狗定時器的超時復(fù)位,是否有效看門狗定時器的超時中斷等??撮T狗定時器還有兩個寄存器WTDAT和WTCNT,WTDAT用于確定超時期限,WTCNT為當前看門狗定時器的計數(shù)值,在第一次設(shè)置看門狗超時時間時,這兩個寄存器都要被寫入超時時間的初始值。當要啟動超時中斷時,還要設(shè)置必要的中斷寄存器,

          下面這個程序就是一個看門狗定時器的實例。該程序就是正常的跑馬燈程序,但加了一個看門狗定時器。我們設(shè)置的看門狗定時器超時時,只會觸發(fā)中斷,不會引起系統(tǒng)復(fù)位。在中斷函數(shù)內(nèi),蜂鳴器會響。我們設(shè)置看門狗定時器的超時期限為4秒,為了不讓程序進入看門狗中斷,必須在該期限內(nèi),往寄存器WTCNT內(nèi)寫數(shù),迫使看門狗定時器重新開始計時。


          #define _ISR_STARTADDRESS 0x33ffff00
          #define pISR_WDT_AC97(*(unsigned *)(_ISR_STARTADDRESS+0x44))
          #define U32 unsigned int

          #define rGPBCON(*(volatile unsigned *)0x56000010)//Port B control
          #define rGPBDAT(*(volatile unsigned *)0x56000014)//Port B data
          #define rGPBUP(*(volatile unsigned *)0x56000018)//Pull-up control B
          #define rSRCPND(*(volatile unsigned *)0x4a000000)//Interrupt request status
          #define rINTMSK(*(volatile unsigned *)0x4a000008)//Interrupt mask control
          #define rINTPND(*(volatile unsigned *)0x4a000010)//Interrupt request status
          #define rSUBSRCPND(*(volatile unsigned *)0x4a000018)//Sub source pending
          #define rINTSUBMSK(*(volatile unsigned *)0x4a00001c)//Interrupt sub mask

          #define rWTCON(*(volatile unsigned *)0x53000000)//Watch-dog timer mode
          #define rWTDAT(*(volatile unsigned *)0x53000004)//Watch-dog timer data
          #define rWTCNT(*(volatile unsigned *)0x53000008)//Eatch-dog timer count

          void delay(int a)
          {
          int k;
          for(k=0;k;
          }

          void __irq watchdog(void)
          {
          rGPBDAT |= 1;//蜂鳴器響

          //清中斷標志位
          rSRCPND = 0x1<<9;
          rSUBSRCPND = 0x1<<13;
          rINTPND = 0x1<<9;
          }

          void Main(void)
          {
          int light;
          int temp;
          int i;
          rGPBCON = 0x015551;//B0輸出,給蜂鳴器;B5~B8輸出,給LED
          rGPBUP= 0x7ff;

          rWTCON = 0xf9<<8;//Prescaler = 249,Division = 16,時鐘頻率為12.5kHz
          //禁止看門狗復(fù)位
          rWTDAT = 50000;//設(shè)置看門狗定時器超時時間為4秒(50÷12.5)
          rWTCNT = 50000;
          rWTCON |= (1<<5)|(1<<2);//開啟看門狗定時器中斷
          rSRCPND = 0x1<<9;
          rSUBSRCPND = 0x1<<13;
          rINTPND = 0x1<<9;
          rINTSUBMSK = ~(0x1<<13);//打開中斷子屏蔽
          rINTMSK = ~(0x1<<9);//打開中斷屏蔽

          pISR_WDT_AC97 = (U32)watchdog;

          light = 0x10;
          light = light<<1;
          temp = light | 1;
          rGPBDAT = ~temp;
          delay(500000);
          while(1)
          {
          for (i=0;i<3;i++)
          {
          light = light<<1;
          temp = light | 1;
          rGPBDAT = ~temp;
          delay(500000);
          }

          rWTCNT = 50000;//喂狗,重新賦值,防止中斷

          for (i=0;i<3;i++)
          {
          light = light>>1;
          temp = light | 1;
          rGPBDAT = ~temp;
          delay(500000);
          }
          }
          }

          如果我們把程序中紅色的那條語句注釋掉,則看門狗定時器可以被看成是一個一般的定時器,即每隔4秒鐘,蜂鳴器會響一下。如果我們使能看門狗定時器超時復(fù)位,則一定要加上這一句,否則系統(tǒng)會每隔4秒鐘復(fù)位一次。


          關(guān)鍵詞: s3c2440看門狗定時

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();