GX1307超低功耗RTC芯片深度解析—— 完全兼容DS1307,性能更优、成本更低(含驱动示例)
国产GX1307实时时钟芯片实现完美替代,在低功耗和宽电压方面表现优异。该芯片完全兼容DS1307,支持2.0-5.5V宽电压输入,待机电流仅0.2μA,相比竞品功耗降低60%。其内置56字节SRAM,支持自动闰年修正和锂电池备份电源切换,特别适合便携医疗设备、智能电表等低功耗场景。硬件设计可直接替换DS1307,无需修改电路板和代码,成本降低30%以上。实测显示32.768kHz输出精度达±5p
一、为什么需要关注GX1307?
在便携设备、电池供电产品盛行的今天,实时时钟(RTC)芯片的功耗与稳定性直接决定用户体验。然而传统方案(如DS1307)存在价格高、电压范围窄等问题。国产GX1307的推出完美解决了这些痛点——它不仅100%软硬件兼容DS1307,更在功耗、电压适应性和成本上实现突破!
二、核心优势:不止于“替代”
| 特性 | GX1307 | 竞品典型值 |
|---|---|---|
| 供电电压 | 2.0~5.5V(VBAT支持锂电) | 4.5~5.5V |
| 通信接口 | 100kHz I²C | 同 |
| 时钟输出 | 可编程1Hz~32.768kHz | 同 |
| 价格 | 降低30%+(国产化优势) | 较高 |
📌 亮点功能:
闰年自动修正 + 掉电自动切换备用电源(VBAT支持锂电池)
电源故障检测(VPF=1.25×VBAT),切换无感
内置56字节SRAM,拓展数据存储能力

三、硬件设计“零改动”替代指南
引脚完全兼容!直接替换DS1307:
|
引脚 |
符号 |
说明 |
|
1 |
X1 |
X1是振荡器的输入,X2是振荡器的输出,连接到32.768kHZ石英晶体。内部振荡器电路设计X1,X2连接到12.5pF的负载电容(CL)。 |
|
2 |
X2 |
|
|
3 |
VBAT |
标准3V锂电池或其他备用电源输入。电池电压必须保持在最小和最大限值之间才能正常工作。如果不需要备用电源,VBAT必须接地。内部电路访问RTC和用户RAM的电源故障跳闸点(VPF)电压设置为1.25 x VBAT。 |
|
4 |
GND |
地 |
|
5 |
SDA |
串行数据输入/输出。SDA是I2C串行接口的数据输入/输出。SDA引脚为漏极开路,需要外部接上拉电阻。 |
|
6 |
SCL |
串行时钟输入。SCL是I2C接口的时钟输入。SCL引脚为漏极开路,需要外部接上拉电阻。 |
|
7 |
SQW |
方波/输出驱动器。启用时,SQWE位设置为1,SQW/OUT引脚可输出四个方波频率(1Hz、4kHz、8kHz、32kHz)之一。SQW/OUT引脚为漏极开路,需要外部接上拉电阻。SQW/OUT在应用VCC或VBAT的情况下运行。如果不使用,此引脚可以悬空。 |
|
8 |
VCC |
主电源。当工作在正常电压范围时,设备可访问,数据可以写入和读取。当备份电源连接到设备并且VCC低于VTP时,读写被禁止。计时功能继续不受较低输入电压的影响。 |
设计注意:
SDA/SCL/SQW需外接4.7kΩ上拉电阻。
四、实测性能对比
我们对GX1307进行多方面功能测试:
| 测试项 | 结果 |
|---|---|
| 32.768kHz输出精度 | ±5ppm(外接12pF电容) |
| 电源切换响应时间 | <100μs |
| I²C通信稳定性 | 100kHz连续传输零错误 |
五、典型应用场景
GX1307是一款低功耗时钟/日历芯片,具有56字节的SRAM。时钟/日历提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份,月底的日期会自动调整,包括闰年的更正。GX1307作为I2C总线上的从属设备运行,通过实现START条件并提供设备标识码和寄存器地址来获得访问,后续寄存器可以按顺序访问,直到执行STOP条件。当VCC降至1.25 x VBAT以下时,设备终止正在进行的访问并重置设备地址计数器,此时将无法识别设备的输入,以防止错误数据写入设备。当VCC降至VBAT以下时,设备将切换到低电流电池模式。通电后,当VCC大于VBAT+0.2V时,设备从电池切换到VCC,当VCC高于1.25 x VBAT时,设备识别输入。
-
便携医疗设备:电子体温计、血压仪(低至0.5μA电池模式电流)
-
智能电表:断电后依靠VBAT维持计时,数据不丢失
-
车载记录仪:宽电压(2.0~5.5V)适应车辆启动电压波动
-
手机备用时钟:主电源断开后由锂电池维持精准计时

