● 内置高稳定度 32,768KHzDTCXO        (数字温度补偿晶体振荡器)
支持 I2C 总线高速模式                         (400KHz)
定时闹钟功能                                        (可设定:日期,星期,小时,分)
固定周期定时中断功能
时钟更新中断功能                                 (秒,分)
带使能的 32.768KHz 时钟输出             (FOE 和 FOUT 管脚)
闰年自动调整功能                                 (从 2000 到 2099 年)
宽接口电压范围:                                 ( 1.6V-5.5V)
宽时间保持电压范围:                          (1.2V-5.5V)
低电流功耗:                                           𝟎. 𝟖𝛍𝐀/𝟑V(典型值)
本文基于中科银河芯GX8025T技术手册,全面解析这款高精度实时时钟模块的核心特性、寄存器配置及实战应用技巧。

一、概述

GX8025T 是一款内置 32.768KHz DTCXO 的高精度实时时钟芯片,兼容标准 I2C 接口。除了可以提供日历功能 (年,月,日,星期,小时,分,秒)和时钟计数功能外,该芯片还提供诸如闹钟功能,固定周期计时器,超时中断,32.768KHz 时钟输出等附加功能。该芯片采用 CMOS 工艺以降低芯片功耗,提高电池寿命。

二、芯片结构

2.1 结构框图

2.2 管脚描述

2.3 管脚功能

2.4 寄存器表

三、中断配置

3.1 固定周期定时中断

配置寄存器

  • 定时计数器0(0x0B):低8位计数值

  • 定时计数器1(0x0C):高4位计数值

  • 扩展寄存器(0x0D):TSEL[1:0]选择时钟源

TSEL[1:0] 时钟源 最小周期
00 4096Hz 244.14μs
01 64Hz 15.625ms
10 1Hz 1s
11 1/60Hz 1min

中断触发流程

3.2 闹钟中断

关键配置

闹钟中断功能用于产生设置了日期,天,小时,分钟的闹钟设置的闹钟中断事件。
当中断时间发生时,AF 位被置 1 并且/INT 管脚变成低电平表明一次中断时间的发生。

典型场景配置

  • 工作日7:00响铃:WADA=0,星期寄存器=0x3E(00111110b),小时=07,分钟=00

  • 每月15日12:00:WADA=1,日寄存器=15,小时=12,分钟=003. 时钟输出控制

四、I²C通信协议

4.1 设备通信地址

  • 写地址:0x64(01100100b)

  • 读地址:0x65(01100101b)

4.2 典型应用

4.3 I2C总线协议

在以下描述中,假定 CPU 是主器件、GX8025T 是从器件。

a. 指定地址的写时序

GX8025T 包含地址自动加功能,一旦指定开始地址,GX8025T 在每次数据传输之后会自动(按字节)增加 地址。
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“”模式。
(3)检查 GX8025T 发送的确认信号。
(4)CPU 传送“写地址”到 GX8025T。
(5)检查 GX8025T 发送的确认信号。
(6)CPU 发送“数据”到(4)中指定的地址。
(7)检查 GX8025T 发送的确认信号。
(8)按需要重复(6)和(7),地址会自动加。
(9)CPU 发送结束状态[P]

b. 指定地址的读时序

通过写模式设置要读的地址,然后进入读模式开始读数据
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“”模式。
(3)检查 GX8025T 发送的确认信号。
(4)CPU 传送“读地址”到 GX8025T。
(5)检查 GX8025T 发送的确认信号。
(6)CPU 发送重启状态[Sr]。(注意,CPU 不发送结束状态[P])
(7)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“”模式。
(8)检查 GX8025T 发送的确认信号。(从现在开始,CPU 是接收端,GX8025T 是发送端)
(9)GX8025T 发送(4)中指定地址对应的“数据”。
(10)CPU 传送读地址到 GX8025T。
(11)按需要重复(9)和(10),地址会自动加。
(12)CPU 发送 ACK 信号”1”。(用于从器件结束发送)
(13)CPU 发送结束状态[P]。

c. 不指定地址的读时序

一旦开始设定了读模式,就可以立刻读出数据。这种情况下,读操作的地址是上次访问地址+1。
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“”模式。
(3)检查 GX8025T 发送的确认信号。(从现在开始,CPU 是接收端,GX8025T 是发送端)
(4)GX8025T 接着上次访问地址开始发送“数据”。
(5)CPU 传送读地址到 GX8025T。
(6)按需要重复(4)和(5),地址会自动加。
(7)CPU 发送 ACK 信号”1”。(用于从器件结束发送)
(8)CPU 发送结束状态[P]。

