WDT模塊使用說明
打開工程「SYD8821_SDK\Source Code\SYD8821\wdt\Keil」可以看到wdt的主函數如下:
void wdt_callback(void)
{
dbg_printf("wdt_callback\r\n");
}
int main()
{
__disable_irq();
//GPO
pad_mux_write(LED4, 0);
pad_mux_write(LED5, 0);
pad_mux_write(LED6, 0);
pad_mux_write(LED7, 0);
gpo_config(LED4,1);
gpo_config(LED5,1);
gpo_config(LED6,1);
gpo_config(LED7,1);
//GPI
pad_mux_write(KEY1, 0);
pad_mux_write(KEY2, 0);
pad_mux_write(KEY3, 0);
gpi_config(KEY1, PULL_UP);
gpi_config(KEY2, PULL_UP);
gpi_config(KEY3, PULL_UP);
//uart 0
pad_mux_write(20, 7);
pad_mux_write(21, 7);
dbg_init();
dbg_printf("SYD8821 WDT TEST\r\n");
// Select External XO
sys_32k_clock_set(SYSTEM_32K_CLOCK_XO);
wdt_set_crv(32768); //1S
wdt_set_RR_enable(WDT_RR_ALL); //使能RR喂狗機制
//wdt_set_reset_type(0);
wdt_set_reset_type(WDT_RESET_ALL); //設置看門狗定時器到來的行爲是復位所有模塊
wdt_start(0); //使能WDT,這裏在使能的時候不喂狗
// wdt_set_interrupt_callback(wdt_callback); //開啓WDT中斷,注意:這裏WDT的中斷模式和復位模式只能夠二選一,
// wdt_int_enable(); //也就是說要產生中斷必須設置復位類型爲0wdt_set_reset_type(0);
delay_ms(100); //因爲進入while(1)後就會立即喂狗,但是要求開啓wdt後要延遲一段時間才能夠喂狗 所以這裏延時一段時間(100us以上)
__enable_irq();
while(1)
{
gpo_toggle(LED4);
if(gpi_get_val(KEY1)){
wdt_reset_counter(); //喂狗
gpo_toggle(LED5);
}
if(!gpi_get_val(KEY2)){
wdt_stop(); //關掉看門狗
gpo_toggle(LED6);
}
delay_ms(100);
}
}
改工程在運行後不按下任何按鍵默認喂狗,不會復位。按下相應按鍵後會進行相應的流程:
按下KEY1:程序不進行喂狗 看門狗將在一段時間後復位MCU
按下KEY2:程序停止看門狗,看門狗將被關閉
如果長按KEY1,可在串口上看到如下波形:
如果設置超時時間爲2s,也就是wdt_set_crv(32768*2);,長按KEY1,可在串口上看到如下波形:
如果設置超時時間爲10s,也就是wdt_set_crv(32768*10);,長按KEY1,可在串口上看到如下波形:
WDT中斷的使用
按照上面例程的說明,可以把wdt的初始化配置成這樣:
// Select External XO
sys_32k_clock_set(SYSTEM_32K_CLOCK_XO);
wdt_set_crv(32768); //1S
wdt_set_RR_enable(WDT_RR_ALL);
wdt_set_reset_type(0);
//wdt_set_reset_type(WDT_RESET_ALL);
wdt_start(0);
wdt_set_interrupt_callback(wdt_callback);
wdt_int_enable();
這時候如果按住key1,停止喂狗,等待看門狗超時後將進入wdt_callback中斷服務函數,其源碼如下:
void wdt_callback(void)
{
dbg_printf("wdt_callback\r\n");
pmu_system_reset();
}
這時候會打印"wdt_callback\r\n"並且會進入復位流程,wdt中斷的功能是能夠在看門狗復位之前能夠處理一些保存數據的事情。
一直按住key1不放,可以在串口看到這樣的打印:
可以看到打印「wdt_callback」之後就復位了!
在WDT初始化有配置復位類型的語句: wdt_set_reset_type(WDT_RESET_ALL); //設置看門狗定時器到來的行爲是復位所有模塊
其中WDT_RESET_ALL屬於如下枚舉類型:
enum {
WDT_RESET_MCU = 1, //單純的復位MCU
WDT_RESET_SYSTEM = 2,//是把GPIO,TIMER,RTC,pem_led,watchdog都復位掉
WDT_RESET_ALL = 3,
};
注意:這裏在WDT_RESET_MCU模式下只是復位MCU,而GPIO,TIMER,RTC,pem_led,watchdog這些外設是沒有被複位掉的,而KEIL的仿真復位相當於RESET_MCU