From 6b0d1f644233b2984d2a87553de598879cf05caf Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Tue, 28 May 2024 17:24:59 +0800
Subject: [PATCH] 继续完善

---
 HARDWARE/RTC/RTC.c |  642 +++++++++-------------------------------------------------
 1 files changed, 100 insertions(+), 542 deletions(-)

diff --git a/HARDWARE/RTC/RTC.c b/HARDWARE/RTC/RTC.c
index 246c32f..125f53b 100644
--- a/HARDWARE/RTC/RTC.c
+++ b/HARDWARE/RTC/RTC.c
@@ -1,561 +1,119 @@
-#include "RTC.h"
-#include "delay.h"
+#include "rtc.h"
+#include "extern_rtc.h"
+#include "gpio.h"
+#include "uart.h"
 
 
 
-calendar_obj   calendar; //ʮ����
-sClockBCD      Time_BCD_g; //BCD
+//__IO RTC_TimeDateTypeDef calendar_g = {0};
 
-
-//IIC ����������ʱ������
-u8 I2C_RECV_DATA[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};//second  minutes hour week  date month year
-
-
-/*******************************************
-		IIC �źŽ����źź���
-********************************************/
-// // void I2C_STOP(void)
-// // {
-// // 	SDA_OUT();//sda�����
-// // 	IIC_SCL=0;
-// // 	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
-// //  	delay_us(3);
-// // 	IIC_SCL=1; 
-// // 	IIC_SDA=1;//����I2C���߽����ź�
-// // 	delay_us(3);
-// // }
-
-// /*******************************************
-// 		IIC �ź���ʼ�źź���
-// ********************************************/
-// void I2C_START(void)
-// {
-// 	SDA_OUT();     //sda�����
-// 	IIC_SDA=1;	  	  
-// 	IIC_SCL=1;
-// 	delay_us(3);
-//  	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
-// //	DS1339_SDA_LOW;
-// 	delay_us(3);
-// 	IIC_SCL=0;
-// }
-
-
-// //////////////////////
-
-// //�ȴ�Ӧ���źŵ���
-// //����ֵ��1������Ӧ��ʧ��
-// //        0������Ӧ��ɹ�
-// u8 I2C_Wait_Ack(void)
-// {
-// 	u8 ucErrTime=0;
-// 	SDA_IN();      //SDA��������    
-// 	IIC_SCL=1;delay_us(3);	 
-// 	while(READ_SDA)
-// 	{
-// 		ucErrTime++;
-// 		if(ucErrTime>250)
-// 		{
-// 			I2C_STOP();
-// 			return 1;
-// 		}
-// 	}
-// 	IIC_SCL=0;//ʱ�����0 	  	
-// 	return 0;  
-// } 
-
-
-// //����ACKӦ��
-// void I2C_Ack(void)
-// {
-// 	IIC_SCL=0;
-// 	SDA_OUT();
-// 	IIC_SDA=0;
-// 	delay_us(3);
-// 	IIC_SCL=1;
-// 	delay_us(3);
-// 	IIC_SCL=0;
-// 	delay_us(3);
-// }
-
-
-
-// //������ACKӦ��		    
-// void I2C_NAck(void)
-// {
-// 	IIC_SCL=0;
-// 	SDA_OUT();
-// 	IIC_SDA=1;
-// 	delay_us(3);
-// 	IIC_SCL=1;
-// 	delay_us(3);
-// 	IIC_SCL=0;
-// }	
-
-// /*******************************************
-// 		IIC �����ֽں���
-// 		���� 	1��Ҫ�����ֽ�ֵ
-// 		return ���޷���
-// ********************************************/
-// void I2C_TxByte(unsigned char nValue)
-// {
-//     int i;
-// 		SDA_OUT(); 	
-// 	  IIC_SCL=0;	
-//     for(i = 0;i < 8;i++)
-//     {
-//     	if(nValue & 0x80)
-// 			  IIC_SDA=1;
-//     	else
-// 			  IIC_SDA=0;
-// 	   nValue <<= 1;
-//     	delay_us(3);
-// 	  IIC_SCL=1;	
-//     delay_us(3);
-// 	  IIC_SCL=0;	
-// 		delay_us(3);
-//     }
-// }
-
-// /*******************************************
-// 		IIC �����ֽں���
-// 		���� 		��
-// 		return ���޷���
-// ********************************************/
-// u8  I2C_RxByte(void)
-// {
-//     unsigned char nTemp = 0;
-//     int i;
-// 	
-// 	  SDA_IN();//SDA��������
-// 	
-//     for(i = 0;i < 8;i++)
-//     {
-
-//     		IIC_SCL=1;
-//      	if(READ_SDA)
-//     	{
-//     	   nTemp |= (0x01 << (7-i));
-//     	}
-//       delay_us(3);
-//     		IIC_SCL=0;
-// 		  delay_us(3);
-//     }
-
-//     return nTemp;
-// }
-
-
-// /*******************************************
-// 		IIC �������麯��
-// 	����  	1 num : �����ֽ���
-// 	    2 device_addr : iicĿ���ַ
-// 	    3 *data	�����������ַ
-// 	return ���޷���
-// ********************************************/
-// void I2C_Write(u8 num, u8 Write_addr,u8 *data)
-// {
-//     int i = 0;
-//     unsigned char *send_data = data;
-
-//     I2C_START();
-//     I2C_TxByte(DS1339_Write_Add);
-// 	  I2C_Wait_Ack();
-//     I2C_TxByte(Write_addr);
-// 	
-//     for(i = 0;i < num;i++)
-//     {
-// 			I2C_Wait_Ack();
-//       I2C_TxByte(send_data[i]);
-//     }
-// 		I2C_STOP();
-// }
-
-
-// /*******************************************
-// 		IIC ��ȡ���麯��
-// 	����  	1 num : �����ֽ���
-// 	    2 device_addr : iicĿ���ַ
-// 	    3 *data	�����������ַ
-// 	return ���޷���
-// ********************************************/
-// void I2C_Read(u8 num, u8 Read_addr)
-// {
-//   u8 i = 0;
-
-// 	  I2C_START();
-//     I2C_TxByte(DS1339_Write_Add);
-// 		I2C_Wait_Ack();
-// 		I2C_TxByte(Read_addr);
-// 		I2C_Wait_Ack();
-// 	
-// 	  I2C_START();
-//     I2C_TxByte(DS1339_Read_Add);
-//  
-//   for(i = 0; i < num;i++)
-//   {		
-//     I2C_Ack();
-//     I2C_RECV_DATA[i] = I2C_RxByte();
-//   }
-// 		I2C_NAck();
-//     I2C_STOP();
-// }
-
-
-// u8 OSFBIT_Check(void)
-// {
-//   I2C_Read(1,DS1339_Status_Reg);
-//  if(I2C_RECV_DATA[0]&0x80)
-// 	 return 1;
-//  else 
-// 	 return 0;
-// }
-
-
-// void OSFBIT_SetLow(void)
-// {
-// 	u8 a=0;
-//  I2C_Write(1,DS1339_Status_Reg,&a);
-// }
-
-void IIC_Start(void)
+void RTC_IRQHandler(void)
 {
-	SDA_OUT();     
-	IIC_SCL=1;
-	IIC_SDA=1;
-	delay_us(10);
-	IIC_SDA=0;
-	delay_us(10);
-	IIC_SCL=0;	
-	delay_us(10);
-	
-	
-	
-}	  
- 
-void IIC_Stop(void)
-{
-	u8 i;
-	SDA_OUT();//sda???
-	IIC_SDA=0;
-	delay_us(10);
-	IIC_SCL=1;
-	delay_us(10);
-	IIC_SDA=1;
-	for(i=0;i<5;i++)
-	{
-		delay_us(10);
-	}		   	
+//	if(__SYS_DELAY_SEC_FLAG_GET(sys_active_time) == SET && LargeCurrent_LimitingProcess() == 3)
+//		SysWakeUp_ClockCfg();
+//	if( RTC_ISR_SEC_IF_Chk() == SET)//��ѯ���Ӷϱ�־�Ƿ�����
+//	{
+//		RTC_ISR_SEC_IF_Clr();		//������жϱ�־
+//		sys_time_g.sys_run_period = SET;
+//		Get_Sys_Rtc_Time(&calendar_g);
+//	}	
 }