4.4 与微控制器的连接方式

电路说明

  1. 主电源与电池通过二极管并联

  2. SDA/SCL/INT外接4.7kΩ上拉电阻

  3. FOE引脚直接使能或MCU控制

单片机驱动程序
 STM32F103 + GX8025T驱动实例
1、main.c
/******************** OLED显示函数 ********************/
#include "stm32f10x.h" // Device header
#include "Serial.h"
#include "Delay.h"
#include "GX8025T.h"
#include "stdio.h"
#include "OLED.h"

void OLED_ShowTime_GX8025T(GX8025T_Time *time)
{
	OLED_ShowString(1, 1, "GX8025T_37k_34");
	OLED_ShowNum(2, 1, 2000 + time->year, 4);
	OLED_ShowString(2, 5, "-");
	OLED_ShowNum(2, 6, time->month, 2);
	OLED_ShowString(2, 8, "-");
	OLED_ShowNum(2, 9, time->date, 2);

	OLED_ShowNum(3, 1, time->hour, 2);
	OLED_ShowString(3, 3, ":");

	OLED_ShowNum(3, 4, time->min, 2);
	OLED_ShowString(3, 6, ":");
	OLED_ShowNum(3, 7, time->sec, 2);

	OLED_ShowString(4, 1, "week:");
	switch (time->week){
	case 0X01: OLED_ShowNum(4, 6, 7, 1); break;
	case 0X02: OLED_ShowNum(4, 6, 1, 1); break;
	case 0X04: OLED_ShowNum(4, 6, 2, 1); break;
	case 0X08: OLED_ShowNum(4, 6, 3, 1); break;
	case 0X10: OLED_ShowNum(4, 6, 4, 1); break;
	case 0X20: OLED_ShowNum(4, 6, 5, 1); break;
	case 0X40: OLED_ShowNum(4, 6, 6, 1); break;		
  default: break;
   }
int main(void)
{

	OLED_Init(); // OLED初始化
	GX8025T_Init();

	while (1)
	{
			 GX8025T_Time get_GX8025T_time;
			 GX8025T_GetTime(&get_GX8025T_time);
			 OLED_ShowTime_GX8025T(&get_GX8025T_time);
               

            /*  GX8025T 设置时间 接收数据设置时间 	*/
			
				GX8025T_Time init_time = {
					.year = RX_Buff[1], .month = RX_Buff[2], .date = RX_Buff[3],
                     .hour = RX_Buff[4], .min = RX_Buff[5], .sec = RX_Buff[6], 
                       .week = RX_Buff[7]};
				GX8025T_Set_time_L(&init_time);

				Serial_SendByte(0xF4);
				Serial_Start(); // UART开启接收



    }

}

2、GX8025T.c

#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"

typedef enum {
    SUNDAY    = 0x01,
    MONDAY    = 0x02,
    TUESDAY   = 0x03,
    WEDNESDAY = 0x04,
    THURSDAY  = 0x05,
    FRIDAY    = 0x06,
    SATURDAY  = 0x07
} Weekday_t;

// BCD转十进制
uint8_t bcd_to_dec(uint8_t val)
{
	return ((val >> 4) * 10) + (val & 0x0F);
}

// 十进制转BCD
uint8_t dec_to_bcd(uint8_t val)
{
	return ((val / 10) << 4) | (val % 10);
}

/**
 * @brief 获取星期的字符串表示
 * @param weekday 星期值
 * @return 星期的字符串表示
 */
const char* GX8025T_GetWeekdayString(Weekday_t weekday) {
    static const char *weekdayStr[] = {
        "Invalid", "Sunday", "Monday", "Tuesday", 
        "Wednesday", "Thursday", "Friday", "Saturday"
    };
    
    if (weekday >= SUNDAY && weekday <= SATURDAY) {
        return weekdayStr[weekday];
    }
    
    return weekdayStr[0];
}
/*引脚配置层*/
/**
 * 函    数:I2C写SCL引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
 */
void GX8025T_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GX8025T_PORT, GX8025T_SCL, (BitAction)BitValue); // 根据BitValue,设置SCL引脚的电平
	Delay_us(4);												 // 延时10us,防止时序频率超过要求
}

/**
 * 函    数:I2C写SDA引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
 */
