【平头哥RVB2601创意应用开发】+ RTC时钟显示实验
[复制链接]
本帖最后由 symic 于 2022-4-23 21:39 编辑
最近测试了一下rtc,结合oled的显示,在屏幕上显示一个不停跳动的时钟。也就是说使用csi接口的rtc作为时钟,通过不停的计数显示时间。同时在OLED屏幕上显示。
一、rtc主要函数和操作
rtc主要使用的相关函数有:
csi_error_t csi_rtc_init(csi_rtc_t *rtc, uint32_t idx)
csi_error_t csi_rtc_set_time(csi_rtc_t *rtc, const csi_rtc_time_t *rtctime)
csi_error_t csi_rtc_get_time(csi_rtc_t *rtc, csi_rtc_time_t *rtctime)
相关结构体有
/****** RTC time ******/
typedef struct {
int tm_sec; ///< Second. [0-59]
int tm_min; ///< Minute. [0-59]
int tm_hour; ///< Hour. [0-23]
int tm_mday; ///< Day. [1-31]
int tm_mon; ///< Month. [0-11]
int tm_year; ///< Year-1900. [70- ] !NOTE:Set 100 mean 2000
int tm_wday; ///< Day of week. [0-6 ] !NOTE:Set 0 mean Sunday
int tm_yday; ///< Days in year.[0-365] !NOTE:Set 0 mean January 1st
} csi_rtc_time_t;
/****** definition for RTC ******/
typedef struct csi_rtc csi_rtc_t;
struct csi_rtc {
csi_dev_t dev;
void (*callback)(csi_rtc_t *rtc, void *arg);
void *arg;
void *priv;
};
这里需要注意的是,在设置和获取时间时,对于年份,在设置时需要手工减去1900,在获取时需要手工加上1900,也即2022年需填为122。对于月份,由于从0开始的,设置时真实月份需要-1,获取时需要+1
同时需要注意的是,在获取时间前,需要先设置一次时间,以后RTC时钟就可以自动递增了。
二、多任务实现
在编程实现时,采用多任务方式,通过创建gui_lvgl_task和rtc_clock_task两个任务。它们之间可交换全局数量csi_rtc_time_t current_time。
代码框架是在gui_demo上修改的。主要任务及主函数代码如下。
//显示任务
static void gui_lvgl_task(void *arg)
{
/* Periodically call the lv_task handler.
* It could be done in a timer interrupt or an OS task too.*/
while(1)
{
lv_task_handler();
aos_msleep(5);
lv_label_set_text_fmt(lvobj, "Time: %d-%d-%d %d:%d:%d", current_time.tm_year + 1900, current_time.tm_mon,
current_time.tm_mday, current_time.tm_hour, current_time.tm_min, current_time.tm_sec);
lv_tick_inc(1);
}
}
//rtc走时任务
static void rtc_clock_task(void * arg)
{
while(1)
{
if(CSI_OK != csi_rtc_get_time(&rtc, ¤t_time))
{
printf("===%s, %d", __FUNCTION__, __LINE__);
return ;
}
aos_msleep(5);
}
}
/**
* main,创建2个任务
*/
int main(void)
{
board_yoc_init();
lv_init(); /*Initialize for LittlevGL*/
oled_init();
gui_label_create();
rtc_init();
//创造任务
aos_task_new("gui", gui_lvgl_task, NULL, 10 * 1024);
aos_task_new("rtc_clock", rtc_clock_task, NULL, 10 * 1024 );
return 0;
}
最后可看到rtc时间在不停的变化。如下视频
14a021ecd17b3ee591472080b920a861.mp4
(2.67 MB, 下载次数: 19)
有些不足之处:
- 由于没有电池,时间不能保存,每次都得从头开始计时
- 设置初始时间时使用的是固定值,不能也真实的时间同步。
|