#include "pcf8563.h"
extern TIME getTIME;
/**STM32的IIC初始化函数*****************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO初始化结构体
I2C_InitTypeDef I2C_InitStructure; //声明IIC初始化结构体
// configrarion of STM32 GPIO
// GPIOB Periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// I2C1 and I2C2 Periph clock enable
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
// Configure I2C1 pins: SCL and SDA
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// conifgration of I2C
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//IIC模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//IIC时钟
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//反馈信号使能
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//地址位设置
// I2C_InitStructure.I2C_ClockSpeed = 100000;//传输速度相关设置
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_OwnAddress1 = Write_Pcf8563; //PFC8563
//I2C_Cmd(I2C1, ENABLE);
I2C_Cmd(I2C2, ENABLE);
// I2C_Init(I2C1, &I2C_InitStructure);
I2C_Init(I2C2, &I2C_InitStructure);
}
/**PFC8563 写数据函数*****************************/
void Rtc8563Write(u8 rtc_addr, u8 rtc_cmd)
{
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, Write_Pcf8563, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2, rtc_addr);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2, rtc_cmd);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2, ENABLE);
}
/**PFC8563读数据函数*****************************/
u8 RTC8563Read(u8 rtc_addr)
{
u8 rev_data;
// IIC_Init();//在调试的时候,发现每次读出数据的时候,都需要初始化IIC否则就会出错,具体的原因正在研究中。。。。
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
// printf("setp1!\n\r");
I2C_Send7bitAddress(I2C2, Write_Pcf8563, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// printf("setp2!\n\r");
//I2C_Cmd(I2C1,ENABLE); //使能I2C
I2C_SendData(I2C2, rtc_addr);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
// printf("setp3!\n\r");
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
// printf("setp4!\n\r");
I2C_Send7bitAddress(I2C2, Read_Pcf8563, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
// printf("setp5!\n\r");
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));
// printf("setp6!\n\r");
rev_data = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2, DISABLE); //关闭I2C的应答功能
I2C_GenerateSTOP(I2C2, ENABLE);
return rev_data;
}
/**设置PFC8563时间*****************************/
void Rtc8563_SetTime(unsigned char year, unsigned char month, unsigned char day, unsigned char hour, unsigned char mint, unsigned char second)
{
IIC_Init();
Rtc8563Write(Addr_second, second);
Rtc8563Write(Addr_mint, mint);
Rtc8563Write(Addr_hour, hour);
Rtc8563Write(Addr_day, day);
Rtc8563Write(Addr_month, month);
Rtc8563Write(Addr_year, year);
Rtc8563Write(0x00, 0x00);
return;
}
/**读取PFC8563时间*****************************/
u8 Rtc8563_GetTimer(void)
{
int tmp;
int i =5000;
// TIME getTIME;
tmp = RTC8563Read(Addr_second)&0x7f;
tmp =(tmp/16)*10+tmp%16;
getTIME.second = tmp;//读出的数据需要做转换才能直接使用 , 得到十进制数
//printf("setp1!\n\r");
tmp = RTC8563Read(Addr_mint)&0x7f;
tmp =(tmp/16)*10+tmp%16;
getTIME.mint = tmp;
//printf("setp2!\n\r");
//有时候可能需要在每个数据读出后,添加一个延时
//while(i--);
tmp = RTC8563Read(Addr_hour)&0x3f;
tmp =(tmp/16)*10+tmp%16;
getTIME.hour = tmp;
//printf("setp3!\n\r");
tmp = RTC8563Read(Addr_day)&0x3f;
tmp =(tmp/16)*10+tmp%16;
getTIME.day = tmp;
//printf("setp4!\n\r");
tmp = RTC8563Read(Addr_month)&0x1f;
tmp =(tmp/16)*10+tmp%16;
getTIME.month = tmp;
// printf("setp5!\n\r");
tmp = RTC8563Read(Addr_year)&0x1f;
tmp =(tmp/16)*10+tmp%16;
getTIME.year = tmp;
//while(i--);
// printf("setp6!\n\r");
//return ();
}
void PCF8563_set_day_alarm(unsigned char day) //day :BCD码,用十六进制数写十进制数
{
Rtc8563Write(Addr_day_alarm, day);
//Rtc8563Write(0x01,0x02);//AIE置1
}
void PCF8563_set_hour_alarm(unsigned char hour)
{
Rtc8563Write(Addr_hour_alarm, hour);
//Rtc8563Write(0x01,0x02);//AIE置1
}
void PCF8563_set_minute_alarm(unsigned char minute)
{
Rtc8563Write(Addr_minute_alarm, minute);
//Rtc8563Write(0x01,0x02);//AIE置1
}
void PCF8563_alarm_enable()
{
Rtc8563Write(0x01,0x02);//AIE置1
}
void PCF8563_clean_AF()
{
Rtc8563Write(0x01,0x00);//AF清零,AIE也清了,需要再次设置;AF清零后INT恢复
}
void PCF8563_Setalarm_Oneminute()
{
Rtc8563_GetTimer();
printf("20%d/%d/%d/%d/%d/%d\n\r",getTIME.year,getTIME.month,getTIME.day,getTIME.hour,getTIME.mint,getTIME.second);
// printf("get time over!\n\r");
if(getTIME.mint<59)
{
PCF8563_set_minute_alarm(((getTIME.mint+1)/10)*16+(getTIME.mint+1)%10);
printf("set minute %d over!\n\r",getTIME.mint+1);
// PCF8563_set_minute_alarm(0x15);
}
else
{
PCF8563_set_minute_alarm(0x00);
printf("set minute 0 over!\n\r");
}
if(getTIME.hour<23)
{
if(getTIME.mint<59)
{
PCF8563_set_hour_alarm(((getTIME.hour)/10)*16+(getTIME.hour)%10);
printf("set hour %d over!\n\r",getTIME.hour);
}
else
{
PCF8563_set_hour_alarm(((getTIME.hour+1)/10)*16+(getTIME.hour+1)%10);
printf("set hour %d over!\n\r",getTIME.hour+1);
}
}
else //说明是==23,得判断下分钟
{
//
if(getTIME.mint <=58)
{
PCF8563_set_hour_alarm(0x23);
printf("set hour 23 over!\n\r");
}
else //==59分
{
PCF8563_set_hour_alarm(0x00);
printf("set hour 0 over!\n\r");
}
}
PCF8563_alarm_enable();
}
void PCF8563_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure; //PB8用,PCF8563中断
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void PCF8563_Setalarm_Twominutes() // 设置偶数分钟
{
Rtc8563_GetTimer();
printf("20%d/%d/%d/%d/%d/%d\n\r",getTIME.year,getTIME.month,getTIME.day,getTIME.hour,getTIME.mint,getTIME.second);
// printf("get time over!\n\r");
if(getTIME.mint<58)
{
PCF8563_set_minute_alarm(((getTIME.mint+2)/10)*16+(getTIME.mint+2)%10-(getTIME.mint%2)); //保证设置的是偶数分钟
printf("set minute %d over!\n\r",getTIME.mint+2);
// PCF8563_set_minute_alarm(0x15);
}
else
{
PCF8563_set_minute_alarm(0x00);
printf("set minute 0 over!\n\r");
}
if(getTIME.hour<23)
{
if(getTIME.mint<58)
{
PCF8563_set_hour_alarm(((getTIME.hour)/10)*16+(getTIME.hour)%10);
print
- 1
- 2
- 3
- 4
- 5
前往页