RT-Thread:STM32实时时钟 RTC开启及应用

说明:STM32F103/407系列基于 RT-Thread 系统的 RTC 开启及应用 应用流程介绍。

1. RTC功能开启

1.1 开启系统RTC驱动

1.2 打开系统RTC相关的宏

1.3 打开库函数 RTC 相关的宏

完成以上系统配置,编译无误情况下RTC 就已经开启了。

2. RTC 应用

官方 API 查询地址:https://www.rt-thread.org/document/api/rtc_sample_8c-example.html#a3

2.1 相关函数

1.设置日期:设置系统日期但不修改时间

rt_err_t 	set_date (rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)

2.设置时间:设置系统时间但不修改日期

rt_err_t 	set_time (rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)

3.获取时间:

        这里 time_t 是 long 型变量,这个变量接受 time()函数返回的 RTC 系统时间,系统返回的是 秒,从1900年开始总计运行了多少秒。

 time_t now;now = time(RT_NULL);

4.时间格式转换为字符型: ctime(&now)

        这个函数把总共的 秒 转换为 字符型格式的数据,如:Sat Jan 1 03:24:03 2000 ,表示 2000 年 1 月 1 日,星期:6 , 3:24:3

rt_kprintf("%s\n", ctime(&now));

5.时间格式转换为整形:struct tm* localtime(const time_t* t)

        这个是个系统函数,作用是把 秒 转换成 系统定义的时间结构体中对应的整形数据

localtime(&now_time);

6.自定义函数:void user_now_time(struct user_time *u_time)

        把系统时间转换为自定义的时间结构体,方便使用。

struct user_time
{uint16_t year;      /* 年 */uint8_t months;     /* 月 */uint8_t mday;       /* 日 */uint8_t days;       /* 星期 */uint8_t hour;       /* 时 */uint8_t min;        /* 分 */uint8_t sec;        /* 秒 */
}u_now_time;/* 功能:获取系统RTC时间* 入参:struct user_time *u_time 存储时间的结构体指针* */
void user_now_time(struct user_time *u_time)
{struct tm *rt_time;time_t now_time;now_time = time(RT_NULL); rt_time = localtime(&now_time);u_time->year = rt_time->tm_year + 1900;u_time->months = rt_time->tm_mon +1;u_time->mday = rt_time->tm_mday;u_time->days = rt_time->tm_wday;u_time->hour = rt_time->tm_hour;u_time->min  = rt_time->tm_min;u_time->sec  = rt_time->tm_sec;
}

2.2 官方应用例程

