STM32与DS1302设计时钟芯片,超详细

2024-08-31 08:58

本文主要是介绍STM32与DS1302设计时钟芯片,超详细,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW

DS1302 是由DS1202 改进而来增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1 为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。将主要的性能指标作一综合:
★ 实时时钟具有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力
★ 31 8 位暂存数据存储RAM
★ 串行 I/O 口方式使得管脚数量最少
★ 宽范围工作电压2.0 5.5V
★ 工作电流 2.0V 时,小于300nA
★ 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
★ 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配
★ 简单 3 线接口
★ 与 TTL 兼容Vcc=5V
★ 可选工业级温度范围-40 +85
★ 双电源管用于主电源和备份电源供应
以上是DS1302的一些全面的预览,以下为DS1302管脚图:

 


VCC2:主用电源引脚
X1、X2:DS1302外部晶振引脚
GND:地
RST:复位引脚
I/O:串行数据引脚,数据输出或者输入都从这个引脚
SCLK:串行时钟引脚
VCC1:备用电源
我们来看看DS1302的典型外围电路,下面是CEPARK AVR的DS1302模块原理图:

 


我们看到:
1、 VCC为主电源接5V,C1为滤波电容
2、 X1、X2外接32.768K的晶振
3、 5、6、7脚分别与控制器相联,注意外部4.7K上拉电阻
4、 备用电源脚,注意是3.3V,DS1302要求备用电源电压稍微低于主用电源
下面讲讲DS1302的具体操作。
操作DS1302的大致过程,就是将各种数据写入DS1302的寄存器,以设置它当前的时间已经格式。然后使DS1302开始运作,DS1302时钟会按照设置情况运转,再用单片机将其寄存器内的数据读出。再用液晶显示,就是我们常说的简易电子钟。
所以总的来说DS1302的操作分2步(显示部分属于液晶显示的内容,不属于DS1302本身的内容)但是在讲述操作时序之前,我们要先看看寄存器:

 


上图是DS1302的寄存器样式,我们看到:
1、 第7位永远都是1
2、 第6位,1表示RAM,寻址内部存储器地址;0表示CK,寻址内部寄存器;
第5到第1位,为RAM或者寄存器的地址;最低位,高电平表示RD:即下一步操作将要“读”;低电平表示W:即下一步操作将要“写”。(与AT24C02寄存器类似,这点要理解好)。下面是DS1302的内部寄存器和RAM:

 


上图左边为寄存器和RAM的地址,右边为具体内容。各个寄存器的最高位都是1,最低位都是“RD/W”,比如要读秒寄存器则命令为1000 0101,反之写为1000 0100,要注意其含义。(图片不是很清楚,看不清楚的朋友用软件放大)我们一个一个看:
SEC:秒寄存器,注意具体右边内容:低四位为SEC,高的次三位为10SEC。最高位CH为DS1302的运行标志,当CH=0时,DS1302内部时钟运行,反之CH=1时停止;
MIN:分寄存器;
HR:时寄存器,最高位为12/24小时的格式选择位,该位为1时表示12小时格式。当设置为12小时显示格式时,第5位的高电平表示下午(PM);而当设置为24小时格式时,第5位位具体的时间数据。
DATE:日寄存器;
MONTH:月寄存器;
DAY:周寄存器,注意一周只有7天,所以该寄存器只有低三位有效;
YEAR:年寄存器;
CONTROL:写保护寄存器,当该寄存器最高位WP为1时,DS1302只读不写,所以要在往DS1302写数据之前确保WP为0;
TRICKLE CHARGE REGISTER:涓细电流充电设置寄存器,我们知道,当DS1302掉电时,可以马上调用外部电源保护时间数据。该寄存器就是配置备用电源的充电选项的。其中高四位(4个TCS)只有在1010的情况下才能使用充电选项;低四位的情况,与DS1302内部电路有关,有点意思,下文详细讲述。
CLOCK BURST:批量读写操作设置寄存器,设置该寄存器后,可以对DS1302的各个寄存器进行连续写入。DS1302的另外一种读写方式。笔者还没用过,感兴趣的朋友可以尝试。
最后还有一点,前文说过,DS1302有31个字节的存储空间,但是大家要看到的是,这31个存储空间,最后一个是RAM BURST的寄存器,设置该寄存器可以达到对RAM连续读写的作用。所以DS1302的可用存储空间实际上为30个字节。
现在我们来看看DS1302的涓细电流充电的设置:
以下来自英文原版PDF:
The trickle charge select (TCS) bits (bits4 -7) control the selection of the trickle charger. In order to prevent accidental enabling, only a pattern of 1010 will enable the trickle charger. All other patterns will disable the trickle charger. The DS1302 powers up with the trickle charger disabled. The diode select (DS) bits (bits 2 – 3)select whether onediode or two diodes are connected between VCC2 and VCC1.If DS is 01, one diode is selected or if DS is10, two diodes are selected. If DS is 00 or 11, the trickle charger is disabled independently of TCS. TheRS bits (bits 0 -1) select the resistor that is connected between VCC2 and VCC1. The resistor selected by the resistor select (RS) bits is as follows:

 


