1362|4

237

帖子

1

资源

一粒金砂(高级)

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、串口打印信息

image.png  

5、例程代码

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


回复

6797

帖子

0

资源

五彩晶圆(中级)

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

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


回复

1271

帖子

0

资源

版主

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


回复

237

帖子

1

资源

一粒金砂(高级)

本帖最后由 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、工作状态电流

image.png

2、DEEPSLEEP状态电流 

image.png 3、DEEPSLEEP1状态电流 

image.png 4、DEEPSLEEP2状态电流 

image.png  

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

image.png

image.png

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


回复

1409

帖子

3

资源

版主

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


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

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    推荐帖子
    PCB电镀工艺知识资料

    一. 电镀工艺的分类: 酸性光亮铜电镀 电镀镍/金 电镀锡 二. 工艺流程: 浸酸→全板电镀铜→图形转移→酸性除油→ ...

    积分电路原理之新解——放大器与电容的变身

    将反相放大器中的反馈电阻,换作电容,便成为如图一所示的积分放大器电路。对于电阻,貌似是比较实在的东西,电路输出状态可以一 ...

    基于GD32的仓库温度报警系统---串口调试

    拿到开发板后,下载完官方提供的demo包,在MDK5.0上开发。首先将插件安装上去,再加载KEIL中的需要用到的,基于GD32F350的编译库 ...

    瑞萨培训

    各位大神知道哪里举办瑞萨的相关培训吗?

    为什么电解电容会爆炸?如何避免?

    电解电容内有电极、介质材料、电解液,根据其结构与可能的工作条件,电解电容爆炸的原因分析如下: 1、电解液受热会膨胀 ...

    TMS320C6748的GPIO特性

    参考TI技术文档SPRUFL8B(《TMS320C674x/OMAP-L1x Processor GPIO User's Guide》)的1.2Features部分我们可以看出TMS320C67 ...

    关闭
    站长推荐上一条 1/8 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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