/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-30     misonyo      first implementation.*/
/** 程序清单:这是一个 RTC 设备使用例程* 例程导出了 rtc_sample 命令到控制终端* 命令调用格式:rtc_sample* 程序功能:设置RTC设备的日期和时间,延时一段时间后获取当前时间并打印显示。
*/
#include <rtthread.h>
#include <rtdevice.h>
static int rtc_sample(int argc, char *argv[])
{rt_err_t ret = RT_EOK;time_t now;/* 设置日期 */ret = set_date(2018, 12, 3);if (ret != RT_EOK){rt_kprintf("set RTC date failed\n");return ret;}/* 设置时间 */ret = set_time(11, 15, 50);if (ret != RT_EOK){rt_kprintf("set RTC time failed\n");return ret;}/* 延时3秒 */rt_thread_mdelay(3000);/* 获取时间 */now = time(RT_NULL);rt_kprintf("%s\n", ctime(&now));return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(rtc_sample, rtc sample);

3. RTC应用例程

rtc_app.c

/** Copyright (c) 2006-2020, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes** RTC 时钟应用* 版本:VER 1.0* 功能:* 1. 获取当前系统 RTC 时间,并更新 到  变量 struct user_time u_now_time;* 2. 设置时间和日期,将要设置的 日期和时间 更新到 struct user_time u_set_time; 变量后,再释放对于的 日期和时间设置的信号量。* 2.1 日期设置和时间设置是分开的,需要分别释放 日期信号量  rt_sem_release(&rx_sem_set_rtc_data);和时间信号量    rt_sem_release(&rx_sem_set_rtc_time);* 2.2 如果只更新时间 释放对于的时间信号量即可,日期不会改变。* 2.3 如果只更新日期 释放对于的日期信号量即可,时间不会改变。*/#include "user_cfg.h"/*定义用于接收消息的信号量*/
struct rt_semaphore rx_sem_set_rtc_data;                   /* 设置日期信号量 */
struct rt_semaphore rx_sem_set_rtc_time;                   /* 设置日期信号量 */static void num2str(char *c, int i)
{c[0] = i / 10 + '0';c[1] = i % 10 + '0';
}/* 功能:时间格式转换为字符型格式  如:20210608-164530 格式输出* 入参:无* */
void use_time_num2str(void)
{num2str(&u_now_time.str_now_time[0] + 0, u_now_time.year / 100);num2str(&u_now_time.str_now_time[0] + 2, u_now_time.year % 100);num2str(&u_now_time.str_now_time[0] + 4,u_now_time.months);num2str(&u_now_time.str_now_time[0] + 6,u_now_time.mday);u_now_time.str_now_time[8] = '-';num2str(&u_now_time.str_now_time[0] + 9,u_now_time.hour);num2str(&u_now_time.str_now_time[0] + 11,u_now_time.min);num2str(&u_now_time.str_now_time[0] + 13,u_now_time.sec);u_now_time.str_now_time[15] = 0;
}/* 功能:获取系统RTC时间* 入参:struct user_time *u_time 存储时间的结构体指针* */
void user_now_time(struct user_time *u_time)
{struct tm *rt_time;time_t now_time;now_time = time(RT_NULL);rt_time = localtime(&now_time);u_time->year = rt_time->tm_year + 1900;u_time->months = rt_time->tm_mon +1;u_time->mday = rt_time->tm_mday;u_time->days = rt_time->tm_wday;u_time->hour = rt_time->tm_hour;u_time->min  = rt_time->tm_min;u_time->sec  = rt_time->tm_sec;if (u_time->days == 0){u_time->days = 7;}use_time_num2str();
}/* 线程 now_time_thread 的入口函数 */
/* 负责定时更新时钟变量,数据源来做系统提供的RTC时钟 */
static void now_time_entry(void *param)
{rt_err_t ret = RT_EOK;time_t now_time;/*初始化信号量,批量初始化所有定义的信号量 */rt_sem_init(&rx_sem_set_rtc_data, "rx_sem_set_rtc_data", 0, RT_IPC_FLAG_FIFO);            /*初始化信号量 */rt_sem_init(&rx_sem_set_rtc_time, "rx_sem_set_rtc_time", 0, RT_IPC_FLAG_FIFO);            /*初始化信号量 */while (1){if (rt_sem_trytake(&rx_sem_set_rtc_data) == RT_EOK){/* 设置日期 */ret = set_date(u_set_time.year, u_set_time.months, u_set_time.mday);if (ret != RT_EOK){rt_kprintf("set RTC date failed\n");}}if (rt_sem_trytake(&rx_sem_set_rtc_time) == RT_EOK){/* 设置时间 */ret = set_time(u_set_time.hour, u_set_time.min, u_set_time.sec);if (ret != RT_EOK){rt_kprintf("set RTC time failed\n");}}user_now_time(&u_now_time);/* 获取系统时间 *//* 测试用:用系统RTC函数打印字符型格式时间 */now_time = time(RT_NULL);rt_kprintf("%s\n", ctime(&now_time));/* 测试用:打印自定义格式*/rt_kprintf("%d 年 %d 月 %d 日,星期:%d , %d:%d:%d \r\n",u_now_time.year,u_now_time.months,u_now_time.mday,u_now_time.days,u_now_time.hour,u_now_time.min,u_now_time.sec);rt_kprintf("%s \r\n",u_now_time.str_now_time);rt_thread_mdelay(1000);}
}/*线程创建函数*/
int now_time_thread(void)
{rt_thread_t tid1;                                 /*创建线程控制块指针来接收线程创建函数的返回值,目的是通过返回值判断线程是否创建ok*//* 创建线程 1,名称是 now_time_thread,入口是 now_time_entry*/tid1 = rt_thread_create("now_time_thread",        /*线程名称,系统打印线程时会显示这个线程的名字*/now_time_entry,           /*线程入口函数,入口函数函数名*/RT_NULL,                  /*入口参数*/1000,                     /*设置内存堆栈大小*/10,                       /*设置优先级*/100);                     /*时间片参数,时间片是在有多个相同优先级线程时,这个线程每次被执行多少个时间片*//* 如果获得线程控制块,启动这个线程 */if (tid1 != RT_NULL){rt_thread_startup(tid1);//rt_kprintf("now_time_thread 线程创建成功...\r\n");}else{// rt_kprintf("now_time_thread 线程创建失败...\r\n");}return RT_EOK;
}
INIT_APP_EXPORT(now_time_thread);/* 信号量的定义和使用流程 *////*step1: 定义用于接收消息的信号量*/
//static struct rt_semaphore rx_sem;  或者 static rt_sem_t rx_sem;
//
///*step2: 初始化信号量 */
//rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
//
///*step3:获取信号量函数,阻塞等待接收信号量,等到信号量后再次读取数据,RT_WAITING_FOREVER参数,永远阻塞,直到获得资源 */
//rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
//
///*step4:释放信号量可以唤醒挂起在该信号量上的线程。释放信号量使用下面的函数。可以在中断或线程内使用*/
//rt_sem_release(&rx_sem);
//示例:rt_sem_release(&rx_sem_adc_dma);//释放信号量

rtc_app.h

#ifndef APPLICATIONS_RTC_APP_H_
#define APPLICATIONS_RTC_APP_H_struct user_time
{uint16_t year;          /* 年 */uint8_t months;         /* 月 */uint8_t mday;           /* 日 */uint8_t days;           /* 星期 */uint8_t hour;           /* 时 */uint8_t min;            /* 分 */uint8_t sec;            /* 秒 */char str_now_time[16];  /* 字符格式时间,年月日-时分秒 如:20210608-164530 格式输出*/
};struct user_time u_now_time; /* 当前时间 */
struct user_time u_set_time; /* 要设置的时间 */extern void user_now_time(struct user_time *u_time) ;extern struct rt_semaphore rx_sem_set_rtc_data;                   /* 设置日期信号量 */
extern struct rt_semaphore rx_sem_set_rtc_time;                   /* 设置日期信号量 */#endif /* APPLICATIONS_RTC_APP_H_ */

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

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

相关文章

Java项目:117SpringBoot动漫论坛网站

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 117SpringBoot动漫论坛网站 一、项目介绍 动漫论坛网站是由SpringBootMybatis开发的&#xff0c;旅游网站分为前台和后台&#xff0c;前台为用户浏览&#xff0c;后台进…

关于java的稀疏数组

关于java的稀疏数组 我们在前面的文章中了解了冒泡排序和优化冒泡排序&#xff0c;在本篇文章中我们来介绍一下稀疏数组&#xff0c;我们学会了可以自己动手试一试&#x1f600; 稀疏数组 在介绍稀疏数组之前&#xff0c;我们先来了解一下五子棋。 我们这里有一个11 x 11的棋…

虚拟机Linux硬盘扩容

扩容前(20G)&#xff1a; 扩容后(60G)&#xff1a; 步骤&#xff1a; 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 2. 运行虚拟机&#xff0c;查看根目录属于那个文件系统&#xff0c;我的是 /dev/sda1…

Android 车联网——CarDiagnosticService介绍(十八)

一、简介 CarDiagnosticService 是安卓汽车平台中的一个服务,用于监测和分析车辆的诊断数据。这个服务旨在帮助汽车制造商和开发人员实时收集和分析车辆传感器、系统状态等数据,从而检查系统故障、进行远程诊断、优化车辆性能。 主要功能 实时数据收集和分析:该服务可以收集…

【Linux】执行脚本的两种方法,sh xx.sh和直接./xx.sh的区别

这里写自定义目录标题 背景&#xff1a;1. 使用 sh /home/test.sh2. 使用 /home/test.sh总结 背景&#xff1a; 我有个test.sh在/home/目录里 1. 使用 sh /home/test.sh 这种方式是显式地使用 sh 命令&#xff08;Shell&#xff09;来运行脚本。 这意味着脚本将在 sh 环境中…

华为OD机试真题-最长子字符串的长度(二)-2023年OD统一考试(C卷)

题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写的字母组成的字符串。 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母…

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围&#xff08;最小0&#xff0c;最大150&#xff09; //指定输入框&#xff0c;拥有5行 //默认…

自然语言处理-用于预训练词嵌入的数据集

word2vec模型的技术细节和大致的训练方法&#xff0c;让我们来看看它们的实现。具体地说&#xff0c;用于预训练词嵌入模型的数据集开始&#xff1a;数据的原始格式将被转换为可以在训练期间迭代的小批量。 import math import os import random import torch from d2l import…

Sqlite3相关返回值

SQLite 是一个开源的嵌入式关系数据库&#xff0c;广泛应用于各种软件项目中。在执行数据库操作时&#xff0c;SQLite 会返回一个结果代码&#xff0c;以表示操作的成功或失败。这些结果代码是整数&#xff0c;每个代码都对应一个特定的含义。 以下是 SQLite 返回的结果代码及…

力扣labuladong——一刷day90

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Trie树实现 前言 Trie 树又叫字典树、前缀树、单词查找树&#xff0c;是一种二叉树衍生出来的高级数据结构&#xff0c;主要应用场景是处理字符串前缀相关的…

strlen/Memcpy_s/strncasecmp

strlen 声明&#xff1a;size_t strlen(const char *str) 举例&#xff1a; #include <stdio.h> #include <string.h>int main () {char str[50];int len;strcpy(str, "This is runoob.com");len strlen(str);printf("|%s| 的长度是 |%d|\n"…

软件测试|使用Pytest、Allure Step和Allure Attach创建详细测试报告

引言 在软件开发过程中&#xff0c;测试是不可或缺的一部分。为了更好地展示测试结果并定位问题&#xff0c;结合Pytest测试框架和Allure测试报告工具可以创建清晰、详细的测试报告。本文将介绍如何使用Pytest、Allure的allure.step()和allure.attach()功能来创建具有丰富信息…

笔记-管理的实践》商业/企业的目的和功能

笔记 From《管理的实践》彼得德鲁克 企业的目的 企业的目的&#xff0c;只有一个正确而有效的定义&#xff1a;“创造顾客”。 市场不是由上帝、大自然或经济力量创造的&#xff0c;而是由企业家创造的。 企业的功能 由于企业的目的是创造顾客&#xff0c;任何企业都有两个基…

springboot 物业管理系统

springboot mysql mybatisthymeleaf 基础信息管理 房屋信息 用户信息 业主信息 租房信息 公告管理 日常管理 财务管理

快速排序-排序算法

算法思想 快速排序采用的仍然是分治的思想。 Step1.每次在无序的序列中选取一个基准数。 Step2.然后将大于和小于基准数的元素分别放置于基准数两边。&#xff08;前面部分的元素均小于或等于基准数&#xff0c;后面部分均大于或等于基准数&#xff09; Step3.然后采用分治法&…

代码随想录——字符串 刷题记录

344.反转字符串 交换&#xff0c;没有难点 541.反转字符串II 注意题干是“每2k”次&#xff0c;所以要有循环 在对剩余的处理中&#xff0c;要先检查每次的剩余数量&#xff0c;包括第一次&#xff0c;所以应该先计算剩余多少决定怎么交换&#xff0c;如果剩余多余2k再进行前…

Docker(网络,网络通信,资源控制,数据管理,CPU优化,端口映射,容器互联)

docker网络 网络实现原理 Docker 网络是指由 Docker 为应用程序创建的虚拟环境的一部分&#xff0c;它允许应用程序从宿主机操作系统的网络环境中独立出来&#xff0c;形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。Docker 的网络功能…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式&#xff0c;一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证&#xff1b;②“整容客”可以不经由韩国使领馆、直接在网上申请签证&#xff1b;③中泰免签的实施日期…

C++ 深度优先搜索DFS || 模版题:排列数字

给定一个整数 n &#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n 。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据范围 1…

前端页面优化做的工作

1.分析模块占用空间 new (require(webpack-bundle-analyzer).BundleAnalyzerPlugin)() 2.使用谷歌浏览器中的layers&#xff0c;看下有没有影响性能的模块&#xff0c;或者应该销毁没销毁的 3.由于我们页面中含有很大的序列帧动画&#xff0c;所以会导致页面性能低&#xff0…