好,英文水平不好也没关系:
看到这句“The trickle charge select (TCS) bits (bits4 -7) control the selection of the trickle charger. In order to prevent accidental enabling, only a pattern of 1010 will enable the trickle charger”,这句话是说“TCS为用以控制涓细电流充电功能,为了防止意外产生,只当TCS位(四位)为1010时涓细电流充电功能才会生效”所以刚才提到“其中高四位(4个TCS)只有在1010的情况下才能使用充电选项”。
那DS呢?“If DS is 01, one diode is selected or if DS is10, two diodes are selected. If DS is 00 or 11, the trickle charger is disabled independently of TCS”,既是说,如果两个DS位为01,则只有1个二极管接入电路,如果DS为10则表示有2个二极管接入,如果DS为00或者11,则充电功能由TCS单独控制”。看到上部电路三个二极管处,DS为01时接入1个二极管,对应上面的开关闭合,为10时表示2个二极管接入,对应下面的开关闭合为00或者11时笔者认为两个开关都不闭合,充电电流不经过二极管。


对应的,RS的设置也相仿:“The RS bits (bits 0 -1) select the resistor that is connected between VCC2 and VCC1. The resistor selected by the resistor select (RS) bits is as follows: 
意思是:RS位用以选择在VCC1和VCC2直接接入什么样的电阻:
当RS为00时,不接入电阻;
当RS为01时,接入典型值为2K电阻,对应电路图中的R1;
当RS为10时,接入典型值为4K电阻,对应电路图中的R2;
当RS为11时,接入典型值为8K电阻,对应电路图中的R3;
好了,至此我们知道了,DS和RS的作用是配置接入电路中的二极管和电阻,有什么用呢?
笔者认为这些二极管和电阻是分压和限流用的,以调整涓细充电电流的大小。
我们可以看看DS1302的读写时序了:

 


上图就是DS1302的三个时序:复位时序,单字节写时序,单字节读时序;
RST:复位时序,即在RST引脚产生一个正脉冲,在整个读写器件,RST要保持高电平,一次字节读写完毕之后,要注意把RST返回低电平准备下次读写周期;
SINGLE BYTE READ:单字节读,注意读之前还是要先对寄存器写命令,从最低位开始写;大家细心看可以看到,写数据是在SCLK的上升沿实现,而读数据在SCLK的下降沿实现,所以,在单字节读时序中,写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了!这个就是DS1302操作中最特别的地方。当然读出来的数据也是最低位开始。
SINGLE BUTE WRITE:单字节写,两个字节的数据配合16个上升沿将数据写入即可。

解析内容:

 DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。 

1.DS1302的寄存器和控制命令 

对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等,如表3-79、表3-80所列。时钟突发寄存器可一次性顺序读/写除充电寄存器以外的寄存器。

表3-79 日历时钟相关寄

寄存器名

命令字节

范围

位内容

D7

D6

D5

D4

D3

D2

D1

D0

80H

81H

00~59

CH

秒的十位

秒的个位

82H

83H

00~59

0

分的十位

分的个位

84H

85H

01~12或00~23

12/24

0

1/P

HR

小时个位

86H

87H

01~31

0

0

日的十位

日的个位

88H

89H

01~12

0

0

0

0/1

月的个位

星期

8AH

8BH

01~07

0

0

0

0

0

星期几

8CH

8DH

00~99

年的十位

年的个位

    注意:

    ①秒寄存器的CH位:

    置1,时钟停振,进入低功耗态;

   置0,时钟工作。

 

   ②小时寄存器的D7位:

   置1,12小时制(D5置1表示上午,置0表示下午);

   置0,24小时制(此时D5、D4组成小时的十位)。

表3-80其它寄存器及RAM

寄存器名

命令字节

范围

位内容

D7

D6

D5

D4

D3

D2

D1

D0

写保护

8EH

8FH

00H~80H

WP

 

涓流充电

90H

91H

-

TCS

DS

RS

时钟突发

8EH

BFH

-

-

RAM突发

BEH

FFH

-

-

RAMO

C0H

C1H

