1. 新建rtc_test.c文件,加入下面代码:
extern const struct rtc_dev_platform_data rtc_data;//该结构体在board_ac632n_demo.c定义并赋值

uint16_t rtc_start_flag;

void rtc_start()
{
   rtc_init(&rtc_data);				//初始化rtc
   printf("rtc_init!\r\n");
   sys_timer_del(rtc_start_flag);
}


void rtc_test_demo()
{
    struct sys_time tmp_time;
    memset((u8 *)&tmp_time, 0, sizeof(tmp_time));

 //   rtc_init(&rtc_data);				//初始化rtc

    read_sys_time(&tmp_time);					//读当前rtc时间
    printf("rtc_rtc_read_time_before: %d-%d-%d %d:%d:%d\n", tmp_time.year, tmp_time.month, tmp_time.day, tmp_time.hour, tmp_time.min, tmp_time.sec);	//打印读取时间值


/*
    write_sys_time(&test_sys_time); 		//修改rtc时间
    read_sys_time(&tmp_time); 				//读修改后rtc时间
    printf("rtc_rtc_read_time_after: %d-%d-%d %d:%d:%d\n", tmp_time.year, tmp_time.month, tmp_time.day, tmp_time.hour, tmp_time.min, tmp_time.sec);		//打印修改后时间值

    read_alarm(&tmp_time); 					//读当前alarm时间
    printf("rtc_read_alarm_before: %d-%d-%d %d:%d:%d\n", tmp_time.year, tmp_time.month, tmp_time.day, tmp_time.hour, tmp_time.min, tmp_time.sec);	//打印读取闹钟时间值

    write_alarm(&test_alarm); 	//修改alarm时间
    read_alarm(&tmp_time); 		//读修改后alarm时间
    printf("rtc_read_alarm_after: %d-%d-%d %d:%d:%d\n", tmp_time.year, tmp_time.month, tmp_time.day, tmp_time.hour, tmp_time.min, tmp_time.sec);		//打印修改后闹钟时间值
*/
}

其中rtc初始化的结构体类型在rtc.h文件中定义,

struct rtc_dev_platform_data {
    const struct sys_time *default_sys_time;
    const struct sys_time *default_alarm;
    void (*cbfun)(u8);
    u8 x32xs;
    u8 clk_sel;
    u8 trim_t;      ///< trim时间,仅选择LRC时钟源时配置,单位:分钟
};

#define RTC_DEV_PLATFORM_DATA_BEGIN(data) \
	const struct rtc_dev_platform_data data = {

#define RTC_DEV_PLATFORM_DATA_END()  \
    .x32xs = 0, \
};

在文件board_ac632n_demo.c里按照rtc_dev_platform_data类型具体定义了一个rtc_data结构体,并进行了赋值。


#if TCFG_RTC_ALARM_ENABLE
const struct sys_time def_sys_time = {  //初始一下当前时间
    .year = 2020,
    .month = 1,
    .day = 1,
    .hour = 0,
    .min = 0,
    .sec = 0,
};
const struct sys_time def_alarm = {     //初始一下目标时间,即闹钟时间
    .year = 2050,
    .month = 1,
    .day = 1,
    .hour = 0,
    .min = 0,
    .sec = 0,
};

extern void alarm_isr_user_cbfun(u8 index);
RTC_DEV_PLATFORM_DATA_BEGIN(rtc_data)
    .default_sys_time = &def_sys_time,
    .default_alarm = &def_alarm,
    /* .cbfun = NULL,                      //闹钟中断的回调函数,用户自行定义 */
    .cbfun = alarm_isr_user_cbfun,
    .clk_sel =  CLK_SEL_LRC,            //使用内部RC振荡器
RTC_DEV_PLATFORM_DATA_END()
#endif
2. 使能RTC模块的宏
//*********************************************************************************//
//                                  RTC_ALARM配置                                  //
//*********************************************************************************//
#define TCFG_RTC_ALARM_ENABLE               ENABLE_THIS_MOUDLE
3. app_main函数添加初始化和相关应用

这里添加的是新建rtc_test.c文件里的两个函数。使用了sys_timer_add( )先添加了rtc_start( )任务,对RTC进行初始化配置,该任务返回前销毁了定时器,为一次性任务。再添加了rtc_test_demo( )函数,该函数每隔3秒读取一次RTC时钟值。

void app_main()
{
    struct intent it;
//......此处省略无关代码
//......此处省略无关代码
//......此处省略无关代码

rtc_start_flag = sys_timer_add(NULL, rtc_start, 1000);
sys_timer_add(NULL, rtc_test_demo, 3000);

    log_info("run app>>> %s", it.name);
    log_info("%s,%s", __DATE__, __TIME__);

    start_app(&it);

#if TCFG_CHARGE_ENABLE
    set_charge_event_flag(1);
#endif
}
4. 打印结果

打开串口助手可以观察到RTC打印情况。
在这里插入图片描述
为什么是从2020-1-1 0:0:2开始打印的?因为初始化RTC时使用sys_timer_add(NULL, rtc_start, 1000),是从1s后开始的。sys_timer_add(NULL, rtc_test_demo, 3000),从3s后开始打印RTC结果。而这两个函数是几乎同时注册的,所以第一次打印的时间就是RTC初始化后2s。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