【XR806开发板试用】xr806 RTC实验

一、例程编译、烧录确认
首先按照全志在线文档平台的点灯教程确保能正常编译、烧录和点灯:https://xr806.docs.aw-ol.com/…
确保例程没问题后,我们再改造例程,实现我们想要的功能
二、代码编写
我们将hello工程复制一份改文件夹名为rtc_demo,目录结构如下

rtc_demo
├── BUILD.gn
└── src
└── main.c
然后BUILD.gn内容增加头文件引用,部分配置如下:

import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_rtc") {configs = []sources = ["src/main.c",]cflags = board_cflagsinclude_dirs = board_include_dirsinclude_dirs += ["//kernel/liteos_m/kernel/arch/include",]
}
~~~~
上一层的BUILD.gn内容为:

group(“ohosdemo”) {

deps = [#"hello_demo:app_hello",#"led_demo:app_led",#"iot_peripheral:app_peripheral",#"wlan_demo:app_WlanTest",#"http_demo:app_myhttp",#"tcp_demo:app_tcp",#"web_server_demo:app_web",#"uart_demo:app_uart",#"pwm_led_demo:app_pwm_led","rtc_demo:app_rtc",
]

}

接下来是main.c,内容如下:

#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "driver/chip/hal_rtc.h"
#include <math.h>#define OFFSET_YEAR                                      2000
#define GET_AD_YEAR(counterYear)                         (counterYear + OFFSET_YEAR)
#define GET_COUNTER_YEAR(adYear)                         (adYear - OFFSET_YEAR)
#define RTC_SET_LEAP_YEAR(isLeapYear)                    HAL_RTC_SetLeapYear(isLeapYear)
#define RTC_SET_DDHHMMSS(wday, hour, minute, second)     HAL_RTC_SetDDHHMMSS(wday, hour, minute, second)
#define RTC_SET_YYMMDD(isLeapYear, year, month, mday)    HAL_RTC_SetYYMMDD(isLeapYear, year, month, mday)
#define RTC_STOP_WDAY_ALARM(void)                        HAL_RTC_StopWDayAlarm(void)
#define RTC_STOP_SEC_ALARM(void)                         HAL_RTC_StopSecAlarm(void)void rtc_get_yymmdd(uint8_t *isLeapYear, uint8_t *year, uint8_t *month, uint8_t *mday)
{HAL_RTC_GetYYMMDD(isLeapYear, year, month, mday);
}void rtc_get_ddhhmmss(RTC_WeekDay *wday, uint8_t *hour, uint8_t *minute, uint8_t *second)
{HAL_RTC_GetDDHHMMSS(wday, hour, minute, second);
}void analysis_wday(RTC_WeekDay wday, char *buf)
{if (wday == 0)sprintf(buf, "%s", "monday");else if (wday == 1)sprintf(buf, "%s", "tuesday");else if (wday == 2)sprintf(buf, "%s", "wednesday");else if (wday == 3)sprintf(buf, "%s", "thursday");else if (wday == 4)sprintf(buf, "%s", "friday");else if (wday == 5)sprintf(buf, "%s", "saturday");else if (wday == 6)sprintf(buf, "%s", "sunday");
}/*** @brief Determine whether it is a leap year* @param[in] adYear : AD. year* @return if it is a leap year return 1 else 0*/
uint8_t is_leap_year(uint16_t adYear)
{if ((adYear % 4 == 0 && adYear % 100 != 0)|| (adYear % 400 == 0 && adYear % 3200 != 0)|| (adYear % 172800 == 0))return 1;elsereturn 0;
}/*** @brief  transform real AD year to counter year and Set the RTC date,* including leaf year flag, year, month and month day* @param[in] adYear : real AD year* @return :  return value < 0 on erro** @note adYear = counter year + OFFSET_YEAR, counter year  set to [0, 255]*/
int rtc_set_yymmdd(uint16_t adYear, uint8_t month, uint8_t mday)
{if (GET_COUNTER_YEAR(adYear) < 0) {printf("\n\nERRO: adYear should be greater than OFFSET_YEAR!\n\n");return -1;} else if (GET_COUNTER_YEAR(adYear) > 255) {printf("\n\nERRO: adYear should be less than (OFFSET_YEAR+255)!\n\n");return -2;}RTC_SET_YYMMDD(is_leap_year(adYear), GET_COUNTER_YEAR(adYear), month, mday);return 0;
}void rtc_set_time(void)
{/*set time : year mouth day hour minute second*/printf("set time : 2021-21-27, tuesday, 15:57:50\n");rtc_set_yymmdd(2021, 12, 27);RTC_SET_DDHHMMSS(RTC_WDAY_TUESDAY, 15, 57, 50);
}void rtc_read_time(void)
{uint8_t leap, counterYear, mouth, mday;uint16_t adYear;RTC_WeekDay wday;uint8_t hour, minute, second;char buf[10];printf("read time:\n");rtc_get_yymmdd(&leap, &counterYear, &mouth, &mday);rtc_get_ddhhmmss(&wday, &hour, &minute, &second);analysis_wday(wday, buf);adYear = GET_AD_YEAR(counterYear);if (is_leap_year(adYear))printf("Is Leap Year\n");printf("%d-%d-%d, ", adYear, mouth, mday);printf("%s,%d:%d:%d\n", buf, hour, minute, second);
}void rtc_reset_leap_year(void)
{uint8_t isLeapYear, counterYear, mouth, day;uint16_t adYear;rtc_get_yymmdd(&isLeapYear, &counterYear, &mouth, &day);adYear = GET_AD_YEAR(counterYear);isLeapYear = is_leap_year(adYear);RTC_SET_LEAP_YEAR(isLeapYear);
}void wday_alarm_callback(void *arg)
{rtc_read_time();RTC_STOP_WDAY_ALARM();printf("wday alarm is arrive!!!\n\n");
}void wday_alarm(void)
{RTC_WDayAlarmStartParam wday_param;printf("\nset wday alarm next day 0:0:20 \n");wday_param.alarmHour = 0;wday_param.alarmMinute = 0;wday_param.alarmSecond = 20;wday_param.alarmWDayMask = RTC_WDAY_ALARM_EN_BIT(RTC_WDAY_SUNDAY);wday_param.arg = NULL;wday_param.callback = wday_alarm_callback;HAL_RTC_StartWDayAlarm(&wday_param);
}void sec_alarm_callback(void *arg)
{rtc_read_time();printf("second alarm is arrive!!!\n\n");
}void sec_alarm(void)
{uint32_t alarmSecond;RTC_SecAlarmStartParam secParam;alarmSecond = 20;printf("set sec alarm %us after\n", alarmSecond);secParam.alarmSeconds = alarmSecond;secParam.arg = NULL;secParam.callback = sec_alarm_callback;HAL_RTC_StartSecAlarm(&secParam);
}/*** @brief Read the time value (in microsecond) of the RTC's Free running counter** Free running counter is a 48-bit counter which is driven by LFCLK and starts* to count as soon as the system reset is released and the LFCLK is ready.** @note can't printf more than 32 bit digital*/
void read_free_run_time(void)
{uint64_t freeRunTime = 0;freeRunTime = HAL_RTC_GetFreeRunTime();if (freeRunTime < pow(2, 32))printf("ReadFreeRunTime: %u uS\n", (uint32_t)freeRunTime);
}
void show_run_time(void)
{static int count = 40;uint8_t isShow = 1;printf("rtc show run time %d times start.\n", count);while (isShow) {if (count > 0) {read_free_run_time();count--;} elseisShow = 0;OS_Sleep(1);}printf("rtc show run time over.\n");
}int rtc_init(void)
{rtc_set_time();rtc_read_time();wday_alarm();sec_alarm();show_run_time();return 0;
}void rtc_deinit(void)
{RTC_STOP_SEC_ALARM();RTC_STOP_WDAY_ALARM();
}/* Run this example, please connect the uart0 */
int rtc_test(void)
{printf("rtc example started\n\n");/*waiting for  rtc stability*/OS_MSleep(200);rtc_init();while (1) {OS_Sleep(1);rtc_read_time();rtc_reset_leap_year();}
}SYS_RUN(rtc_test);

