物联网实战--驱动篇之(七)RTC时钟(DS1302)

目录

一、RTC简介

二、DS1302介绍

三、初始化

四、字节读写

五、功能函数


一、RTC简介

        实时时钟,简称RTC,这个在STM32的外设里也有,不过STM32F1系列的RTC实际上只有一个计数器功能,如果需要年月日要自己写软件计算 ,比较麻烦,这时候就可以使用带有年月日的RTC芯片了,常用的有DS1302,可以自己计算闰年,具体资料可以看这里。DS1302Z_(JSMSEMI(杰盛微))DS1302Z中文资料_价格_PDF手册-立创电子商城

二、DS1302介绍

        主要是看下DS1302的通讯方式和寄存器,它的通讯方式有点类似于IIC,也是时钟线+数据线,不过还多了个复位(片选)线,时序也是不一样的,没有IIC那么多信号。寄存器看下图:

        其中年份是00~99,也就是2000~2099年了,数据格式是BCD码。

        下面先从头文件开始:

        主要定义了时间结构体、引脚结构体和IO相关函数,寄存器的地址根据手册定义。

三、初始化

        首先初始化时钟、数据和复位3个引脚,其中数据脚有时候需要作为输入,具体代码如下:


/*		 
================================================================================
描述 : 硬件初始化
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_init(GPIO_TypeDef* port_clk, uint32_t pin_clk,GPIO_TypeDef* port_io, uint32_t pin_io,GPIO_TypeDef* port_rst, uint32_t pin_rst,Ds1302RtcStruct *rtc_initpara)
{g_sDs1302Drv.port_clk=port_clk;g_sDs1302Drv.pin_clk=pin_clk;g_sDs1302Drv.port_io=port_io;g_sDs1302Drv.pin_io=pin_io;g_sDs1302Drv.port_rst=port_rst;g_sDs1302Drv.pin_rst=pin_rst; GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = pin_clk;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(port_clk, &GPIO_InitStruct);	GPIO_InitStruct.GPIO_Pin = pin_io;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(port_io, &GPIO_InitStruct);	GPIO_InitStruct.GPIO_Pin = pin_rst;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(port_rst, &GPIO_InitStruct);	DS1302_RST_0; 	DS1302_CLK_0;delay_us(5);drv_ds1302_set_wp(false);drv_ds1302_write(0x90, 0xA7);//充电寄存器drv_ds1302_set_wp(true);drv_ds1302_set_hour_format(true);//24h制if(drv_ds1302_read(0x81)&0x80)//查询DS1302时钟是否启动,如果时钟停止走动:启动时钟+初始化时钟{		printf("DS1302 stop!\n");drv_ds1302_set_time(rtc_initpara);drv_ds1302_start();}}/*		 
================================================================================
描述 : 数据脚读写转换
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_set_io_mode(bool is_out)
{if(is_out){GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = g_sDs1302Drv.pin_io;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(g_sDs1302Drv.port_io, &GPIO_InitStruct);			}else{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = g_sDs1302Drv.pin_io;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(g_sDs1302Drv.port_io, &GPIO_InitStruct);}
}

        如果时钟没断电过就不用再次启动了。

四、字节读写

        下面是最基本的字节读写函数,时序具体参考手册。


/*		 
================================================================================
描述 : 写字节
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_write(u8 reg_addr, u8 reg_data)
{DS1302_RST_0;DS1302_CLK_0;delay_us(2);DS1302_RST_1;delay_us(5);for(u8 i=0; i<8; i++){if(reg_addr&0x01)DS1302_IO_1;else DS1302_IO_0;DS1302_CLK_1;delay_us(5);DS1302_CLK_0;reg_addr=reg_addr>>1;}for(u8 i=0; i<8; i++){if(reg_data&0x01)DS1302_IO_1;else DS1302_IO_0;DS1302_CLK_1;delay_us(5);DS1302_CLK_0;reg_data=reg_data>>1;}	DS1302_RST_0;delay_us(5);
}/*		 
================================================================================
描述 : 读字节
输入 : 
输出 :  
================================================================================
*/
u8 drv_ds1302_read(u8 reg_addr)
{DS1302_RST_1;delay_us(5);for(u8 i=0; i<8; i++){if(reg_addr&0x01)DS1302_IO_1;else DS1302_IO_0;DS1302_CLK_1;delay_us(5);DS1302_CLK_0;reg_addr=reg_addr>>1;}drv_ds1302_set_io_mode(0);u8 value=0;for(u8 i=0; i<8; i++){value=value>>1;if(DS1302_IO_READ()>0)value|=0x80; DS1302_CLK_1;delay_us(5);DS1302_CLK_0;}	drv_ds1302_set_io_mode(1);DS1302_RST_0;	delay_us(5);return value;	
}

        每次读写复位脚都要拉高才能进行,数据是低位先传输。