- 
-u8 IIC_Wait_Ack(void)
+
+
+void RTC_Init(void)
+{	
+	CMU_PERCLK_SetableEx(RTCCLK, ENABLE);  //RTC����ʱ��ʹ��
+	//RTCʹ��XTLF/RCHF���ϵ��Զ����񣬲���Ҫʹ�ܹ���ʱ��
+	
+  RTC_ISR_SEC_IF_Clr();		//������жϱ�־											
+	RTC_IER_SEC_IE_Setable(ENABLE);//��RTC���ж�	
+	
+	NVIC_DisableIRQ(RTC_IRQn);				//NVIC�жϿ���������
+	NVIC_SetPriority(RTC_IRQn,1);
+	NVIC_EnableIRQ(RTC_IRQn);	
+	
+	RTC_CR_RTC_EN_Setable(ENABLE);  //ʹ��RTC_A
+}
+
+
+/******************************************
+ * func:    Get_Sys_Rtc_Time
+ * desc:    ��ȡϵͳRTCʱ��
+ * input:   pOutput_timedata ����ȡϵͳʱ��ָ�루BCD��ʽ��
+ * output:  none
+ * return:  none
+ *****************************************/
+ErrorStatus_STM32 Get_Sys_Rtc_Time(__IO RTC_TimeDateTypeDef * pOutput_timedata)
 {
-	u8 ucErrTime=0;
-	SDA_IN();      //SDA?????  
-	delay_us(10);   
-	delay_us(10);
-	while(READ_SDA)
+	uint08 n, i;
+	ErrorStatus_STM32 Result = ERROR_1;
+
+	RTC_TimeDateTypeDef TempTime1,TempTime2;
+	
+	for(n=0 ;n<3; n++)
 	{
-		ucErrTime++;
-		if(ucErrTime>250)
-		{
-			IIC_Stop();
-			return 1;
-		}
+		RTC_TimeDate_GetEx(&TempTime1);//��һ��ʱ��
+		RTC_TimeDate_GetEx(&TempTime2);//�ٶ�һ��ʱ��
 		
-	}
-	IIC_SCL=0;//????0 	   
-	return 0;  
-} 
- 
-void IIC_Ack(void)
-{
-	
-	SDA_OUT();
-	IIC_SDA=0;;
-	delay_us(10);
-	IIC_SCL=1;
-	delay_us(10);
-	IIC_SCL=0;
-	delay_us(10);
-}
-	    
-void IIC_NAck(void)
-{
-	SDA_OUT();
-	IIC_SDA=1;;
-	delay_us(10);
-	IIC_SCL=1;
-	delay_us(10);
-	IIC_SCL=0;
-	delay_us(10);
-}					 				     
-		  
-void IIC_Send_Byte(u8 txd)
-{ 
-	u8 i;
-	SDA_OUT();
-	for(i=0;i<8;i++)
-	{
-		if(txd & 0x80) IIC_SDA=1;
-		else IIC_SDA=0;
-		txd <<= 1;
-		delay_us(10);
-    	IIC_SCL=1;
-		delay_us(10);
-		IIC_SCL=0;	
-	}
-	delay_us(10);
-	IIC_SCL=1;
-	delay_us(10);
-	IIC_SCL=0;
-} 	    
- 
-u8 IIC_Read_Byte(unsigned char ack)
-{
-	u8 i,receive=0;
-	SDA_IN();//SDA?????
-	
-		for(i=0;i<8;i++)
+		for(i=0; i<7; i++)//����һ��, ��ʾ��ȡ�ɹ�
 		{
-			IIC_SCL=1;
-			delay_us(10);
-			receive <<=1;
-			if(READ_SDA) receive |= 0x01;
-			
-			IIC_SCL=0;
-			delay_us(10);
+			if(((uint08*)(&TempTime1))[i] != ((uint08*)(&TempTime2))[i]) break;
 		}
-		SDA_OUT();
-		return receive;
+		if(i == 7)
+		{
+			Result = SUCCESS_0;
+			memcpy((uint08*)(pOutput_timedata), (uint08*)(&TempTime1), 7);//��ȡ��ȷ������µ�ʱ��		
+//			memcpy(&sys_realtime_data_g.time_para_s,&TempTime1,7);
+			break;
+		}
+	}
+	return Result;
+}
+
+/******************************************
+ * func:    Set_Sys_Rtc_Time
+ * desc:    ����ϵͳRTCʱ��
+ * input:   pInput_timedata��д���ϵͳʱ��ָ�루BCD��ʽ��
+ * output:  none
+ * return:  none
+ *****************************************/
+ErrorStatus_STM32 Set_Sys_Rtc_Time(uint8_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec,uint8_t week)
+{
+	uint08 n, i;
+	ErrorStatus_STM32 Result;
+	RTC_TimeDateTypeDef TempTime1;
+	RTC_TimeDateTypeDef real_time = {year,month,day,hour,min,sec,week};
+	for(n=0 ;n<3; n++)
+	{
+		RTC_WER_Write(RTC_WRITE_ENABLE );		//���RTC���
+		RTC_TimeDate_SetEx(&real_time);			//����RTC
+		RTC_WER_Write(RTC_WRITE_DISABLE );	//��RTC���
 		
-}
- 
- 
-void R8025AC_Read(u8 sadd, u8 *buf, u8 len)
-{
-	u8 i;
-	IIC_Start();
-	IIC_Send_Byte(0x64);
-	IIC_Send_Byte(sadd);
-	IIC_Start();
-	IIC_Send_Byte(0x65);
-	for(i=0;i<len-1;i++)
-	{
-		buf[i] = IIC_Read_Byte(1);
-		IIC_Ack();
+		Result = Get_Sys_Rtc_Time(&TempTime1);	//��ȡȷ�����ý��
+		if(Result == SUCCESS_0)
+		{
+			Result = ERROR_1;
+			for(i=0; i<7; i++)//����һ��, ��ʾ���óɹ�
+			{
+				if(((uint08*)(&TempTime1))[i] != ((uint08*)(&real_time))[i]) break;
+			}
+			if(i == 7)
+			{
+				Result = SUCCESS_0;
+				break;
+			}
+		}
 	}
-	buf[i] = IIC_Read_Byte(0);
-	IIC_NAck();
-	IIC_Stop();
+	return Result;
 }
- 
-void R8025AC_Write(u8 sadd,u8 *buf,u8 len)
+
+void rtc_setalarm(RTC_AlarmTmieTypeDef* para)
 {
-	u8 i;
+	RTC_AlarmTime_SetEx(para);	//��������ʱ��	
 	
-	IIC_Start();
-	IIC_Send_Byte(0X64);
-	IIC_Send_Byte(sadd);
-	
-	for(i=0;i<len;i++)
-	{
-		IIC_Send_Byte(buf[i]);
-	}
-	IIC_Stop();
+	RTC_ISR_ALARM_IF_Clr();		//��������жϱ�־											
+	RTC_IER_ALARM_IE_Setable(ENABLE);//�������ж�	
+	RTC_ALARM_ALMEN_Setable(ENABLE);//���ӹ���ʹ��
 }
 
 
-
-void set_alarm(void)
-{
-
-
-#if 0
-	u8 alarm[5];
-	alarm[0] = 64;
-  alarm[1] = 0x00;  // Counter ?0x0500,?1280??,??64Hz???,??20S?????
-  alarm[2] = 0x19;  //??Time interrupt,FOUT ?1hz(????????), ??????64Hz?
-  alarm[3] = 0x00;   
-  alarm[4] = 0x50;  //??????2s(??),??Time interrupt
-  R8025AC_Write(0x0B,alarm,5);
-#endif
-	
-#if 1
-u8 alarm[5];
-alarm[0] = 0;    //B                                                    //??????             //??????
-alarm[1] = 0x00;  // Counter ?0x0500,?1280??,??64Hz???,??20S?????                                  //
-alarm[2] = 0x02;  //D??Time interrupt,FOUT ?1hz(????????), ??????64Hz?     00011001  19                  //00000010  02
-alarm[3] = 0x00;   //E                                                                             //00000000
-alarm[4] = 0x60;  //F??????2s(??),??Time interrupt                        01010000    50               //01100000    60
-R8025AC_Write(0x0B, alarm, 5);
-#endif
-
-#if 0
-/*����RTC�ж�*/
-u8 alarm[5];
-alarm[0] = 0;    //B                                                    //??????             //??????
-alarm[1] = 0x00;  // Counter ?0x0500,?1280??,??64Hz???,??20S?????                                  //
-alarm[2] = 0x02;  //D??Time interrupt,FOUT ?1hz(????????), ??????64Hz?     00011001  19                  //00000010  02
-alarm[3] = 0x00;   //E                                                                             //00000000
-alarm[4] = 0x40;  //F??????2s(??),??Time interrupt                        01010000    50               //01100000    60
-R8025AC_Write(0x0B, alarm, 5);
-#endif
-
-}
-
-
-
-// void set_peroid_alarm()
-// {
-// 	u8 alarm[4];
-// 	u8 sec_alarm;
-// 	u8 second;
-// 	//alarm[0] = 0x00;
-// 	Get_Time();
-// 	second	=	calendar.sec;
-// 	if(second < 58)
-// 	{
-// 		second = second + 2;
-// 	}else
-// 	{
-// 		second = second - 58;
-// 	}
-// 	sec_alarm = (second / 10)*16 + (second % 10);
-
-// 	alarm[0] = sec_alarm;
-//  	alarm[1] = 0x80;
-//  	alarm[2] = 0x80;
-//  	alarm[3] = 0x91;
-// 	I2C_Write(4,0x07,&alarm[0]);
-// 	I2C_Read(4,0x07);
-// 	
-// 	sec_alarm = 0x00;
-// 	I2C_Write(1,0x0f,&sec_alarm);
-// 	sec_alarm = 0x05;
-// 	I2C_Write(1,0x0e,&sec_alarm);
-// /*	while(1)
-// 	{
-// 		I2C_Read(1,0x0f);
-// 		delay_ms(1);
-// 	}*/
-// }
-
-
-// void set_peroid_alarm_rst()
-// {
-// 	u8 alarm[4];
-// 	u8 sec_alarm;
-// 	u8 second;
-// 	//alarm[0] = 0x00;
-// 	Get_Time();
-// 	second	=	calendar.sec;
-// 	if(second < 58)
-// 	{
-// 		second = second + 2;
-// 	}else
-// 	{
-// 		second = second - 58;
-// 	}
-
-// 	sec_alarm = (second / 10)*16 + (second % 10);
-
-// 	alarm[0] = sec_alarm;
-//  	alarm[1] = 0x80;
-//  	alarm[2] = 0x80;
-//  	alarm[3] = 0x80;
-// 	I2C_Write(4,0x07,&alarm[0]);
-// 	sec_alarm = 0x00;
-// 	I2C_Write(1,0x0f,&sec_alarm);
-
-// }
-
-
-
-void  Time_new_Set(u8 year,u8 month,u8 date,u8 week,u8 hour,u8 min,u8 sec)
-{
-	u8 time[7];
-
-	time[0]=((sec/10)<<4)|(sec%10);
-	time[1]=((min/10)<<4)|(min%10);
-	time[2]=((hour/10)<<4)|(hour%10);
-	time[3]=week;
-	time[4]=((date/10)<<4)|(date%10);
-	time[5]=((month/10)<<4)|(month%10);
-	time[6]=((year/10)<<4)|(year%10);
-  R8025AC_Write(0x00,time,7);
-}
-
-
-void  Time_Set(u16 year,u8 month,u8 date,u8 week,u8 hour,u8 min,u8 sec)
-{
-	u8 time[7];
-	year%=100;
-	time[0]=((sec/10)<<4)|(sec%10);
-	time[1]=((min/10)<<4)|(min%10);
-	time[2]=((hour/10)<<4)|(hour%10);
-	time[3]=week;
-	time[4]=((date/10)<<4)|(date%10);
-	time[5]=((month/10)<<4)|(month%10);
-	time[6]=((year/10)<<4)|(year%10);
-  R8025AC_Write(0x00,time,7);
-}
-
-void  BCD_time_Set(u8 year,u8 month,u8 date,u8 week,u8 hour,u8 min,u8 sec)
-{
-	u8 time[7];
-
-	time[0]=sec;
-	time[1]=min;
-	time[2]=hour;
-	time[3]=week;
-	time[4]=date;
-	time[5]=month;
-	time[6]=year;
-  R8025AC_Write(0x00,time,7);
-}
-
-
-
-void  Get_Time(void)
-{
-
-	R8025AC_Read(0x00,I2C_RECV_DATA,7);
-	
-	Time_BCD_g.year = I2C_RECV_DATA[6];
-	Time_BCD_g.month = I2C_RECV_DATA[5];
-	Time_BCD_g.day = I2C_RECV_DATA[4];
-	Time_BCD_g.hour = I2C_RECV_DATA[2];
-	Time_BCD_g.min = I2C_RECV_DATA[1];
-	Time_BCD_g.sec = I2C_RECV_DATA[0];
-	
-	
-	calendar.sec=((I2C_RECV_DATA[0]&0xf0)>>4)*10+(I2C_RECV_DATA[0]&0x0f);
-  calendar.min=((I2C_RECV_DATA[1]&0xf0)>>4)*10+(I2C_RECV_DATA[1]&0x0f);
-	calendar.hour=((I2C_RECV_DATA[2]&0xf0)>>4)*10+(I2C_RECV_DATA[2]&0x0f);
-	calendar.week=I2C_RECV_DATA[3];
-	calendar.date=((I2C_RECV_DATA[4]&0xf0)>>4)*10+(I2C_RECV_DATA[4]&0x0f);
-	calendar.month=((I2C_RECV_DATA[5]&0xf0)>>4)*10+(I2C_RECV_DATA[5]&0x0f);	
-  calendar.year=2000+((I2C_RECV_DATA[6]&0xf0)>>4)*10+(I2C_RECV_DATA[6]&0x0f);
-
-}
-
-
-
-
-
-void test_rtc(void)
-{
-//	u8 time_read[7];
-	
-	//����ʱ��
-//	Time_Set(2019,11,11,1,12,12,12);
-	while(1)
-	{
-		//Time_Set(2019,11,11,1,12,12,12);
-		delay_ms(888);
-
-//		Get_Time();
-	}
-	
-}

--
Gitblit v1.9.3