DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持的计时。集成晶振提高了器件的长期度,并减少了生产线的元件数量。DS3231提供商用级和工业级温度范围,采用16引脚300mil的SO封装。RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。精密的、经过温度补偿的电压基准和比较器电路用来监视VCC状态,检测电源故障,提供复位输出,并在必要时自动切换到备份电源。另外,/RST监视引脚可以作为产生μP复位的手动输入。
废话多说无用,还是数据手册实在。手册给出芯片典型电路,方便该芯片的原理图绘制。这里截取一下。

接下来给出了供电电压和引脚电压。弄错这个,那可真是悲伤。可见是支持常用的3.3V和5V的控制器件。

最重要的来了,寄存器地址。

好了有了寄存器还等什么开敲吧

/*
//
//文 件 名:DS3231.h
//创建日期: 2020/01/03
//文件说明:
//  作 者 :骑着猪逛街i
//联系方式:QQ937286798
//当前版本: v1.0
//历史修改:
//----------------------------------------------//------------------------------------2020/01/16
*/
#ifndef __DS3231_H
#define __DS3231_H#if defined(USE_DEV)#include "dev_config.h"#include "dev_include.h"#include  "dev_softiic.h"#else //添加你的头文件;#endiftypedef struct{u8 Second;u8 Minute;u8 Hour;u8 Day;u8 Date;u8 Month;u8 Year;
}DS3231_Data_Typedef;//定义数据结构体typedef struct
{#if defined(USE_DEV)DEVSoftIIC_Typedef DEVSoftIIC_DS3231;
#endifDS3231_Data_Typedef DS3231_RegData;//保存寄存器数据DS3231_Data_Typedef DS3231_HexData;//保存十六进制数据DS3231_Data_Typedef DS3231_BcdData;//保存BCD数据u8 HOUR_12OR24_Flag;//12小时或者24小时 //暂未实现void (*Init)(void);//DS3231初始化void (*ReadHexData)(void);//读取Hex数据void (*SetRegData)(DS3231_Data_Typedef *HexData);//设置寄存器数据
}DS3231_Typedef;/*
BCD数据是4个bit表示一个数,例如十进制28(二进制为:0001 1100 十六进制:0x1C)
而用BCD码二进制表示为0010 1000(十进制:40 十六进制:28)
*/
#define DC3231_BCD_TO_HEX(bcd)  ((((u8)bcd) & 0xF0) >> 4) * 10 +  (((u8)bcd) & 0x0F)
#define DC3231_HEX_TO_BCD(hex)  (((u8)hex) % 10) + ((((u8)hex) /10) << 4)#define DS3231_ADDRESS                      0xD0//DS3213的地址
/*DS3213 寄存器*/
#define DS3231_SECONDS_REG              0x00
#define DS3231_MINUTES_REG              0x01
#define DS3231_HOUR_REG                 0x02
#define DS3231_DAY_REG                      0x03
#define DS3231_DATE_REG                     0x04
#define DS3231_MONTH_CENTURY_REG    0x05
#define DS3231_YEAR_REG                     0x06#define DS3231_ALARM1SENONDS_REG    0x07
#define DS3231_ALARM1MINUTES_REG    0x08
#define DS3231_ALARM1HOURS_REG      0x09
#define DS3231_ALARM1DAY_REG            0x0A
#define DS3231_ALARM1DATE_REG           0x0A#define DS3231_ALARM2MINUTES_REG  0x0B
#define DS3231_ALARM2HOURS_REG      0x0C
#define DS3231_ALARM2DAY_REG            0x0D
#define DS3231_ALARM2DATE_REG           0x0D#define DS3231_CONTROL_REG              0x0E
#define DS3231_CONTROL_STATE_REG    0x0F
#define DS3231_AGINGOFFSET_REG      0x10
#define DS3231_MSB_OF_TEMP_REG      0x11
#define DS3231_LSB_OF_TEMP_REG    0x12//定义IIC的硬件引脚
#define DS3231_SCL_PROT DEV_GPIOA//使用标准库那就是GPIOA
#define DS3231_SCL_PIN  1//使用标准库就是GPIO_Pin_1
#define DS3231_SDA_PROT DEV_GPIOA
#define DS3231_SDA_PIN  0extern DS3231_Typedef DS3231;//DS3231句柄
/*
使用方式简单举例
#include "ds3231.h"
int main(void)
{DS3231.Init();//初始化后会自动读取一次数据DS3231.DS3231_HexData.Year = 0;DS3231.DS3231_HexData.Month = 1;DS3231.DS3231_HexData.Date = 17;DS3231.DS3231_HexData.Day = 5;DS3231.DS3231_HexData.Hour = 5;DS3231.DS3231_HexData.Minute = 20;DS3231.DS3231_HexData.Second = 10;DS3231.SetRegData(&DS3231.DS3213_HexData);while(1){DS3231.ReadHexData()//获取DS3231数据Printf("Hour:%d ", DS3231.DS3231_HexData.Hour);Printf("min:%d ", DS3231.DS3231_HexData.Minute);Printf("sec:%d \r\n", DS3231.DS3231_HexData.Second);Printf("Year:%d ", DS3231.DS3231_HexData.Year );Printf("Month:%d ", DS3231.DS3231_HexData.Month );Printf("Date:%d ", DS3231.DS3231_HexData.Date);Printf("Day:%d \r\n", DS3231.DS3231_HexData.Day );}
}
*/
#endif