void GX8025T_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GX8025T_PORT, GX8025T_SDA, (BitAction)BitValue); // 根据BitValue,设置SDA引脚的电平,BitValue要实现非0即1的特性
	Delay_us(5);												 // 延时10us,防止时序频率超过要求
}

/**
 * 函    数:I2C读SDA引脚电平
 * 参    数:无
 * 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
 * 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
 */
uint8_t GX8025T_READ_SDA(void)
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GX8025T_PORT, GX8025T_SDA); // 读取SDA电平
															   //	Delay_us(5);											   // 延时10us,防止时序频率超过要求
	return BitValue;										   // 返回SDA电平
}

/**
 * 函    数:I2C初始化
 * 参    数:无
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
 */
void GX8025T_Init(void)
{
	/*开启时钟*/

	// PB3,PB4,PA15这三个IO变为普通io,必须要进行如下的配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能端口复用时钟
														  //	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 失能JTAG

	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Pin = GX8025T_SCL | GX8025T_SDA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GX8025T_PORT, &GPIO_InitStructure);

	/*设置默认电平*/
	GPIO_SetBits(GX8025T_PORT, GX8025T_SCL | GX8025T_SDA);
}

/*协议层*/

/**
 * 函    数:I2C起始
 * 参    数:无
 * 返 回 值:无
 */
void GX8025T_Start(void)
{
	GX8025T_W_SDA(1); // 释放SDA,确保SDA为高电平
	GX8025T_W_SCL(1); // 释放SCL,确保SCL为高电平
	Delay_us(2);
	GX8025T_W_SDA(0); // 在SCL高电平期间,拉低SDA,产生起始信号
	Delay_us(2);
	GX8025T_W_SCL(0); // 起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}

/**
 * 函    数:I2C终止
 * 参    数:无
 * 返 回 值:无
 */
void GX8025T_Stop(void)
{
	GX8025T_W_SCL(0);
	GX8025T_W_SDA(0); // 拉低SDA,确保SDA为低电平
	Delay_us(2);
	GX8025T_W_SCL(1); // 释放SCL,使SCL呈现高电平
	Delay_us(2);
	GX8025T_W_SDA(1); // 在SCL高电平期间,释放SDA,产生终止信号
}

/**
 * 函    数:I2C接收应答位
 * 参    数:无
 * 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
 */
uint8_t GX8025T_ReceiveAck(void)
{
	uint8_t AckBit;	 // 定义应答位变量
	GX8025T_W_SDA(1); // 接收前,主机先确保释放SDA,避免干扰从机的数据发送
	GX8025T_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
//	 
	AckBit = GX8025T_READ_SDA(); // 将应答位存储到变量里
	if (AckBit)
	{
		printf("N0 ACK!");
		printf("\r\n");
	}
	GX8025T_W_SCL(0); // 拉低SCL,开始下一个时序模块
	return AckBit;	 // 返回定义应答位变量
}
/**
 * 函    数:I2C发送一个字节
 * 参    数:Byte 要发送的一个字节数据,范围:0x00~0xFF
 * 返 回 值:无
 */
void GX8025T_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i++) // 循环8次,主机依次发送数据的每一位
	{
		/*两个!可以对数据进行两次逻辑取反,作用是把非0值统一转换为1,即:!!(0) = 0,!!(非0) = 1*/
		GX8025T_W_SDA(!!(Byte & (0x80 >> i))); // 使用掩码的方式取出Byte的指定一位数据并写入到SDA线
//		 
		GX8025T_W_SCL(1); // 释放SCL,从机在SCL高电平期间读取SDA
//		 
		GX8025T_W_SCL(0); // 拉低SCL,主机开始发送下一位数据
		Delay_us(8);
	}

	GX8025T_ReceiveAck();
}

/**
 * 函    数:I2C接收一个字节
 * 参    数:u8 ack
 * 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
 */
uint8_t GX8025T_ReceiveByte(u8 ack)
{
	uint8_t i, Byte = 0x00; // 定义接收的数据,并赋初值0x00,此处必须赋初值0x00,后面会用到
	GX8025T_W_SDA(1);		// 接收前,主机先确保释放SDA,避免干扰从机的数据发送
	for (i = 0; i < 8; i++) // 循环8次,主机依次接收数据的每一位
	{
		GX8025T_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
//		 
		if (GX8025T_READ_SDA())
		{
			Byte |= (0x80 >> i);
		} // 读取SDA数据,并存储到Byte变量
		  // 当SDA为1时,置变量指定位为1,当SDA为0时,不做处理,指定位为默认的初值0
		GX8025T_W_SCL(0); // 拉低SCL,从机在SCL低电平期间写入SDA
		Delay_us(8);
//		 
	}
	GX8025T_SendAck(ack);
	return Byte; // 返回接收到的一个字节数据
}

