先放一张BL5372使用文档里的原理图
这里与RTC模块通信用的是模拟IIC 由手册知道IIC写地址为0x64 读为0x65
以下部分代码 为模拟IIC的一些函数 与设置/调取时间的一些函数
#include "RTC_BL5372.h"
#include "rx.h"
#include "DataStore.h"
#include "ddl.h"
h_alarm_set alarm_value;
h_rtc_init_time current_time;
h_rtc_read_time current_read_time;
void RTC_SDA_IN(void)
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
stcGpioCfg.enDir = GpioDirIn; //端口方向配置->输入
stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
}
void RTC_SDA_OUT(void)
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
stcGpioCfg.enDir = GpioDirOut; //端口方向配置->输入
stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
stcGpioCfg.enPu = GpioPuEnable; //端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
}
//初始化IIC
void RTC_IIC_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //打开GPIO外设时钟
stcGpioCfg.enDir = GpioDirOut; //端口方向配置->输入
stcGpioCfg.enDrv = GpioDrvL; //驱动能力配置->高驱动能力
stcGpioCfg.enPu = GpioPuDisable; //端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; //开漏输出配置->开漏输出关闭
stcGpioCfg.enCtrlMode = GpioAHB; //总线控制模式配置->AHB
Gpio_Init(RTC_IIC_PORT, RTC_IIC_SCL, &stcGpioCfg);
Gpio_Init(RTC_IIC_PORT, RTC_IIC_SDA, &stcGpioCfg);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
}
//产生IIC起始信号
void RTC_IIC_Start(void)
{
RTC_SDA_OUT(); // sda线输出
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Ddl_Delay1us(4);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // START:when CLK is high,DATA change form high to low
Ddl_Delay1us(4);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void RTC_IIC_Stop(void)
{
RTC_SDA_OUT(); // sda线输出
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA); // STOP:when CLK is high DATA change form low to high
Ddl_Delay1us(4);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA); //发送I2C总线结束信号
Ddl_Delay1us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 RTC_IIC_Wait_Ack(void)
{
u8 ucErrTime = 0;
RTC_SDA_IN(); // SDA设置为输入
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
Ddl_Delay1us(2);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Ddl_Delay1us(2);
while (RTC_READ_SDA == TRUE)
{
ucErrTime++;
if (ucErrTime > 250)
{
RTC_IIC_Stop();
return 1;
}
}
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //时钟输出0
return 0;
}
//产生ACK应答
void RTC_IIC_Ack(void)
{
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
RTC_SDA_OUT();
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
Ddl_Delay1us(2);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Ddl_Delay1us(2);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
}
//不产生ACK应答
void RTC_IIC_NAck(void)
{
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
RTC_SDA_OUT();
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
Ddl_Delay1us(2);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
Ddl_Delay1us(2);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
}
// IIC发送一个字节
//返回从机有无应答
// 1,有应答
// 0,无应答
void RTC_IIC_Send_Byte(u8 txd)
{
u8 t;
RTC_SDA_OUT();
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL); //拉低时钟开始数据传输
for (t = 0; t < 8; t++)
{
// RTC_IIC_SDA=(txd&0x80)>>7;
if ((txd & 0x80) >> 7)
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SDA);
else
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SDA);
txd <<= 1;
// Ddl_Delay1us(2); //对TEA5767这三个延时都是必须的
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
// Ddl_Delay1us(2);
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
// Ddl_Delay1us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte(unsigned char ack)
{
unsigned char i, receive = 0;
RTC_SDA_IN(); // SDA设置为输入
for (i = 0; i < 8; i++)
{
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
delay10us(1);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
receive <<= 1;
if (RTC_READ_SDA == TRUE)
receive++;
Ddl_Delay1us(1);
}
if (!ack)
RTC_IIC_NAck(); //发送nACK
else
RTC_IIC_Ack(); //发送ACK
return receive;
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte_Fast_Ack(unsigned char ack)
{
unsigned char i, receive = 0;
RTC_SDA_IN(); // SDA设置为输入
for (i = 0; i < 8; i++)
{
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
receive <<= 1;
if (RTC_READ_SDA == TRUE)
receive++;
}
if (!ack)
RTC_IIC_NAck(); //发送nACK
else
RTC_IIC_Ack(); //发送ACK
return receive;
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 RTC_IIC_Read_Byte_Fast_No_Ack()
{
unsigned char i, receive = 0;
RTC_SDA_IN(); // SDA设置为输入
for (i = 0; i < 8; i++)
{
Gpio_ClrIO(RTC_IIC_PORT, RTC_IIC_SCL);
Gpio_SetIO(RTC_IIC_PORT, RTC_IIC_SCL);
receive <<= 1;
if (RTC_READ_SDA == TRUE)
receive++;
}
return receive;
}
//初始化IIC接口
void RTC_Init(void)
{
RTC_IIC_Init();
}
//在AT24CXX指定地址读出一个数据
// ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 RTC_ReadOneByte(u16 ReadAddr)
{
u8 temp = 0;
RTC_IIC_Start();
RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
RTC_IIC_Wait_Ack();
RTC_IIC_Send_Byte(((ReadAddr<<4)|0)); //发送高地址
RTC_IIC_Wait_Ack();
RTC_IIC_Start();
RTC_IIC_Send_Byte(IIC_READ_ARR); //进入接收模式
RTC_IIC_Wait_Ack();
temp = RTC_IIC_Read_Byte(0);
// IIC_NAck();
RTC_IIC_Stop(); //产生一个停止条件
delay1ms(1);
Wdt_Feed();
return temp;
}
//在AT24CXX指定地址写入一个数据
// WriteAddr :写入数据的目的地址
// DataToWrite:要写入的数据
void RTC_WriteOneByte(u16 WriteAddr, u8 DataToWrite)
{
RTC_IIC_Start();
RTC_IIC_Send_Byte(IIC_WRITE_ARR); //发送写命令
RTC_IIC_Wait_Ack();
RTC_IIC_Send_Byte(((WriteAddr<<4)|0)); //发送高地址
RTC_IIC_Wait_Ack();
RTC_IIC_Send_Byte(DataToWrite); //发送字节
RTC_IIC_Wait_Ack();
RTC_IIC_Stop(); //产生一个停止条件
delay1ms(10);
}
//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
// WriteAddr :开始写入的地址
// DataToWrite:数据数组首地址
// Len :要写入数据的长度2,4
void RTC_WriteLenByte(u16 WriteAddr, unsigned char *pBuffer, u8 Len)
{
while(Len--)
{
RTC_WriteOneByte(WriteAddr,*pBuffer);
WriteAddr++;
pBuffer++;
}
}
//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
// ReadAddr :开始读出的地址
//返回值 :数据
// Len :要读出数据的长度2,4
void RTC_ReadLenByte(unsigned char ReadAddr,unsigned char *pBuffer,unsigned char NumToRead)
{
while(NumToRead)
{
*pBuffer++=RTC_ReadOneByte(ReadAddr++);
NumToRead--;
}
}
//检查AT24CXX是否正常
//这里用了24XX的最后一个地址(255)65535来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 RTC_Check(void)
{
u8 temp;
temp = RTC_ReadOneByte(65535); //避免每次开机都写AT24CXX
if (temp == 0x55)
return 0;
else //排除第一次初始化的情况
{
RTC_WriteOneByte(65535, 0x55);
temp = RTC_ReadOneByte(65535);
if (temp == 0x55)
return 0;
}
return 1;
}
//在AT24CXX里面的指定地址开始读出指定个数的数据
// ReadAddr :开始读出的地址 对24c02为0~255
// pBuffer :数据数组首地址
// NumToRead:要读出数据的个数
void RTC_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
{
while (NumToRead)
{
*pBuffer++ = RTC_ReadOneByte(ReadAddr++);
// printf("%c\n",*pBuffer);//显示读到的字符串
NumToRead--;
Wdt_Feed();
}
}
//在AT24CXX里面的指定地址开始写入指定个数的数据
// WriteAddr :开始写入的地址 对24c02为0~255
// pBuffer :数据数组首地址
// NumToWrite:要写入数据的个数
void RTC_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite)
{
while (NumToWrite--)
{
RTC_WriteOneByte(WriteAddr, *pBuffer);
WriteAddr++;
pBuffer++;
Wdt_Feed();
}
}
//用来设置当前的时间
void BL5372_init(h_rtc_init_time time)
{
unsigned char BL5372buf[16];
unsigned char temp;
unsigned char index=0;
///RTC_IIC_Init
BL5372buf[index++]=time.Set_Second;second
BL5372buf[index++]=time.Set_Minute;minute
BL5372buf[index++]=time.Set_Hour;hour
BL5372buf[index++]=time.Set_Week;week
BL5372buf[index++]=time.Set_Day;day
BL5372buf[index++]=time.Set_Month;month
BL5372buf[index++]=time.Set_Year;///year
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=0x00;
BL5372buf[index++]=RTC_CRL_G1_USUAL;
BL5372buf[index++]=RTC_CRL_G2_USUAL;
do{
RTC_WriteLenByte(0x00,BL5372buf,16);
temp=RTC_ReadOneByte(RTC_CRL_G2_ARR);
}while((temp&0x10)==0x10);
}
//读当前时间
void Read_Nowtime(h_rtc_read_time *read_time)
{
read_time->Second=RTC_ReadOneByte(RTC_SECOND_ARR);
read_time->Minute=RTC_ReadOneByte(RTC_MINUTE_ARR);
read_time->Hour=RTC_ReadOneByte(RTC_HOUR_ARR);
read_time->Week=RTC_ReadOneByte(RTC_WEEK_ARR);
read_time->Day=RTC_ReadOneByte(RTC_DAY_ARR);
read_time->Month=RTC_ReadOneByte(RTC_MONTH_ARR);
read_time->Year=RTC_ReadOneByte(RTC_YEAR_ARR);
read_time->Control_1=RTC_ReadOneByte(RTC_CRL_G1_ARR);
read_time->Control_2=RTC_ReadOneByte(RTC_CRL_G2_ARR);
}
//自定义时间闹钟
void RTC_SetAlarm(h_alarm_set value)
{
RTC_WriteOneByte(ALARM_CLOCK_MINUTE_ARR,value.Minute);
RTC_WriteOneByte(ALARM_CLOCK_HOUR_ARR,value.Hour);
RTC_WriteOneByte(ALARM_CLOCK_WEEK_ARR,value.Week);
RTC_WriteOneByte(RTC_CRL_G1_ARR,RTC_CRL_G1_ALARM);
RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_ALARM);
}
//定时间隔输出
void RTC_Fixed_interval_timer(interval_timer Mode)
{
RTC_WriteOneByte(RTC_CRL_G1_ARR,Mode);
RTC_WriteOneByte(RTC_CRL_G2_ARR,RTC_CRL_G2_USUAL);
}
下面为.h文件
#ifndef __RTC_BL5372_H
#define __RTC_BL5372_H
#include "main.h"
#include "rx.h"
#include "device_menu.h"
//IO操作函数
#define RTC_IIC_PORT GpioPortB
#define RTC_IIC_SCL GpioPin8 //SCL
#define RTC_IIC_SDA GpioPin9 //SDA
#define RTC_READ_SDA Gpio_GetInputIO(RTC_IIC_PORT, RTC_IIC_SDA) //输入SDA
#define IIC_WRITE_ARR 0x64
#define IIC_READ_ARR 0x65
#define RTC_CRL_G1_USUAL 0x00 //控制寄存器1通常值
#define RTC_CRL_G2_USUAL 0x20 //控制寄存器2通常值(清除中断的值)
#define RTC_CRL_G1_ALARM 0x80 //控制寄存器1闹钟值
#define RTC_CRL_G2_ALARM 0x20 //控制寄存器2闹钟值
#define ALARM_CLOCK_MINUTE_ARR 0x08 //定时闹钟分钟地址
#define ALARM_CLOCK_HOUR_ARR 0x09 //定时闹钟小时地址
#define ALARM_CLOCK_WEEK_ARR 0x0A //定时闹钟每周哪几天响地址
#define RTC_SECOND_ARR 0x00 //读取秒时地址
#define RTC_MINUTE_ARR 0x01 //读取分时地址
#define RTC_HOUR_ARR 0x02 //读取时时地址
#define RTC_WEEK_ARR 0x03 //读取周时地址
#define RTC_DAY_ARR 0x04 //读取天时地址
#define RTC_MONTH_ARR 0x05 //读取月时地址
#define RTC_YEAR_ARR 0x06 //读取年时地址
#define RTC_CRL_G1_ARR 0x0E //控制寄存器1地址
#define RTC_CRL_G2_ARR 0x0F //控制寄存器2地址
#define RTC_ALARM_CLEAR_IRQ 0x22 //闹钟进中断控制寄存器2的值
#define RTC_TIMER_CLEAR_IRQ 0x24 //定时进中断控制寄存器2的值
extern uint8_t RRTCiic_buf[16]; //读出来的时间放在这里
typedef struct rtc_init_time
{
unsigned char Set_Year;
unsigned char Set_Month;
unsigned char Set_Day;
unsigned char Set_Week;
unsigned char Set_Hour;
unsigned char Set_Minute;
unsigned char Set_Second;
}h_rtc_init_time;
extern h_rtc_init_time current_time;
typedef struct rtc_read_time
{
unsigned char Year;
unsigned char Month;
unsigned char Day;
unsigned char Week;
unsigned char Hour;
unsigned char Minute;
unsigned char Second;
unsigned char Control_1;
unsigned char Control_2;
}h_rtc_read_time;
extern h_rtc_read_time current_read_time;
//可设置每周哪几天的几点几分
//Week表示:二进制1111111分别代表周日周一到周六 全一代表每天都设置了闹钟 0000001代表只有周六设置了闹钟
//Hour,Minute为闹钟几点几分
/*
如果用这个函数main里可以这样检测
闹钟到了会触发寄存器0x0F里的位
if(((RTC_ReadOneByte(0x0F))==0x24||(RTC_ReadOneByte(0x0F))==0x22)||(RTC_ReadOneByte(0x0F))==0x26)
{
delay1ms(5000);
RTC_WriteOneByte(0x0F,0x20); //清除闹钟标志位
}
*/
typedef struct alarm_set
{
unsigned char Week;
unsigned char Hour;
unsigned char Minute;
}h_alarm_set;
extern h_alarm_set alarm_value;
/*
1.SECOND_MODE:每秒标志位置一
2.MINUTE_MODE:每分标志位置一(每分 00 秒)
3.HOUR_MODE:每时标志位置一(每时 00 分:00 秒)
4.MONTH_MODE:每月标志位置一(每月第 1 天 00 时:00 分:00 秒)
标志位需清除 例:
if(((RTC_ReadOneByte(0x0F))==0x24||(RTC_ReadOneByte(0x0F))==0x22)||(RTC_ReadOneByte(0x0F))==0x26)
{
delay1ms(500);
RTC_WriteOneByte(0x0F,0x20); //清除标志位
}
*/
typedef enum
{
SECOND_MODE = 0x84,
MINUTE_MODE,
HOUR_MODE,
MONTH_MODE
}interval_timer;
//IIC所有操作函数
void RTC_IIC_Init(void); //初始化IIC的IO口
void RTC_IIC_Start(void); //发送IIC开始信号
void RTC_IIC_Stop(void); //发送IIC停止信号
void RTC_IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 RTC_IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
u8 RTC_IIC_Wait_Ack(void); //IIC等待ACK信号
void RTC_IIC_Ack(void); //IIC发送ACK信号
void RTC_IIC_NAck(void); //IIC不发送ACK信号
void RTC_IIC_Write_One_Byte(u8 daddr, u8 addr, u8 data);
u8 RTC_IIC_Read_One_Byte(u8 daddr, u8 addr);
u8 RTC_ReadOneByte(u16 ReadAddr); //指定地址读取一个字节
void RTC_WriteOneByte(u16 WriteAddr, u8 DataToWrite); //指定地址写入一个字节
void RTC_WriteLenByte(u16 WriteAddr, unsigned char *pBuffer, u8 Len); //指定地址开始写入指定长度的数据
void RTC_ReadLenByte(unsigned char ReadAddr,unsigned char *pBuffer,unsigned char NumToRead); //指定地址开始读取指定长度数据
void RTC_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite); //从指定地址开始写入指定长度的数据
void RTC_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead); //从指定地址开始读出指定长度的数据
void BL5372_init(h_rtc_init_time time);
void Read_Nowtime(h_rtc_read_time *read_time);
void RTC_SetAlarm(h_alarm_set value);
void RTC_Fixed_interval_timer(interval_timer Mode);
#endif
以下为主函数设置与读取时间代码
int main(void)
{
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE); // RTC模块时钟打开
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
RTC_Init(); // iic初始化
//设置时间
current_time.Set_Year=0x23;
current_time.Set_Month=0x07;
current_time.Set_Day =0x11;
current_time.Set_Week=0x02;
current_time.Set_Hour=0x09;
current_time.Set_Minute=0x43;
current_time.Set_Second=0x00;
BL5372_init(current_time);
while (1)
{
//读取时间到结构体
Read_Nowtime(¤t_read_time);
}
}
以上为设置/读取时间的一些函数
该RTC芯片还有两个额外功能
1.可设置闹钟输出电平
2.可设置每时/分/秒输出电平
以上两种功能主要是需要设置两个控制寄存器的值
先说控制寄存器1 这里有几个重要的位 我贴出来
接下来看控制寄存器2
以下为我自己总结的两种功能分别要发送什么
对于这些寄存器的配置 我已经写好函数 直接将结构体赋值 引用函数即可
例:设置闹钟 (INTRA引脚输出低电平)
int main(void)
{
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE); // RTC模块时钟打开
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
RTC_Init(); // iic初始化
//设置时间
current_time.Set_Year=0x23;
current_time.Set_Month=0x07;
current_time.Set_Day =0x11;
current_time.Set_Week=0x02;
current_time.Set_Hour=0x09;
current_time.Set_Minute=0x43;
current_time.Set_Second=0x00;
BL5372_init(current_time);
//每天9点45分INTRA引脚输出低电平
alarm_value.Hour=0x09;
alarm_value.Minute=0x45;
alarm_value.Week=0x7F; //代表1111111 一周里每天的意思
RTC_SetAlarm(alarm_value);
while (1)
{
Read_Nowtime(¤t_read_time);
}
}
例:设置每分钟进中断(INTRA引脚输出低电平)
int main(void)
{
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // GPIO外设时钟打开
Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc, TRUE); // RTC模块时钟打开
Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
RTC_Init(); // iic初始化
//设置时间
current_time.Set_Year=0x23;
current_time.Set_Month=0x07;
current_time.Set_Day =0x11;
current_time.Set_Week=0x02;
current_time.Set_Hour=0x09;
current_time.Set_Minute=0x43;
current_time.Set_Second=0x00;
BL5372_init(current_time);
//设置每分钟进中断
RTC_Fixed_interval_timer(MINUTE_MODE);
while (1)
{
Read_Nowtime(¤t_read_time);
}
}
注意:这里清除中断为在while(1)里加入
另外延时时间可以根据需要修改
if(((RTC_ReadOneByte(0x0F))==0x24||(RTC_ReadOneByte(0x0F))==0x22)||(RTC_ReadOneByte(0x0F))==0x26)
{
delay1ms(500);
RTC_WriteOneByte(0x0F,0x20); //清除闹钟标志位
}
欢迎评论,一起学习!!!