下面是.c

/*
//
//文 件 名:DS3231.c
//创建日期: 2020/01/03
//文件说明:
//  作 者 :骑着猪逛街i
//联系方式:QQ937286798
//当前版本: v1.0
//历史修改:
//----------------------------------------------//------------------------------------2020/01/03
*/
#include "ds3231.h"void DS3231_Init_Handler(void);
void DS3231_ReadRegData(void);
void DS3231_ReadBcdData(void);
void DS3231_ReadHexData(void);
void DS3213_SetRegData(DS3231_Data_Typedef *HexData);
DS3231_Typedef DS3231 = //DS3213句柄
{.HOUR_12OR24_Flag = 0,//默认24小时制 12小时暂未实现.Init = DS3231_Init_Handler,//指向初始化函数.ReadHexData = DS3231_ReadHexData,.SetRegData  = DS3213_SetRegData,
};/*
初始化DS3231 IIC
不使用DEV库,需要自行实现IIC引脚的初始化等内容
*/
__weak void DS3231_Init_Handler(void)
{#if defined(USE_DEV)DS3231.DEVSoftIIC_DS3231.SCL.GPIOx = DEV_GPIOA;DS3231.DEVSoftIIC_DS3231.SCL.Pin     = 0;DS3231.DEVSoftIIC_DS3231.SDA.GPIOx = DEV_GPIOA;DS3231.DEVSoftIIC_DS3231.SCL.Pin   = 1;DEV_SoftIIC_Init(&DS3231.DEVSoftIIC_DS3231);//初始化IIC
#else //自行实现IIC初始化;
#endifDS3231_ReadHexData();//读取一次Hex数据
}
/*
通过IIC连续读取1个Byte数据
不使用DEV库,需要自行实现
*/__weak u8 DS3231_iicDevReadByte_Handler(u8 devaddr,u8 addr)
{#if defined(USE_DEV)return  iicDevReadByte(&DS3231.DEVSoftIIC_DS3231,devaddr,addr);
#else  //自行实现IIC读取一个数据;
#endif
}/*
通过IIC连续写入len个数据
不使用DEV库,需要自行实现
*/__weak void DS3231_iicDevWrite_Handler(u8 devaddr,u8 addr,u8 len,u8 *wbuf)
{#if defined(USE_DEV)iicDevWrite(&DS3231.DEVSoftIIC_DS3231,devaddr,addr,len,wbuf);
#else  //自行实现IIC连续写入len个数据;
#endif
}/*获取DS3213的寄存器数据*/
void DS3231_ReadRegData(void)
{DS3231.DS3231_RegData.Second = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_SECONDS_REG);//获取秒数据DS3231.DS3231_RegData.Minute = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_MINUTES_REG);//获取秒数据DS3231.DS3231_RegData.Hour   = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_HOUR_REG);//获取时数据DS3231.DS3231_RegData.Day    = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_DAY_REG);//获取星期DS3231.DS3231_RegData.Date   = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_DATE_REG);//获取日期DS3231.DS3231_RegData.Month  = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_MONTH_CENTURY_REG);//获取月份DS3231.DS3231_RegData.Year   = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_YEAR_REG);//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪
}/*获取DS3213的BCD数据*/
void DS3231_ReadBcdData(void)
{DS3231_ReadRegData();//获取寄存器数据DS3231.DS3231_BcdData.Second = DS3231.DS3231_RegData.Second & 0x7F;//获取秒数据DS3231.DS3231_BcdData.Minute = DS3231.DS3231_RegData.Minute & 0x7F;//获取秒数据if(DS3231.HOUR_12OR24_Flag == 0)//24小时制{DS3231.DS3231_BcdData.Hour = DS3231.DS3231_RegData.Hour & 0x3F;//获取时数据}else//12小时制{;}DS3231.DS3231_BcdData.Day   = DS3231.DS3231_RegData.Day & 0x07;//获取星期DS3231.DS3231_BcdData.Date  = DS3231.DS3231_RegData.Date;//获取日期DS3231.DS3231_BcdData.Month = DS3231.DS3231_RegData.Month & 0x1F;//获取月份DS3231.DS3231_BcdData.Year  = DS3231.DS3231_RegData.Year;//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪
}/*
获取DS3213的HEX数据
*/void DS3231_ReadHexData(void)
{DS3231_ReadBcdData();//获取BDC数据DS3231.DS3231_HexData.Second = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Second);//获取秒数据DS3231.DS3231_HexData.Minute = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Minute);//获取秒数据if(DS3231.HOUR_12OR24_Flag == 0)//24小时制{DS3231.DS3231_HexData.Hour = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Hour);//获取时数据}else//12小时制{;}DS3231.DS3231_HexData.Day   = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Day);//获取星期DS3231.DS3231_HexData.Date  = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Date);//获取日期DS3231.DS3231_HexData.Month = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Month);//获取月份DS3231.DS3231_HexData.Year  = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Year);//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪
}/*
校年月日等数据
*/
void DS3213_SetRegData(DS3231_Data_Typedef *HexData)
{DS3231.DS3231_RegData.Second = DC3231_HEX_TO_BCD(HexData->Second);//转换秒数据DS3231.DS3231_RegData.Minute = DC3231_HEX_TO_BCD(HexData->Minute);//转换分数据DS3231.DS3231_RegData.Hour   = ((DS3231.DS3231_RegData.Hour & 0xC0) | (DC3231_HEX_TO_BCD(HexData->Hour)));//转换小时数据DS3231.DS3231_RegData.Day    = DC3231_HEX_TO_BCD(HexData->Day);//转换星期DS3231.DS3231_RegData.Date   = DC3231_HEX_TO_BCD(HexData->Date);//转换日期DS3231.DS3231_RegData.Month  = DC3231_HEX_TO_BCD(HexData->Month) | (DS3231.DS3231_RegData.Month & 0x80);//转换月份DS3231.DS3231_RegData.Year   = DC3231_HEX_TO_BCD(HexData->Year);//转换年数据DS3231_iicDevWrite_Handler(DS3231_ADDRESS,DS3231_SECONDS_REG,7,(u8 *)&DS3231.DS3231_RegData.Second);//写入DS3213
}