五、功能函数

        有了基本的读写函数后,就可以根据寄存器地址进行功能设置了。比如下面的启动和停止:

/*		 
================================================================================
描述 : 停止
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_stop(void)
{drv_ds1302_set_wp(false);u8 ret=drv_ds1302_read(0x81);ret=ret|0x80;drv_ds1302_write(0x80,ret);drv_ds1302_set_wp(true);
}/*		 
================================================================================
描述 : 启动
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_start(void)
{drv_ds1302_set_wp(false);u8 ret=drv_ds1302_read(0x81);ret=ret&0x7F;drv_ds1302_write(0x80,ret);drv_ds1302_set_wp(true);
}

时间格式设置:

/*		 
================================================================================
描述 : 设置时间格式
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_set_hour_format(bool is_24h)
{drv_ds1302_set_wp(false);if(is_24h){u8 ret=drv_ds1302_read(0x85);ret=ret&0x7F;drv_ds1302_write(0x84,ret);		printf("ds1302 set 24h\n");}else{u8 ret=drv_ds1302_read(0x85);ret=ret|0x80;drv_ds1302_write(0x84,ret);		printf("ds1302 set 12h\n");}drv_ds1302_set_wp(true);
}

时间设置:

/*		 
================================================================================
描述 : 时间设置
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_set_time(Ds1302RtcStruct *rtc_initpara)
{if(rtc_initpara==NULL)return;printf("drv_ds1302_set_time=20%02x-%02x-%02x  %02x:%02x:%02x\n", rtc_initpara->rtc_year, rtc_initpara->rtc_month, rtc_initpara->rtc_date,rtc_initpara->rtc_hour, rtc_initpara->rtc_minute, rtc_initpara->rtc_second	);drv_ds1302_set_wp(false);drv_ds1302_write(DS1302_SEC_ADDR,rtc_initpara->rtc_second);drv_ds1302_write(DS1302_MIN_ADDR,rtc_initpara->rtc_minute);drv_ds1302_write(DS1302_HOUR_ADDR,rtc_initpara->rtc_hour);drv_ds1302_write(DS1302_DATE_ADDR,rtc_initpara->rtc_date);drv_ds1302_write(DS1302_MONTH_ADDR,rtc_initpara->rtc_month);drv_ds1302_write(DS1302_YEAR_ADDR,rtc_initpara->rtc_year);drv_ds1302_set_wp(true);
}

时间读取:


/*		 
================================================================================
描述 : 时间读取
输入 : 
输出 :  
================================================================================
*/
void drv_ds1302_get_time(Ds1302RtcStruct *rtc_initpara)
{if(rtc_initpara==NULL)return;rtc_initpara->rtc_second=drv_ds1302_read(0x81);rtc_initpara->rtc_minute=drv_ds1302_read(0x83);rtc_initpara->rtc_hour=drv_ds1302_read(0x85);rtc_initpara->rtc_date=drv_ds1302_read(0x87);rtc_initpara->rtc_month=drv_ds1302_read(0x89);rtc_initpara->rtc_year=drv_ds1302_read(0x8D);
//	printf("drv_ds1302_get_time=20%02x-%02x-%02x  %02x:%02x:%02x\n", rtc_initpara->rtc_year, rtc_initpara->rtc_month, rtc_initpara->rtc_date,
//																																rtc_initpara->rtc_hour, rtc_initpara->rtc_minute, rtc_initpara->rtc_second	);	
}

设置类的都要先解锁写保护才能进行相应操作。

整体来讲,DS1302用起来不复杂,时序有搞清楚,寄存器弄对来就没问题了。

代码链接:https://download.csdn.net/download/ypp240124016/89117651

本项目的交流QQ群:701889554

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

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

相关文章

CDR2024破解序列号Crack免费下载最新CorelDraw2024安装包

CorelDRAW是一款功能强大的矢量图形制作和排版软件&#xff0c;主要面向绘图设计师和印刷输出人员。它提供了一整套的绘图工具&#xff0c;包括圆形、矩形、多边形、方格、螺旋线等&#xff0c;并配合塑形工具&#xff0c;可以对各种基本图形作出更多的变化&#xff0c;如圆角矩…

基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 Lipschitz李式指数定义与性质 4.2 Lipschitz李式指数的估计 4.3 Lipschitz李式指数在信号特征识别与故障检测中的应用 5.完整程序 1.程序功能描述 基于Lipschitz李式指数的随机信号特…

HD哈默纳科行星减速机:工业传动领域的卓越之选

HD哈默纳科行星减速机泛应用于各种工业领域的传动装置&#xff0c;以其卓越的性能和稳定的表现赢得了用户的广泛认可。HD哈默纳科行星减速机减速机具有结构紧凑、高减速比、高精度、负载能力强、耐久性好等诸多特点&#xff0c;使其在各类机械设备中发挥着至关重要的作用。 HD…

报表控件 Stimulsoft 常见问题:从代码启用缓存

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

