失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SYD8821 WDT模块使用说明【WDT中断的使用】【WDT复位类型】

SYD8821 WDT模块使用说明【WDT中断的使用】【WDT复位类型】

时间:2019-03-20 05:55:55

相关推荐

SYD8821 WDT模块使用说明【WDT中断的使用】【WDT复位类型】

SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用具体可咨询:/

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,可在串口上看到如下波形:

这里上传本博客源代码(工程在:SYD8821_SDK\Source Code\SYD8821\wdt\Keil):/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不放,可以在串口看到这样的打印:

可以看到打印“wdt_callback”之后就复位了!

这里上传本博客代码(工程在:\SYD8821_SDK\Source Code\SYD8821_other\wdt_IRQ\Keil):/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

如果觉得《SYD8821 WDT模块使用说明【WDT中断的使用】【WDT复位类型】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。