/**
 * 函    数:I2C发送应答位
 * 参    数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
 * 返 回 值:无
 */
void GX8025T_SendAck(uint8_t AckBit)
{
	GX8025T_W_SDA(AckBit); // 主机把应答位数据放到SDA线
	GX8025T_W_SCL(1);	  // 释放SCL,从机在SCL高电平期间,读取应答位
//	 
	GX8025T_W_SCL(0); // 拉低SCL,开始下一个时序模块
}

/*******************************************************
功能:GX8025T_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Write_PrimaryAddress(u8 Add)
{
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
}
/*******************************************************
功能:GX8025T_IIC写1个寄存器
描述:写一个寄存器地址和数据;		对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Register(u8 Add, u8 data)
{
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);

	GX8025T_SendByte(data);
	GX8025T_Stop();
}
/*******************************************************
功能:GX8025T_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Read_PrimaryAddress(u8 Add)
{
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
	GX8025T_Stop();

	// 读数据
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X01);
}

/*******************************************************
功能:GX8025T读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX8025T_IIC_Read_Register(u8 Add)
{
	u8 data;
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
	GX8025T_Stop();
	// 读数据
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X01);
	data = GX8025T_ReceiveByte(1);

	GX8025T_Stop();
	return data;
}
/*******************************************************
功能:GX8025T_IIC写 	连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Arr_Register(u8 Add, u8 data[])
{
	u8 i;
	// 计算数组的长度
	int length = sizeof(*data) / sizeof(data[0]);
	GX8025T_Start();
	// Control Byte
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
	for (i = 0; i < length; i++)
	{
		GX8025T_SendByte(data[i]);
	}
	GX8025T_Stop();
}
/*******************************************************
功能:GX8025T_IIC写 	连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX8025T_Write_Register(u8 Add, u8 num, u8 data)
{
	u8 i;

	GX8025T_Start();
	// Control Byte
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
	for (i = 0; i < num; i++)
	{
		GX8025T_SendByte(data);
	}
	GX8025T_Stop();
}
/*******************************************************
功能:GX8025T读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX8025T_IIC_Read_Arr_Register(u8 Add, u8 num)
{
	u8 data[num];
	u8 i;
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(Add);
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X01);
	GX8025T_ReceiveAck();
	for (i = 0; i < num; i++)
	{

		if (i < (num - 1))
		{
			data[i] = GX8025T_ReceiveByte(0);
		}
		else
		{
			data[i] = GX8025T_ReceiveByte(1);
		}
		printf("Reg%02X: %02X \r\n", i + Add, data[i]);
	}

	GX8025T_Stop();

	//	return data;
}

//// BCD转十进制
//uint8_t bcd_to_dec(uint8_t val)
//{
//	return ((val >> 4) * 10) + (val & 0x0F);
//}

//// 十进制转BCD
//uint8_t dec_to_bcd(uint8_t val)
//{
//	return ((val / 10) << 4) | (val % 10);
//}
/*******************************************************
功能:GX8025T 时间输出
描述:读出芯片当前时间

参数:无
返回值:无
*********************************************************/
void GX8025T_GetTime(GX8025T_Time *time)
{
	// 写读寄存器首地址
	GX8025T_IIC_Read_PrimaryAddress(0X00);
	time->sec = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x7F);	// 读取秒
	time->min = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x7F);	// 读取分钟
	time->hour = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x3F);	// 读取小时
	time->week =GX8025T_ReceiveByte(0) & 0x7F;	// 读取周数
	time->date = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x3F);	// 读取天
	time->month = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x1F); // 读取月
	time->year = bcd_to_dec(GX8025T_ReceiveByte(1) & 0xFF);	// 读取年

	GX8025T_Stop();
	printf("20%02d年%02d月%02d日%02d时%02d分%02d秒", time->year, time->month, time->date, time->hour, time->min, time->sec);
	printf("\r\n");
}
/*******************************************************
功能:GX8025T 读所有寄存器
描述:一个一个读

参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX8025T_Reg(void) // one by one read
{
	u8 tempdat[64], j;

	for (j = 0; j < 64; j++)
	{
		tempdat[j] = GX8025T_IIC_Read_Register(j);
		printf("Reg%02X: %02X \r\n", j, tempdat[j]);
		Delay_us(2);
	}
}

/*******************************************************
功能:GX8025T 设置时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time(GX8025T_Time *time)
{
	GX8025T_IIC_Write_Register(0x00, time->sec);	  // Sec
	GX8025T_IIC_Write_Register(0x01, time->min);	  // Min
	GX8025T_IIC_Write_Register(0x02, time->hour);  // Hour
	switch (time->week) {
	case 7: time->week = 0X01; break;
	case 1: time->week = 0X02; break;
	case 2: time->week = 0X04; break;
	case 3: time->week = 0X08; break;
	case 4: time->week = 0X10; break;
	case 5: time->week = 0X20; break;
	case 6: time->week = 0X40; break;		
  default: break;
   }
	GX8025T_IIC_Write_Register(0x03, time->week);  // Week
	GX8025T_IIC_Write_Register(0x04, time->date);  // Day
	GX8025T_IIC_Write_Register(0x05, time->month); // Mon
	GX8025T_IIC_Write_Register(0x06, time->year);  // Year
}
void GX8025T_Set_time_L(GX8025T_Time *time)
{
	GX8025T_Start();
	GX8025T_SendByte(GX8025T_ARR | 0X00);
	GX8025T_SendByte(0X00);
	GX8025T_SendByte(time->sec);
	GX8025T_SendByte(time->min);
	GX8025T_SendByte(time->hour);
		switch (time->week) {
	case 7: time->week = 0X01; break;
	case 1: time->week = 0X02; break;
	case 2: time->week = 0X04; break;
	case 3: time->week = 0X08; break;
	case 4: time->week = 0X10; break;
	case 5: time->week = 0X20; break;
	case 6: time->week = 0X40; break;		
  default: break;
   }
	GX8025T_SendByte(time->week);
	GX8025T_SendByte(time->date);
	GX8025T_SendByte(time->month);
	GX8025T_SendByte(time->year);
	 GX8025T_Stop();
//	GX8025T_IIC_Write_Register(0x00, time->sec);	  // Sec
//	GX8025T_IIC_Write_Register(0x01, time->min);	  // Min
//	GX8025T_IIC_Write_Register(0x02, time->hour);  // Hour
//	switch (time->week) {
//	case 7: time->week = 0X01; break;
//	case 1: time->week = 0X02; break;
//	case 2: time->week = 0X04; break;
//	case 3: time->week = 0X08; break;
//	case 4: time->week = 0X10; break;
//	case 5: time->week = 0X20; break;
//	case 6: time->week = 0X40; break;		
//  default: break;
//   }
//	GX8025T_IIC_Write_Register(0x03, time->week);  // Week
//	GX8025T_IIC_Write_Register(0x04, time->date);  // Day
//	GX8025T_IIC_Write_Register(0x05, time->month); // Mon
//	GX8025T_IIC_Write_Register(0x06, time->year);  // Year
}

/*******************************************************
功能:GX8025T 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time_test(GX8025T_Time *time)
{

	GX8025T_IIC_Write_Register(0x00, time->sec);	  // Sec
	GX8025T_IIC_Write_Register(0x01, time->min);	  // Min
	GX8025T_IIC_Write_Register(0x02, time->hour);  // Hour
	GX8025T_IIC_Write_Register(0x03, time->week);  // Week
	GX8025T_IIC_Write_Register(0x04, time->date);  // Day
	GX8025T_IIC_Write_Register(0x05, time->month); // Mon
	GX8025T_IIC_Write_Register(0x06, time->year);  // Year

	// 读取时间
	GX8025T_Time get_time;
	GX8025T_GetTime(&get_time);
	printf("等待2s延时");
	printf("\r\n");

	Delay_ms(1000);
	Delay_ms(1000);
	// 读取时间
	GX8025T_GetTime(&get_time);
	printf("\r\n");
}
/*******************************************************
功能:GX8025T方波输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出频率
bit7=0;bit4=1;
参数:8位data
返回值:无
RS1	RS0	输出频率
0			0	1Hz
0			1	4.096kHz
1			0	8.192kHz
1			1	32.768kHz
*********************************************************/
/*******************************************************
功能:GX8025T  OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Out(u8 data)
{
	if ((GX8025T_IIC_Read_Register(0X00)) >> 7 == 0X01)
	{
		/* /如果未初始化,执行初始化时间 */
		GX8025T_IIC_Write_Register(0X00, 0X00);
		printf("开始计时完成,flag=%d\r\n", GX8025T_IIC_Read_Register(0X00));
	}
	else
	{
		printf("时间已开始计时,flag=%d\r\n", GX8025T_IIC_Read_Register(0X00));
	}

	GX8025T_IIC_Write_Register(0X07, data);
}