六、工程师必看设计技巧
-
抗干扰设计:
-
VCC引脚并联100nF陶瓷电容(文档第9章强调)
-
晶振走线包地,远离高频信号源
-
-
省电秘籍:
-
关闭SQW输出可再降40%功耗(需时再使能)
-
长期存储时拉低VBAT,彻底断电
-
七、封装信息
-
封装:SOP-8(兼容DS1307焊盘)
-
工作温度:-40℃ ~ +85℃
💡 替代提示:
原有DS1307项目只需修改器件型号,无需改板/改代码!立享成本下降+性能提升双重红利!

立即点击👉 #GX1307 获取完整数据手册、参考设计
助力国产芯片崛起,从每一次设计选择开始!
#嵌入式开发 #国产芯片 #RTC #低功耗设计 #硬件替代
八、单片机驱动程序(附代码)
STM32F103 + GX1307驱动实例
1、main.c
/******************** OLED显示函数 ********************/
#include "stm32f10x.h" // Device header
#include "Serial.h"
#include "Delay.h"
#include "GX1307.h"
#include "stdio.h"
#include "OLED.h"
/******************** OLED显示函数 ********************/
void OLED_ShowTime_GX1307(GX1307_Time *time)
{
OLED_ShowString(1, 1, "GX1307");
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:");
OLED_ShowNum(4, 6, time->week, 1);
}
int main(void)
{
OLED_Init(); // OLED初始化
GX1307_Init();
while (1)
{
GX1307_Time get_GX1307_time;
GX1307_GetTime(&get_GX1307_time);
OLED_ShowTime_GX1307(&get_GX1307_time);
/* GX1307 设置时间 接收数据设置时间 */
GX1307_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]};
GX1307_Set_time(&init_time);
}
}
1、GX1307.c
#include "GX1307.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"
/*引脚配置层*/
/**
* 函 数:I2C写SCL引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
*/
void GX1307_W_SCL(uint8_t BitValue)
{
GPIO_WriteBit(GX1307_PORT, GX1307_SCL, (BitAction)BitValue); // 根据BitValue,设置SCL引脚的电平
// Delay_us(2); // 延时10us,防止时序频率超过要求
}
/**
* 函 数:I2C写SDA引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
*/
void GX1307_W_SDA(uint8_t BitValue)
{
GPIO_WriteBit(GX1307_PORT, GX1307_SDA, (BitAction)BitValue); // 根据BitValue,设置SDA引脚的电平,BitValue要实现非0即1的特性
// 延时10us,防止时序频率超过要求
}
/**
* 函 数:I2C读SDA引脚电平
* 参 数:无
* 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
* 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
*/
uint8_t GX1307_READ_SDA(void)
{
uint8_t BitValue;
BitValue = GPIO_ReadInputDataBit(GX1307_PORT, GX1307_SDA); // 读取SDA电平
return BitValue; // 返回SDA电平
}
/**
* 函 数:I2C初始化
* 参 数:无
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
*/
void GX1307_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 = GX1307_SCL | GX1307_SDA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GX1307_PORT, &GPIO_InitStructure);
/*设置默认电平*/
GPIO_SetBits(GX1307_PORT, GX1307_SCL | GX1307_SDA);
}
/*协议层*/
/**
* 函 数:I2C起始
* 参 数:无
* 返 回 值:无
*/
void GX1307_Start(void)
{
GX1307_W_SDA(1); // 释放SDA,确保SDA为高电平
GX1307_W_SCL(1); // 释放SCL,确保SCL为高电平
Delay_us(5);
GX1307_W_SDA(0); // 在SCL高电平期间,拉低SDA,产生起始信号
Delay_us(5);
GX1307_W_SCL(0); // 起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}
/**
* 函 数:I2C终止
* 参 数:无
* 返 回 值:无
*/
void GX1307_Stop(void)
{
GX1307_W_SCL(0);
GX1307_W_SDA(0); // 拉低SDA,确保SDA为低电平
Delay_us(5);
GX1307_W_SCL(1); // 释放SCL,使SCL呈现高电平
Delay_us(5);
GX1307_W_SDA(1); // 在SCL高电平期间,释放SDA,产生终止信号
}
/**
* 函 数:I2C接收应答位
* 参 数:无
* 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
*/
uint8_t GX1307_ReceiveAck(void)
{
uint8_t AckBit; // 定义应答位变量
GX1307_W_SDA(1); // 接收前,主机先确保释放SDA,避免干扰从机的数据发送
// Delay_us(1);
GX1307_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
// Delay_us(1);
AckBit = GX1307_READ_SDA(); // 将应答位存储到变量里
if (AckBit)
{
printf("N0 ACK!");
GX1307_Stop();
}
GX1307_W_SCL(0); // 拉低SCL,开始下一个时序模块
return AckBit; // 返回定义应答位变量
}
/**
* 函 数:I2C发送一个字节
* 参 数:Byte 要发送的一个字节数据,范围:0x00~0xFF
* 返 回 值:无
*/
void GX1307_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i++) // 循环8次,主机依次发送数据的每一位
{
/*两个!可以对数据进行两次逻辑取反,作用是把非0值统一转换为1,即:!!(0) = 0,!!(非0) = 1*/
GX1307_W_SDA(!!(Byte & (0x80 >> i))); // 使用掩码的方式取出Byte的指定一位数据并写入到SDA线
Delay_us(2);
GX1307_W_SCL(1); // 释放SCL,从机在SCL高电平期间读取SDA
Delay_us(3);
GX1307_W_SCL(0); // 拉低SCL,主机开始发送下一位数据
Delay_us(1);
}
GX1307_ReceiveAck();
}
/**
* 函 数:I2C接收一个字节
* 参 数:u8 ack
* 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
*/
uint8_t GX1307_ReceiveByte(u8 ack)
{
uint8_t i, Byte = 0x00; // 定义接收的数据,并赋初值0x00,此处必须赋初值0x00,后面会用到
GX1307_W_SDA(1); // 接收前,主机先确保释放SDA,避免干扰从机的数据发送
for (i = 0; i < 8; i++) // 循环8次,主机依次接收数据的每一位
{
GX1307_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
Delay_us(3);
if (GX1307_READ_SDA())
{
Byte |= (0x80 >> i);
} // 读取SDA数据,并存储到Byte变量
// 当SDA为1时,置变量指定位为1,当SDA为0时,不做处理,指定位为默认的初值0
GX1307_W_SCL(0); // 拉低SCL,从机在SCL低电平期间写入SDA
Delay_us(4);
}
GX1307_SendAck(ack);
return Byte; // 返回接收到的一个字节数据
}
/**
* 函 数:I2C发送应答位
* 参 数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
* 返 回 值:无
*/
void GX1307_SendAck(uint8_t AckBit)
{
GX1307_W_SDA(AckBit); // 主机把应答位数据放到SDA线
GX1307_W_SCL(1); // 释放SCL,从机在SCL高电平期间,读取应答位
//
GX1307_W_SCL(0); // 拉低SCL,开始下一个时序模块
}
/*******************************************************
功能:GX1307_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Write_PrimaryAddress(u8 Add)
{
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
}
/*******************************************************
功能:GX1307_IIC写1个寄存器
描述:写一个寄存器地址和数据; 对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Write_Register(u8 Add, u8 data)
{
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
GX1307_SendByte(data);
GX1307_Stop();
}
/*******************************************************
功能:GX1307_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Read_PrimaryAddress(u8 Add)
{
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
GX1307_Stop();
// 读数据
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Read);
}
/*******************************************************
功能:GX1307读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX1307_IIC_Read_Register(u8 Add)
{
u8 data;
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
GX1307_Stop();
// 读数据
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Read);
data = GX1307_ReceiveByte(1);
GX1307_Stop();
return data;
}
/*******************************************************
功能:GX1307_IIC写 连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX1307_IIC_Write_Arr_Register(u8 Add, u8 data[])
{
u8 i;
// 计算数组的长度
int length = sizeof(*data) / sizeof(data[0]);
GX1307_Start();
// Control Byte
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
for (i = 0; i < length; i++)
{
GX1307_SendByte(data[i]);
}
GX1307_Stop();
}
/*******************************************************
功能:GX1307_IIC写 连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX1307_Write_Register(u8 Add, u8 num, u8 data)
{
u8 i;
GX1307_Start();
// Control Byte
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
for (i = 0; i < num; i++)
{
GX1307_SendByte(data);
}
GX1307_Stop();
}
/*******************************************************
功能:GX1307读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX1307_IIC_Read_Arr_Register(u8 Add, u8 num)
{
u8 data[num];
u8 i;
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Write);
GX1307_SendByte(Add);
GX1307_Start();
GX1307_SendByte(GX1307_ARR | Read);
for (i = 0; i < num; i++)
{
if (i < (num - 1))
{
data[i] = GX1307_ReceiveByte(0);
}
else
{
data[i] = GX1307_ReceiveByte(1);
}
printf("Reg%02X: %02X \r\n", i + Add, data[i]);
}
GX1307_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);
}
/*******************************************************
功能:GX1307 时间输出
描述:读出芯片当前时间
参数:无
返回值:无
*********************************************************/
void GX1307_GetTime(GX1307_Time *time)
{
uint8_t hour;
// 写读寄存器首地址
GX1307_IIC_Read_PrimaryAddress(0X00);
time->sec = bcd_to_dec(GX1307_ReceiveByte(0) & 0x7F); // 读取秒
time->min = bcd_to_dec(GX1307_ReceiveByte(0) & 0x7F); // 读取分钟
hour = GX1307_ReceiveByte(0) & 0x7F; // 读取小时
time->week = bcd_to_dec(GX1307_ReceiveByte(0) & 0x07); // 读取周数
time->date = bcd_to_dec(GX1307_ReceiveByte(0) & 0x3F); // 读取天
time->month = bcd_to_dec(GX1307_ReceiveByte(0) & 0x1F); // 读取月
time->year = bcd_to_dec(GX1307_ReceiveByte(1) & 0xFF); // 读取年
GX1307_Stop();
if (hour & 0X40) // 十二进制
{
if (hour & 0X20)
{
time->hour = bcd_to_dec(hour & 0X1F);
/* PM */
// time->hour += 12; // PM
printf("20%02d年%02d月%02d日%02d时%02d分%02d秒PM", time->year, time->month, time->date, time->hour, time->min, time->sec);
}
else
{
time->hour = bcd_to_dec(hour & 0X1F);
/* AM */
printf("20%02d年%02d月%02d日%02d时%02d分%02d秒AM", time->year, time->month, time->date, time->hour, time->min, time->sec);
}
}
else
{
time->hour = bcd_to_dec(hour & 0x3F);
printf("20%02d年%02d月%02d日%02d时%02d分%02d秒", time->year, time->month, time->date, time->hour, time->min, time->sec);
}
printf("\r\n");
}
/*******************************************************
功能:GX1307 设置时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time(GX1307_Time *time)
{
// 初始化开始计时执行一次
if ((GX1307_IIC_Read_Register(0X00) & 0X80) == 0X01)
{
GX1307_IIC_Write_Register(0x00, 0x00); // 开始计时
// printf("时间初始化完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
else
{
// printf("时间已初始化,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
Delay_ms(1);
GX1307_IIC_Write_Register(0x00, time->sec); // Sec
GX1307_IIC_Write_Register(0x01, time->min); // Min
GX1307_IIC_Write_Register(0x02, time->hour); // Hour
GX1307_IIC_Write_Register(0x03, time->week); // Week
GX1307_IIC_Write_Register(0x04, time->date); // Day
GX1307_IIC_Write_Register(0x05, time->month); // Mon
GX1307_IIC_Write_Register(0x06, time->year); // Year
}
/*******************************************************
功能:GX1307 读所有寄存器
描述:一个一个读
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX1307_Reg(void) // one by one read
{
u8 tempdat[64], j;
for (j = 0; j < 64; j++)
{
tempdat[j] = GX1307_IIC_Read_Register(j);
printf("Reg%02X: %02X \r\n", j, tempdat[j]);
Delay_us(2);
}
}
/*******************************************************
功能:GX1307 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time_test(GX1307_Time *time)
{
// 初始化开始计时执行一次
if ((GX1307_IIC_Read_Register(0X00) & 0X80) == 0X01)
{
GX1307_IIC_Write_Register(0x00, 0x00); // 开始计时
printf("时间初始化完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
else
{
printf("时间已初始化,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
GX1307_IIC_Write_Register(0x00, time->sec); // Sec
GX1307_IIC_Write_Register(0x01, time->min); // Min
GX1307_IIC_Write_Register(0x02, time->hour); // Hour
GX1307_IIC_Write_Register(0x03, time->week); // Week
GX1307_IIC_Write_Register(0x04, time->date); // Day
GX1307_IIC_Write_Register(0x05, time->month); // Mon
GX1307_IIC_Write_Register(0x06, time->year); // Year
// 读取时间
GX1307_Time get_time;
GX1307_GetTime(&get_time);
printf("等待2s延时");
printf("\r\n");
Delay_ms(1000);
Delay_ms(1000);
// 读取时间
GX1307_GetTime(&get_time);
printf("\r\n");
}
/*******************************************************
功能:GX1307方波输出
描述:通过控制寄存器(地址 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
*********************************************************/
/*******************************************************
功能:GX1307 OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Out(u8 data)
{
if ((GX1307_IIC_Read_Register(0X00)) >> 7 == 0X01)
{
/* /如果未初始化,执行初始化时间 */
GX1307_IIC_Write_Register(0X00, 0X00);
printf("开始计时完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
else
{
printf("时间已开始计时,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
}
GX1307_IIC_Write_Register(0X07, data);
}
3、GX1307.h
#ifndef __GX1307_H
#define __GX1307_H
#include "stm32f10x.h"
#include "GX1307.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#define GX1307_SCL GPIO_Pin_6
#define GX1307_SDA GPIO_Pin_7
#define GX1307_PORT GPIOB // IIC端口
#define GX1307_ARR 0XD0 // IIC地址
#define Write 0X00
#define Read 0X01
// BCD转十进制
uint8_t bcd_to_dec(uint8_t val);
/* 时间结构体 */
typedef struct
{
uint8_t year;
uint8_t month;
uint8_t date;
uint8_t hour;
uint8_t min;
uint8_t sec;
uint8_t week;
} GX1307_Time;
/*引脚配置层*/
/**
* 函 数:I2C写SCL引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
*/
void GX1307_W_SCL(uint8_t BitValue);
/**
* 函 数:I2C写SDA引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
*/
void GX1307_W_SDA(uint8_t BitValue);
/**
* 函 数:I2C读SDA引脚电平
* 参 数:无
* 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
* 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
*/
uint8_t GX1307_READ_SDA(void);
/**
* 函 数:I2C初始化
* 参 数:无
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
*/
void GX1307_Init(void);
/*协议层*/
/**
* 函 数:I2C起始
* 参 数:无
* 返 回 值:无
*/
void GX1307_Start(void);
/**
* 函 数:I2C终止
* 参 数:无
* 返 回 值:无
*/
void GX1307_Stop(void);
/**
* 函 数:I2C接收应答位
* 参 数:无
* 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
*/
uint8_t GX1307_ReceiveAck(void);
/**
* 函 数:I2C发送一个字节
* 参 数:Byte 要发送的一个字节数据,范围:0x00~0xFF
* 返 回 值:无
*/
void GX1307_SendByte(uint8_t Byte);
/**
* 函 数:I2C接收一个字节
* 参 数:u8 ack
* 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
*/
uint8_t GX1307_ReceiveByte(u8 ack);
/**
* 函 数:I2C发送应答位
* 参 数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
* 返 回 值:无
*/
void GX1307_SendAck(uint8_t AckBit);
/*******************************************************
功能:GX1307_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Write_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX1307_IIC写1个寄存器
描述:写一个寄存器地址和数据; 对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Write_Register(u8 Add, u8 data);
/*******************************************************
功能:GX1307_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Read_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX1307读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX1307_IIC_Read_Register(u8 Add);
/*******************************************************
功能:GX1307_IIC写 连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX1307_IIC_Write_Arr_Register(u8 Add, u8 data[]);
/*******************************************************
功能:GX1307_IIC写 连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX1307_Write_Register(u8 Add, u8 num, u8 data);
/*******************************************************
功能:GX1307读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX1307_IIC_Read_Arr_Register(u8 Add, u8 num);
/*******************************************************
功能:GX1307 时间输出
描述:读出芯片当前时间
参数:无
返回值:无
*********************************************************/
void GX1307_GetTime(GX1307_Time *time);
/*******************************************************
功能:GX1307 读所有寄存器
描述:一个一个读
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX1307_Reg(void);
/*******************************************************
功能:GX1307 设置时间,并读出时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
/*******************************************************
功能:GX1307 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time_test(GX1307_Time *time);
// sec,min,hour,day,moom,year,week
void GX1307_Set_time(GX1307_Time *time);
/*******************************************************
功能:GX1307方波输出
描述:通过控制寄存器(地址 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
*********************************************************/
/*******************************************************
功能:GX1307 OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Out(u8 data);
#endif
友情提示:
欢迎各位伙伴咨询、测试有任何问题可随时交流沟通。
TEL : 15134034823 !!! 欢迎骚扰,哈哈^_^。
更多推荐




所有评论(0)