DS3231基本使用,和驱动程序相关推荐

  1. [嵌入式开发模块]DS3231时钟芯片 驱动程序

    刚刚写完DS3231时钟芯片的驱动程序.这里开源出来供大家使用.需要的自取. 先简单介绍下这个芯片,然后直接给驱动代码以及示例代码. DS3231简介 简介 DS3231是一款低成本.高精度I2C实时 ...

  2. 8266+DS3231时钟之显示TM1638的使用【四】下

    这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟之arduino官网发布的DS3231库的分析[二]> ...

  3. 8266+DS3231时钟之显示TM1638的使用【四】上

    今天继续8266+DS3231时钟项目的显示部分功能的详解. 这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟 ...

  4. GD32驱动DS3231显示时钟踩坑记录

    近日调试GD32驱动ds3231的程序,程序从STM 32移植过来的,所以就没想太多.当时STM32有HAL库开发,运行在内部晶振经PLL后的64MHZ频率.具体驱动程序网上一大堆,我这里就不在赘述了 ...

  5. 8266+ds3231时钟之arduino官网发布的DS3231库的分析【二】

    这个时钟系列目前五篇分别是: <8266+DS3231时钟之开发个时钟遇到的N个坑[一]> <8266+ds3231时钟之arduino官网发布的DS3231库的分析[二]> ...

  6. DS3231高精度时钟,LCD1602显示,QXmini151版本

    本设计的主要任务是计时和显示. 设计任务的具体要求如下: 计时:第一种是通过单片机内部的定时器/计数器来实现为软时钟.第二种是通过专用的硬件时钟芯片来实现为硬时钟. 显示:第一种是数码管显示,分为静态 ...

  7. OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?

    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...

  8. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  9. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

最新文章

  1. 用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)
  2. 老生常谈:注释怎么写?
  3. 特征工程(part3)--扁平化、过滤和分块
  4. 判断存储过程是否存在某个参数名
  5. workbench出现“Unable to start the geometry editor”
  6. 数据库创建时间,更新时间设计
  7. 《A Tour of PostgreSQL Internals》学习笔记——进程间通信
  8. 弱引用什么时候被回收_Java中的强软弱虚引用
  9. 2020-10-27
  10. 天天快充滚动图片android750x379
  11. 分布式事务之两阶段提交
  12. 32、T5L 迪文屏 C51开发之数据存储模型
  13. catia怎么进入装配_catia装配详细教程
  14. 如何理解开仓与平仓规则?
  15. 电脑任务栏应用图标变成白色怎么恢复
  16. 电商系统购物车设计思路
  17. 使用Ultra Librarian生成Cadence Allegro的PCB封装库和OrCAD Capture CIS的原理图库
  18. python-不换行输出+print()完整参数详解
  19. 何新生的英语史(三)—有干劲、入门阶段
  20. Ambari界面介绍

热门文章

  1. Unity指定使用某些屏幕(多屏开发)
  2. MapReduce词频统计编程
  3. 测试从业1到3年经验,常见软件测试工程师面试题总结
  4. 子网掩码的计算方法(实例)
  5. 删除 Ubuntu 20.04 桌面回收站图标
  6. quartz启动 mysql报错_使用Quartz2.2.3做持久化,启动程序后,控制台报错问题
  7. The Dimpled Manifold Model of Adversarial Examples in Machine Learning 文献阅读
  8. 三极管替换及常用开关三极管
  9. Harris角点检测
  10. uname命令 linux,Linux系统下使用uname命令显示系统和硬件信息