当前文档版本为 v0.6.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

deepsleep_wdt例程

1 功能概述

这是一个 DEEPSLEEP&WDT 代码例程,旨在演示如何配置和使用嵌入式系统中的看门狗 (WDT) 功能,并在 DEEPSLEEP 睡眠模式下进行测试。该代码例程实现了以下功能:

  1. 配置看门狗定时器的超时时间为50ms。

  2. 将MCU设置为 DEEPSLEEP 睡眠模式,使其进入低功耗状态。

  3. 在MCU运行时,看门狗定时器定时监测MCU的状态。

  4. 当MCU进入 DEEPSLEEP 睡眠模式时,看门狗定时器停止监测,直到MCU重新唤醒。

  5. 如果在MCU唤醒后没有喂狗动作,那么MCU将在连续三次唤醒后被看门狗复位。

通过该代码例程的演示,用户可以了解如何在嵌入式系统中配置和使用看门狗功能,以及如何在低功耗状态下保持系统的稳定性。

注:KEY1对应P1_5;RGB蓝色指示灯对应P1_2

2 环境要求

  • Board: PAN262xb1_evb

  • 将 J17 单刀双掷开关拔至PWM1侧,将P1_2与RGB蓝色指示灯控制引脚相连

  • KEY1 独占 P1_5,不需要拔开关

3 编译和烧录

例程位置:pan262x_dk/01_SDK/example_extension/deepsleep_wdt

打开目录下keil下的deepsleep_wdt.uvprojx工程,编译整个代码工程。

注意烧写此工程代码后,若要再次烧写代码必须要按下RST KEY后2秒内进行烧写,否则MCU进入低功耗后,无法进行代码烧写

4 演示说明

根据环境要求一节的介绍,正确连接 EVB 开发板的跳线,编译、下载代码后:

  1. 等待蓝色LED熄灭,大约2秒时间,由于MCU进入deepsleep状态后,无法进行烧写,这个2秒时间是留给再次烧写代码的时间窗口

  2. 在不按KEY1的情况下观察蓝色led工作状态,大约1秒时间蓝色led灯亮一次,表示MCU被WakeupCounter唤醒

  3. 设置看门狗定时间约为50ms:WDT_Init(WDT_DIV_4, WDT_TIMEOUT_MS(50));

  4. 如果每次醒来不进行喂狗动作,则醒来三次MCU就会复位,log如下图:

image-20230331112645117

  1. 如果每次醒来后进行喂狗动作,MCU可以一直睡眠和运行交替下去,不会复位,log如下图:

image-20230331121555657

5 开发说明

  • 通过调用 lp.c中的LP_ExIntSourceSelect()、WakeupGpioConfig()、LP_WakeCounterConfig()等函数接口来实现低功耗功能,详细请查阅代码。

 /** Config EXTERN_INT0/1 as wakeup interrupt */
 LP_ExIntSourceSelect(INT_SEL_WAKEUP);

 /** Config P15 as wakeup pin */
 LP_WakeupGpioConfig(GPIO_PORT1, GPIO_Pin_5, GPIO_LOW);
 LP_WakeupGpioEnable(GPIO_PORT1, GPIO_Pin_5, ENABLE);

 LP_WakeCounterConfig(CNT_1024000_US, WAKEUP_CNT_ONESHOT);
 LP_WakeupCounterStart();

  • 例程中的wdt相关代码如下:

 WDT_Init(WDT_DIV_4, WDT_TIMEOUT_MS(50));
    
    printf("Deepsleep&wdt test.\r\n");
    
    while(1)
    {
        LP_WakeCounterConfig(CNT_1024000_US, WAKEUP_CNT_ONESHOT);
        LP_WakeupCounterStart();
        
        /** Wait for gpio P1_6 to low level interrupt mode */
        while(GpioWakeLevel != LEVEL_LOW) 
        {
            WDT_Feed();   /**< 有时候用户的按下的时间比较长,这里要喂狗,防止MCU复位 */
        }
        
        RCC_PeriphClockCmd(RCC_PERIPH_WDT, DISABLE); /**< Turn off watchdong before entern deepsleep */
        DeepsleepConfig();
        LP_GotoDeepsleep();
        RCC_PeriphClockCmd(RCC_PERIPH_WDT, ENABLE); /**< Turn on watchdong after mcu wakeup */
        
        RCC_SysClkInit();
        
        P1_2 = LED_ON;
        DelayMs(10);
        P1_2 = LED_OFF;
        
        printf("Mcu wakeup.\r\n");
        
//        WDT_Feed(); /**< 这里如果不喂狗,用户也不按下KEY1, 大约MCU醒来3次后就看门狗超时复位了 */
    }

6 RAM/Flash资源使用情况

Program Size: data=37.2 xdata=0 const=44 code=2912