[編程實例] lpc1114看門狗_如何啓動和餵狗

啓動看門狗定時器的函數代碼如下所示:
  • void WDT_Enable(uint8_t mode)
  • {
  •    LPC_SYSCON->PDRUNCFG &= ~(0x1<<6);    // 看門狗振盪器時鐘上電(bit6)
  •    LPC_SYSCON->WDTOSCCTRL = (0x1<<5); // WDT_OSC_CLK=300KHz
  •    LPC_SYSCON->WDTCLKSEL = 0x2;        // 選擇看門狗振盪器時鐘
  •    LPC_SYSCON->WDTCLKUEN = 0x01;      // 更新時鐘源
  •    LPC_SYSCON->WDTCLKUEN = 0x00;      // 先寫0,再寫1達到更新目的
  •    LPC_SYSCON->WDTCLKUEN = 0x01;
  •    while ( !(LPC_SYSCON->WDTCLKUEN & 0x01) );  // 等待更新成功
  •    LPC_SYSCON->WDTCLKDIV = 3;   // 設置看門狗分頻值爲3,所以現在的看門狗時鐘爲100K
  •    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);// 允許WDT時鐘
  •    LPC_WDT->TC = 25000;    // 給看門狗定時器賦值,定時時間大約1秒(wdt_clk=100KHz時)
  •    if(mode==1) LPC_WDT->MOD |= 0x03;         // 寫值0x03:不餵狗產生復位
  •    else if(mode==0) LPC_WDT->MOD |= 0x01; //  寫值0x01:不餵狗發生中斷
  •    LPC_WDT->FEED = 0xAA;        // 喂看門狗,開啓
  •    LPC_WDT->FEED = 0x55;
  • }
WDT_Enable()函數用來啓動看門狗定時器。上面的代碼使用看門狗振盪器作爲時鐘源,定時器的時鐘被配置爲100KHz,初值定位25000,所以最遲餵狗的時間爲(25000÷100000)×4=1秒。
第3行,PDRUNCFG寄存器bit6寫0,看門狗振盪器上電。
第4行,配置WDTOSCCTRL,使得WDT_OSC_CLK爲300KHz。(DIVSEL=0,FREQSEL = 1,WDT_OSC_CLK=600÷2=300KHz)
第5行,選擇看門狗定時器的時鐘源爲看門狗振盪器。
WDTCLKSEL:看門狗時鐘源選擇寄存器
符號 描述 復位值
1:0 SEL   看門狗時鐘源 0x00
0x0 IRC振盪器
0x1 主時鐘
0x2 看門狗振盪器
0x3 保留
31:2 - - 保留 0x00
第6~9行,更新看門狗定時器時鐘源
第10行,給WDTCLKDIV寄存器寫分頻值3,把300KHz變爲100KHz提供給看門狗定時器。
WDTCLKDIV:看門狗定時器分頻寄存器
符號 描述 復位值
7:0 DIV 看門狗時鐘分頻值

0: 關閉看門狗時鐘

1: 分頻值1

255: 分頻值255.

0x00
31:8 - 保留 0x00
第11行,給SYSAHBCLKCTRL寄存器bit15寫1,開啓看門狗定時器的時鐘。(關於SYSAHBCLKCTRL寄存器說明,請看第二章)
第12行,給TC賦值,即給看門狗定時器賦初值。
WDTC:看門狗定時器初值寄存器
符號 描述 復位值
23:0 Count 看門狗定時器溢出間隔 0x00 00FF
31:24 - 保留位,不能給這些位寫1 不定
第13 14行,配置WDMOD寄存器,選擇不餵狗產生復位還是產生中斷,並開啓看門狗定時器。
WDMOD:看門狗模式寄存器
符號 描述 復位值
0 WDEN   看門狗允許位。此位置1,也會鎖定看門狗時鐘源。 0
0 看門狗定時器停止
1 看門狗定時器運行
1 WDRESET   看門狗復位允許位。 0
0 看門狗定時器溢出不會使芯片復位
1 看門狗定時器溢出將使得芯片復位
2 WDTOF   看門狗定時器溢出標誌位,軟件清0 0
3 WDINT   看門狗定時器的值超過WDWARNINT後的中斷標誌位,軟件清0 0
4 WDPROTECT   看門狗定時器更新模式 0
0 WDTC的值可以在任何時候改變
1 WDTC的值只有在小於WDWARNINT和WDWINDOW的值時,纔可以改變。這個位在WDRESET =1的時候使用。
31:5 - - 保留位。禁止給這些位寫1 -
第15 16行,先給FEED賦0xAA,再賦0x55,第一次餵狗開啓看門狗。
WDFEED:看門狗餵狗寄存器
符號 描述 復位值
7:0 Feed 0xAA後面跟一個0x55來餵狗 -
31:8 - 保留 -
注意:只給MOD寄存器bit0位WDEN寫1並不能有效開啓看門狗。WDEN置1後,再喂一次狗才能有效開啓看門狗。

// 餵狗
  • void WDTFeed(void)
  • {
  •    LPC_WDT->FEED = 0xAA;
  •    LPC_WDT->FEED = 0x55;
  • }
寫給FEED寫0xAA,再給FEED寫0x55,即餵狗序列。如果寫了0xAA後,沒有立即給FEED寄存器寫0x55,而是去配置其他的看門狗寄存器,將會立即引起單片機復位或進入看門狗中斷。




http://www.zhixinrui.com/thread-2756-1-1.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章