1983|1

73

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【平头哥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)

有些不足之处:

  • 由于没有电池,时间不能保存,每次都得从头开始计时
  • 设置初始时间时使用的是固定值,不能也真实的时间同步。

最新回复

可以贴一张实际效果图,或者串口显示的图片  详情 回复 发表于 2022-4-23 09:51
点赞 关注
 
 

回复
举报

553

帖子

3

TA的资源

纯净的硅(初级)

沙发
 

可以贴一张实际效果图,或者串口显示的图片

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表