啓動看門狗定時器的函數代碼如下所示:
-
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
|