00H~FFH

RAM数据

00H~FFH

RAM30

FCH

FDH

00H~FFH

    注意:

    ①WP:写保护位。置为1时,写保护;置为0时,未写保护。

    ②TCS:1010时慢充电。DS为01,选1个二极管;为10,选2个二极管;11或00,禁止充电。

    ③RS:与二极管串联电阻选择。00,不充电;01,2KΩ电阻;10,4KΩ电阻;11,8KΩ电阻。

2.DS1302内部主要寄存器分布表 

    DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM,此方式下可一次性读/写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 

    我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行方式与DS1302通信的,每次通信都必须由单片机发起。无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表3-77所列,最高位BIT7固定为1。BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。

表3-81 命令帧格式

D7

D6

D5

D4

D3

D2

D1

D0

1

R/C

A4

A3

A2

A1

A0

R/W

    D7位: 固定为1 ;

    R/C位: 为0时选择操作时钟,为1时选择操作RAM;

    A4A3A2A1A0: 操作地址; 

    R/W位: 为0时进行写操作,为1时进行读操作。 

    物理上,DS1302的通信接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。请注意数据是对时钟信号敏感的,而且一般数据是在下降沿写入,上升沿读出。本次使用51单片机的I/O模拟协议实现通信。平时SCLK保持低电平。当需要写命令或者写数据时,在时钟输出变为高电平之前先输出数据;当需要读数据时,在时钟输出变为高电平之前采样读取数据。

图3-123 读写操作时序

程序工程,已测试,放心使用

源码传送门:https://download.csdn.net/download/u013184273/10936204


程序注意事项:
★要记得在操作DS1302之前关闭写保护;
★注意用延时来降低单片机的速度以配合器件时序
★DS1302读出来的数据是BCD码形式,要转换成我们习惯的10进制,转换方法在源程序里;
★读取字节之前,将IO设置为输入口,读取完之后,要将其改回输出口;
★在写程序的时候,建议实现开辟数组(内存空间)来集中放置DS1302的一系列数据,方便以后扩展键盘输入;
希望能给有需要的朋友一点帮助

 

很多初次用DS1302搞时钟的朋友都碰都过装好后时钟不走的问题,结合自己的实践,初步分析如下:
不走时,既可能是软件的问题也可能是硬件的问题。
一、硬件方面可能存在的问题
1、电路焊接错误,有虚焊,接错线。
2、DS1302是坏的,假的,这种可能性不是太大,我试过多种国产的芯片,完全不能用的是少数,但有些只是不稳定,误差大而已。
3、这一条是最重要的,就是32.768K的晶振用的不对,DS1302要使用专用的晶振,即内部的电容是6P的。世面上有多种32.768K的晶振,但内部电容有12P、20P等,这些晶振用在DS1302上是不能起振的,我就为这个问题折腾过很长时间,代码检查无数遍,电路检查无数遍,DS1302换过多个,就是不走,最后仔细看DS1302的规格书,才发现要6P的晶振,化几毛钱换了个6P的(淘宝上有的是),立马走起来了。如果不走时,也可以试用手指按住电路板上晶振的两个焊点,有时就会走起来,那可以肯定是晶振问题了。
二、软件问题
1、有不少朋友的代码是从书上或网上下的,经过改编来用的,这里面要特别注意一个问题,就是各个函数里的延时函数,如有一个延时函数delay_ms(5); 要求延时5MS,但是原来的程序的使用条件是单片机用4M晶振,你移植后用在8M单片机环境中,那延时时间肯定不够了,这时DS1302就可能不走。这种情况也经常出现在LCD显示屏中,轻则出乱码,重则不显示,还有在红外遥控中也有这样的情况,插在代码中的延时时间不对,也会不能接收到遥控信号,所以提醒大家,在进行代码移植时,一定要注意晶振的大小,如和自己的晶振不同时,要尝试修改延时函数的延时时间。
2、首次使用DS1302 时,要先按下面的步骤检查:先设置好分、秒,然后看显示的时间和自己设置的时间是否一致,如果一致,说明时序等没有问题,再看是否走时,不走时,用手按住晶振的焊点看有没有变化,或用万用表的交流毫伏档量晶振两脚,应有2V以上的读数,否则换6P的晶振。
3、一定要开启时钟,DS1302的秒寄存器,在程序初始化时一定要有l类似write_ds 1302(0x80,0x00)的语句,其中0x80是秒寄存器的地址,0x00 是写入的数据,这个数据的最高位一定要是0,是0 才能开启时钟走时。

 

这篇关于STM32与DS1302设计时钟芯片,超详细的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123453

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,