机器学习——概述总结

总图&#xff1a; 分部1&#xff1a; 分部2&#xff1a; 分部3&#xff1a;

代码随想录day37 | 贪心算法P6 | ● 738 ● 968 ● 总结

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…

012:vue结合纯CSS实现蛇形流程图/步骤条

文章目录 1. 实现效果2. 实现代码 1. 实现效果 2. 实现代码 <template><div class"container"><div v-for"(item, index) in list" class"grid-item"><div class"step">step{{index1}}</div></div&…

MySQL - 深入MySQL索引的秘密(一)

1. 如果没有任何索引,数据库是如何根据查询语句搜索数据的? 在磁盘文件中,数据页之间是组成双向链表的,然后数据页内部的数据行是组成单向链表的,而且数据行是根据主键从小到大排序的。然后每个数据页里都会有一个页目录,里面根据数据行的主键存放了一个目录,同时数据行…

新版HI3559AV100开发注意事项(三)

新版HI3559AV100开发注意事项&#xff08;三&#xff09; 十九、用的sdk是Hi3559V200_MobileCam_SDK_V1.0.1.5 播放AAC音频文件&#xff0c;adec->ao;adec的初始化里面包括了aaclc解码器的注册&#xff0c;可是在HI_MPI_ADEC_RegisterDecoder(&s32Handle, &stAac);…

【漏洞复现】OpenMetadata 命令执行漏洞复现(CVE-2024-28255)

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

类和对象中阶1⃣️-默认成员函数(构造函数 析构函数)

目录 1.类的6个默认成员函数 2.构造函数 2.1 概念 3.析构函数 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成…

JavaThread线程

目录 程序--进程--线程 程序&#xff1a; 进程&#xff1a; 线程&#xff1a; 进程和线程的关系 创建线程 单线程模式 代码 图解 运行 代码 运行 创建线程 方式一 代码 运行 方式二 代码 运行 总结&#xff1a; Thread类中常用的方法 1、 代码 运行…

电脑剪切复制到u盘文件丢失怎么办?未备份者的应急指南

在日常生活和工作中&#xff0c;我们经常使用电脑和U盘进行文件的传输和备份。然而&#xff0c;在剪切复制文件到U盘的过程中&#xff0c;有时可能会遇到文件丢失或无法找到的问题&#xff0c;而这时又没有备份&#xff0c;这无疑让人头疼不已。那么&#xff0c;面对这种情况&a…

java的aop实现方式

java的aop可以通过三种方式来实现 1.使用ajc编译的插件来完成增强 这种方法会直接修改编译完成的class文件&#xff0c;不需要依赖springboot 2.动态代理proxy 2.1cglib 可以代理接口&#xff0c;方法等&#xff0c;这种方式代理类是目标类的子类&#xff0c;要求目标类不…

使用 EFCore 和 PostgreSQL 实现向量存储及检索

随着 ChatGPT 的兴起及其背后的 AIGC 产业不断升温,向量数据库已成为备受业界瞩目的领域。FAISS、Milvus、Pinecone、Chroma、Qdrant 等产品层出不穷。市场调研公司 MarketsandMarkets 的数据显示,全球向量数据库市场规模预计将从 2020 年的 3.2 亿美元增长至 2025 年的 10.5…

Ps 滤镜:风格化

风格化 Stylize滤镜通过置换像素和通过查找并增加图像的对比度&#xff0c;基于原图像生成绘画或印象派的效果。 查找边缘 Find Edges “查找边缘”滤镜通过分析图像的色彩和亮度变化来识别边缘。 这种处理方式使得图像的主要轮廓以一种艺术化的线条形式被强调出来&#xff0c;…

大语言模型的指令调优:综述

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;Instruction Tuning for Large Language Models: A Survey 论文地址&#xff1a;https://arxiv.org/abs/2308.10792 指令调优是提升大语言模型&#xff08;LLMs&#xff09;性能…

python爬虫3-xpath批量定位元素的方法

以爬取豆瓣影评的电影名称为例。 第一步 鼠标右键单击&#xff0c;选择【检查】 第二步 切换到【元素】标签&#xff0c;展示源代码 选择下图的小箭头&#xff0c;再选择想要定位的文本&#xff0c;源代码会自动定位到该文本。 第三步 鼠标放在该文本的源代码上&#xff0c;…

Pytorch官方FlashAttention速度测试

在Pytorch的2.2版本更新文档中&#xff0c;官方重点强调了通过实现FlashAtteneion-v2实现了对scaled_dot_product_attention约2X左右的加速。 今天抽空亲自试了下&#xff0c;看看加速效果是否如官方所说。测试前需要将Pytorch的版本更新到2.2及以上&#xff0c;下面是测试代码…

Prometheus-Grafana基础篇安装绘图

首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图&#xff1a; 3.解压&#xff1a; tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明&#xff1a; vim prometheus.yml 5.启动Promethe…