8765|4

223

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

3 RTC配置和定时唤醒 [复制链接]

原本准备测试一下GD32L233的RTC定时唤醒和低功耗状态,发现芯片供电由AMS1117提供,没有可断开的位置,而且还接有USB转串口芯片CH340,不太方便测量实际功耗情况,先把RTC的例程放上来。

1、接上一例程,增加初始化RTC函数

void    gd_start_rtc_init(void)
{
    /* setup RTC time value */
    uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;

    rcu_periph_clock_enable(RCU_PMU);
    rcu_periph_clock_enable(RCU_BKP);
    pmu_backup_write_enable();
    rtc_pre_config();
    if(BKP_VALUE == RTC_BKP0) 
    {
        /* detect the reset source */
        if(RESET != rcu_flag_get(RCU_FLAG_PORRST)) 
        {
            printf("\n\rpower on reset occurred....");
        } 
        else if(RESET != rcu_flag_get(RCU_FLAG_EPRST)) 
        {
            printf("\n\rexternal reset occurred....");
        }
        printf("\n\rno need to configure RTC....");

        //rtc_flag_clear(RTC_STAT_ALRM0F);
        //exti_flag_clear(EXTI_17);

        rtc_show_time();
        rtc_show_alarm();
    }
    else
    {
        rtc_initpara.factor_asyn = prescaler_a;
        rtc_initpara.factor_syn = prescaler_s;
        rtc_initpara.year = 0x16;
        rtc_initpara.day_of_week = RTC_SATURDAY;
        rtc_initpara.month = RTC_APR;
        rtc_initpara.date = 0x30;
        rtc_initpara.display_format = RTC_24HOUR;
        rtc_initpara.am_pm = RTC_AM;

        /* current time input */
        printf("\n\r=======Configure RTC Time========");
        printf("\n\r  please input hour:");
        while(tmp_hh == 0xFF) 
        {
            tmp_hh = usart_input_threshold(23);
            rtc_initpara.hour = tmp_hh;
        }
        printf("\n\r  %0.2x", tmp_hh);

        printf("\n\r  please input minute:");
        while(tmp_mm == 0xFF) 
        {
            tmp_mm = usart_input_threshold(59);
            rtc_initpara.minute = tmp_mm;
        }
        printf("\n\r  %0.2x", tmp_mm);

        printf("\n\r  please input second:");
        while(tmp_ss == 0xFF) 
        {
            tmp_ss = usart_input_threshold(59);
            rtc_initpara.second = tmp_ss;
        }
        printf("\n\r  %0.2x", tmp_ss);

        /* RTC current time configuration */
        if(ERROR == rtc_init(&rtc_initpara)) 
        {
            printf("\n\r** RTC time configuration failed! **");
        } 
        else 
       {
            printf("\n\r** RTC time configuration success! **");
            rtc_show_time();
            RTC_BKP0 = BKP_VALUE;
        }

        /* setup RTC alarm */
        tmp_hh = 0xFF;
        tmp_mm = 0xFF;
        tmp_ss = 0xFF;

        rtc_alarm_disable(RTC_ALARM0);
        printf("\n\r=======Input Alarm Value=======");
        rtc_alarm.alarm_mask = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK;
        rtc_alarm.weekday_or_date = RTC_ALARM_DATE_SELECTED;
        rtc_alarm.alarm_day = 0x31;
        rtc_alarm.am_pm = RTC_AM;

        /* RTC alarm input */
        printf("\n\r  please input Alarm Hour:");
        while(tmp_hh == 0xFF) 
        {
            tmp_hh = usart_input_threshold(23);
            rtc_alarm.alarm_hour = tmp_hh;
        }
        printf("\n\r  %0.2x", tmp_hh);

        printf("\n\r  Please Input Alarm Minute:");
        while(tmp_mm == 0xFF) 
        {
            tmp_mm = usart_input_threshold(59);
            rtc_alarm.alarm_minute = tmp_mm;
        }
        printf("\n\r  %0.2x", tmp_mm);

        printf("\n\r  Please Input Alarm Second:");
        while(tmp_ss == 0xFF) 
        {
            tmp_ss = usart_input_threshold(59);
            rtc_alarm.alarm_second = tmp_ss;
        }
        printf("  %0.2x", tmp_ss);

        /* RTC alarm configuration */
        rtc_alarm_config(RTC_ALARM0, &rtc_alarm);
        printf("\n\r** RTC Set Alarm Success!  **");
        rtc_show_time();
        rtc_show_alarm();

        rtc_interrupt_enable(RTC_INT_ALARM0);
        //rtc_interrupt_enable(RTC_INT_TIMESTAMP);
        rtc_alarm_enable(RTC_ALARM0);
    }
    rtc_flag_clear(RTC_STAT_ALRM0F);
    exti_flag_clear(EXTI_17);
    exti_init(EXTI_17, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    //exti_interrupt_flag_clear(EXTI_17);
    exti_interrupt_enable(EXTI_17);
    nvic_irq_enable(RTC_Alarm_IRQn, 0);
}

 

2、配置唤醒中断,间隔时间5秒

   rtc_wakeup_disable();
    rtc_wakeup_clock_set(WAKEUP_CKSPRE);
    rtc_wakeup_timer_set(5);
    rtc_flag_clear(RTC_STAT_WTF);
    rtc_interrupt_enable(RTC_INT_WAKEUP);
    rtc_wakeup_enable();
    
    exti_flag_clear(EXTI_20);
    exti_init(EXTI_20, EXTI_INTERRUPT, EXTI_TRIG_RISING);
    exti_interrupt_enable(EXTI_20);
    nvic_irq_enable(RTC_WKUP_IRQn, 0);

 

3、按下按键后,休眠前串口打印进入休眠前的时间,关闭LED,配置进入休眠的模式。唤醒后需要重新初始化系统时钟,再打印唤醒后的时间。

       rtc_show_time();
        printf("\nPower Down!");
        delay_1ms(10);
        gd_start_led_off(LED1);
        gd_start_led_off(LED2);
        gd_start_led_off(LED3);
        gd_start_led_off(LED4);
        dbg_low_power_enable(DBG_LOW_POWER_SLEEP);
        pmu_to_deepsleepmode(PMU_LDNPDSP_LOWDRIVE, WFI_CMD, PMU_DEEPSLEEP);
        SystemInit();
        delay_1ms(10);
        rtc_show_time();
        printf("\nWake Up!");

 

4、串口打印信息

 

5、例程代码

GD32L23x_Firmware_Library_V1.0.0.rar (2.67 MB, 下载次数: 99)

此帖出自GD32 MCU论坛

最新回复

其实测耗有几种方式,一种是芯片理想状态下的功耗,二是在实际应用中的功耗。楼主其实也可以用开发板来测,ASM1117他有数据手册自身的功耗的。测出来后可以根据手册把这部分功耗标注出来。   详情 回复 发表于 2022-3-28 10:57
点赞 关注
 

回复
举报

6822

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

电由AMS1117提供,没有可断开的位置,而且还接有USB转串口芯片CH340,不太方便测量实际功耗情况

这个可否用低功耗配置进行解决呢

此帖出自GD32 MCU论坛
 
 
 

回复

7244

帖子

2

TA的资源

版主

板凳
 

低功耗板子,居然没法测芯片功耗?不应该吧。。。

此帖出自GD32 MCU论坛
 
 
 

回复

223

帖子

1

TA的资源

一粒金砂(高级)

4
 
本帖最后由 wm20031015 于 2022-2-15 00:09 编辑

从原理图上看,需要断开的线包括:1、串口部分:PA9、PA10,2、SWD部分:SWDAT、SWCLK、NRST,3、3.3V电源,串口和SWD部分电路断开想再连回去就不好操作了。不断开想测量几uA的待机功耗就不太理想了,晚上把3.3V电源断开,串个10R电阻作为采样电阻,测量上面电压,测量结果如下:

  采样电阻上电压(mV) 采样电阻(Ω) 电流(mA)
工作状态 121.56 10 12.156
DEEPSLEEP 0.66 10 0.066
DEEPSLEEP1 0.31 10 0.031
DEEPSLEEP2 0.30 10 0.030

 

1、工作状态电流

2、DEEPSLEEP状态电流 

3、DEEPSLEEP1状态电流 

4、DEEPSLEEP2状态电流 

 

5、查手册上电气参数,DEEPSLEEP模式的功耗典型值是93uA,DEEPSLEEP模式的功耗典型值是3.5uA,DEEPSLEEP2模式的功耗典型值是2.0uA,

 6、  RTC打开,串口、按键、LED以外的所有IO配置为模拟输入状态,测得的电流与手册上的典型值有不小的偏差,与测试条件有关系。也基本上达到进入低功耗,RTC周期唤醒的目的,等后面有时间做个PCB再仔细测试。

此帖出自GD32 MCU论坛
 
 
 

回复

7044

帖子

11

TA的资源

版主

5
 

其实测耗有几种方式,一种是芯片理想状态下的功耗,二是在实际应用中的功耗。楼主其实也可以用开发板来测,ASM1117他有数据手册自身的功耗的。测出来后可以根据手册把这部分功耗标注出来。

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表