要想实现设置一次,一直运行rtc的话板子没有后备电池,所以,我也没有将设置时间的标志位写进flash,所以每次启动都会设置时间,这个只是一个rtc的demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专升本 C语言笔记-06 常用的3种输入输出函数

1.scanf() 与 printf() 的使用 scanf() 格式化输入数据 格式:scanf("格式控制字符串",参数地址列表) scanf("%d,%d,%d",&a,&b,&c); printf("a %d\n",a); printf("b %d\n",b); printf("c %d\n",c); 注意 注…

【数据结构】堆

目录 一、树的介绍以及堆 1.树 2.二叉树以及堆 二、堆的实现 1.heap.h 2.heap.c 1)堆的初始化和销毁 2&#xff09; 堆的插入 3&#xff09;堆的删除 4&#xff09;取堆顶数据 5&#xff09;堆的数据个数 6&#xff09;堆的判空 3.test.c 一、树的介绍以及堆 …

跨境电商选品实战——Ownips公开数据信息安全采集+Python爬虫轻松搞定Lazada电商选品

文章目录 一、引言二、Lazada电商平台选品实战2.1、分析Lazada电商平台的商品列表接口2.2、定位商品列表计算逻辑2.3、封装高质量住宅IP2.4、运行爬虫 三、数据处理及选品分析四、Ownips——企业级全球静态住宅IP&#xff0c;高效采集公开数据 一、引言 互联网与外贸的结合&am…

Maya自定义工具架