3、GX8025T.h

#ifndef __GX8025T_H
#define __GX8025T_H 
  
#include "stm32f10x.h"
#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"

#define GX8025T_SCL GPIO_Pin_6
#define GX8025T_SDA GPIO_Pin_7

#define GX8025T_PORT GPIOB // IIC端口

#define GX8025T_ARR 0X64	  // IIC地址

#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"

/* 时间结构体 */
typedef struct
{
	uint8_t year;
	uint8_t month;
	uint8_t date;
	uint8_t hour;
	uint8_t min;
	uint8_t sec;
	uint8_t week;
} GX8025T_Time;

/*引脚配置层*/

/**
 * 函    数:I2C写SCL引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
 */
void GX8025T_W_SCL(uint8_t BitValue);
/**
 * 函    数:I2C写SDA引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
 */
void GX8025T_W_SDA(uint8_t BitValue);
/**
 * 函    数:I2C读SDA引脚电平
 * 参    数:无
 * 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
 * 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
 */
uint8_t GX8025T_READ_SDA(void);
/**
 * 函    数:I2C初始化
 * 参    数:无
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
 */
void GX8025T_Init(void);
/*协议层*/

/**
 * 函    数:I2C起始
 * 参    数:无
 * 返 回 值:无
 */
void GX8025T_Start(void);
/**
 * 函    数:I2C终止
 * 参    数:无
 * 返 回 值:无
 */
