天天看點

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

SYD8821是具有全球領先低功耗(RX 2.4mA @-94.5dBm靈敏度,TX 4.3mA @0dBm輸出功率)的藍牙低功耗SOC晶片,在極低電流下實作了優異的射頻性能,搭配176kB SRAM,512kB flash,非常适合中高階可穿戴、智能家居、物聯網等低功耗應用。具體可咨詢:http://www.sydtek.com/

WDT子產品使用說明

SYD8821 WDT子產品使用說明【WDT中斷的使用】【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:程式停止看門狗,看門狗将被關閉

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

如果長按KEY1,可在序列槽上看到如下波形:

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

如果設定逾時時間為2s,也就是wdt_set_crv(32768*2);,長按KEY1,可在序列槽上看到如下波形:

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

如果設定逾時時間為10s,也就是wdt_set_crv(32768*10);,長按KEY1,可在序列槽上看到如下波形:

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

     這裡上傳本部落格源代碼(工程在:SYD8821_SDK\Source Code\SYD8821\wdt\Keil):https://download.csdn.net/download/chengdong1314/10357271

     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不放,可以在序列槽看到這樣的列印:

SYD8821 WDT子產品使用說明【WDT中斷的使用】【WDT複位類型】

    可以看到列印“wdt_callback”之後就複位了!

    這裡上傳本部落格代碼(工程在:\SYD8821_SDK\Source Code\SYD8821_other\wdt_IRQ\Keil):https://download.csdn.net/download/chengdong1314/10357406

WDT複位類型

    在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

繼續閱讀