杰理AC632N蓝牙芯片RTC使用
用代码分析方法详细讲述了杰理AC632N蓝牙芯片的RTC使用方法,并给出了串口调试打印结果。
·
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。

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