void GX8025T_Stop(void);
/**
 * 函    数:I2C接收应答位
 * 参    数:无
 * 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
 */
uint8_t GX8025T_ReceiveAck(void);
/**
 * 函    数:I2C发送一个字节
 * 参    数:Byte 要发送的一个字节数据,范围:0x00~0xFF
 * 返 回 值:无
 */
void GX8025T_SendByte(uint8_t Byte);
/**
 * 函    数:I2C接收一个字节
 * 参    数:u8 ack
 * 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
 */
uint8_t GX8025T_ReceiveByte(u8 ack);
/**
 * 函    数:I2C发送应答位
 * 参    数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
 * 返 回 值:无
 */
void GX8025T_SendAck(uint8_t AckBit);
/*******************************************************
功能:GX8025T_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Write_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX8025T_IIC写1个寄存器
描述:写一个寄存器地址和数据;		对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Register(u8 Add, u8 data);
/*******************************************************
功能:GX8025T_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Read_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX8025T读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX8025T_IIC_Read_Register(u8 Add);
/*******************************************************
功能:GX8025T_IIC写 	连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Arr_Register(u8 Add, u8 data[]);
/*******************************************************
功能:GX8025T_IIC写 	连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX8025T_Write_Register(u8 Add, u8 num, u8 data);
/*******************************************************
功能:GX8025T读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX8025T_IIC_Read_Arr_Register(u8 Add, u8 num);
/*******************************************************
功能:GX8025T 时间输出
描述:读出芯片当前时间

参数:无
返回值:无
*********************************************************/
void GX8025T_GetTime(GX8025T_Time *time);
/*******************************************************
功能:GX8025T 读所有寄存器
描述:一个一个读

参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX8025T_Reg(void);
/*******************************************************
功能:GX8025T 设置时间,并读出时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
/*******************************************************
功能:GX8025T 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time_test(GX8025T_Time *time);
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time(GX8025T_Time *time);
void GX8025T_Set_time_L(GX8025T_Time *time);
/*******************************************************
功能:GX8025T方波输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出频率
bit7=0;bit4=1;
参数:8位data
返回值:无
RS1	RS0	输出频率
0			0	1Hz
0			1	4.096kHz
1			0	8.192kHz
1			1	32.768kHz
*********************************************************/
/*******************************************************
功能:GX8025T  OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Out(u8 data);
#endif

友情提示:
欢迎各位伙伴咨询、测试有任何问题可随时交流沟通。
TEL : 15134034823 !!! 欢迎骚扰,哈哈^_^。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