有时候我们需要自己定义工具架上的内容&#xff0c;比如将一个工具放到工具架上&#xff0c;或者删除一个工具 添加一个工具 例如我们想在多边形建模栏位上添加一个分离按钮&#xff0c;默认 1 先切换到想要添加的工具架栏位 2 打开菜单&#xff0c;找到我们想添加的工具 …

前端实现websocket通信讲解(vue2框架)

websocket&#xff1a; WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 websocket提供的api&a…

70城市房价同比继续下降

据北京商报的最新报道&#xff0c;昨&#xff08;3月15日&#xff09;天国家统计局发布《2月70个大中城市商品住宅销售价格》显示&#xff0c;2024年2月&#xff0c;在70个大中城市中&#xff0c;各线城市商品住宅销售价格同比继续下降。 一线城市二手住宅销售价格同比下降6.3…

拿捏指针(二)

个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 目录 前言 数组与指针 数组名的理解 指针数组与数组指针 指针数组 数组指针 数组传参 一维数组传参的本质 二维数组传参的本质 二维数组…

Github Gitlab SSH 密钥配置

1. 操作流程 生成密钥&#xff08;非对称加密&#xff09; ssh-keygen -t rsa -C "your_emailexample.com"注意&#xff0c;这里的 -C 表示注释&#xff0c;没有什么用&#xff0c;主要是标记密钥避免自己遗忘。 查看密钥&#xff08;公钥&#xff09; //进入所属…

Go 日期时间包装器:15条更便捷的时间处理

在Go编程中&#xff0c;处理日期和时间是一项常见任务&#xff0c;涉及到精确性和灵活性。尽管Go的标准库提供了时间包&#xff08;time&#xff09;用于处理时间相关操作&#xff0c;但在某些情况下&#xff0c;我们需要额外的实用函数来简化这些任务。本文将介绍一系列实用函…

RIPGeo参文31—36(关于对比学习):鼓励对同一数据点进行各种增强(视图),以学习更健壮的表示

RIPGeo中有: —干扰参数。在内部最大化中,我们提出了步骤,以增加损失的方向更新。我们的方法不是用简单的一步方案最大化内部部分,而是在每次迭代结束时将扰动投影到球面空间上(第2-7行),这允许模型产生更微妙但有价值的扰动[31]。 [31] A. Kurakin, I. J. Goodfellow…

代码随想录算法随想录day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 二叉搜索树的最近公共祖先思路解题方法复杂度Code 二叉搜索树中的插入操作思路解题方法复杂度Code 删除二叉搜索树中的节点思路解题方法复杂度Code 总结 二叉搜索树的最近公共祖先 链接: 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局&#xff08;NSA&#xff09;研究部门开发的软件逆向工程&#xff08;SRE&#xff09;套件&#xff0c;用于支持网络安全任务。包括一套功能齐全的高端软件分析工具&#xff0c;使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

如何成为一名CCAA审核员?报名复习考试注册实习指南

一、管理体系审核员的注册领域 管理体系审核员包括质量管理体系&#xff08;QMS&#xff09;、环境管理体系&#xff08;EMS&#xff09;、职业健康安全管理体系&#xff08;OHSMS&#xff09;、食品安全管理体系&#xff08;FSMS&#xff09;、危害分析与关键控制点&#xff0…

一文带你了解神经网络是如何学习预测的

文章目录 1、GPT与神经网络的关系 2、什么是神经网络 3、神经网络是如何计算的 数据是如何输入到神经网络中的 神经网络是如何进行预测的 神经网络是如何进行学习的 4、小结 1、GPT与神经网络的关系 GPT想必大家已经耳熟能详&#xff0c;当我们与它进行对话时&#xff0c;通常…

Spring 被打暴了! vs Javalin vs Solon

测试仅供参考。不同的环境、场景&#xff0c;效果会不同。 测试记录&#xff1a; 项目SpringBoot2SpringBoot3JavalinSolon运行时java 17java 17java 17java 17测试前状态/内存101.1Mb112.9Mb66.1Mb45.6Mb测试后状态/内存996.3Mb326.9Mb457.3Mb369.2Mb测试后状态/并发2万2.6万…

桌面待办,电脑桌面怎么设置待办事项

在忙碌的工作生活中&#xff0c;我们经常会有许多事情需要处理&#xff0c;为了提高工作效率和管理时间&#xff0c;很多人都有一套自己的桌面待办事项管理方法。那么&#xff0c;如何利用电脑桌面待办事项来提高工作效率&#xff0c;电脑桌面怎么设置待办事项呢&#xff1f; …

【Unity】persistentDataPath、streamingAssetsPath和dataPath

介绍 我们在用Unity进行开发时&#xff0c;资源路径是我们最常用到的&#xff0c;下面我就来简单介绍一下几种常用的路径。 1.dataPath dataPath是包含游戏数据文件夹的路径&#xff0c;是app程序包安装路径 Windows: xxx /Assets &#xff08;如下图&#xff09; Mac: xxx…

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…