如何快速操作RTC模块

   看到工程已经有rtc.c--MX打钩的
    我需要做的是BSPRTC 
    拷贝文件夹 Gbsp_rtc
    怎么使用?三元组
    初始化--没有必要了 因为有  MX_RTC_Init();即可
    没有后台--因为rtc_alarm_callback 没有写
    也就是直接用就可以!!test_rtc直接看看效果
    注意:里面内部调用的函数需要放到内部的rtc.c模块中

修改rtc。c  是增加 它只有init

我喂猫2个函数【前面的可以不看了】

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


#include "gunit.h"
//http://www.waveshare.net/study/article-652-1.html
///rtc.c   GKOSON ADD

//static uint8_t rtc_alarm_flag = 0;

void GRTC_GET(uint8_t* showtime)
{
    RTC_DateTypeDef sdatestructureget;
    RTC_TimeTypeDef stimestructureget;

    /* Get the RTC current Time */
    HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
    /* Get the RTC current Date */
    HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
    /* Display time Format : hh:mm:ss */
   
  //sprintf((char*)showtime,"%02d:%02d:%02d",stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
     printf("%02d:%02d:%02d\r\n",stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
     printf("%02d:%02d:%02d\r\n",sdatestructureget.Year, sdatestructureget.Month, sdatestructureget.Date);
     printf("--%02d--\r\n",sdatestructureget.WeekDay);
}

//__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
//void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
//{
//    rtc_alarm_flag++;   
//	  printf("\r\n\r\n\r\n%s %d\r\n\r\n\r\n",__FUNCTION__,rtc_alarm_flag);	
//}

//uint8_t RTC_TimeAlarm(void)
//{
//   return rtc_alarm_flag;
//}


//дRTC
//GRTC_SET(19,4,23,11,12,13,RTC_WEEKDAY_TUESDAY)
void GRTC_SET(uint8_t year , uint8_t mon , uint8_t day ,
             uint8_t hour , uint8_t min , uint8_t sec , uint8_t week)
{
	RTC_DateTypeDef sdatestructureget;
	RTC_TimeTypeDef stimestructureget;

	sdatestructureget.WeekDay=week;//RTC_WEEKDAY_TUESDAY;                         
	sdatestructureget.Month=mon;//RTC_MONTH_APRIL;                         
	sdatestructureget.Date=day;//23;                        
	sdatestructureget.Year=year;//19;   

	stimestructureget.Hours=hour;//11;          
	stimestructureget.Minutes=min;//12;        
	stimestructureget.Seconds=sec;//13;         
								

	if (HAL_RTC_SetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN) != HAL_OK)
	{
		Error_Handler();
	}
	if (HAL_RTC_SetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN) != HAL_OK)
	{
		Error_Handler();
	}

}






//类似 GRTC_GET
void hal_rtc_read(uint8_t *time)
{
	  RTC_DateTypeDef sTimeStampDateget;
    RTC_TimeTypeDef sTimeStampget;
    
    /* Get the RTC current Time */
    HAL_RTC_GetTime(&hrtc, &sTimeStampget, RTC_FORMAT_BIN);
    /* Get the RTC current Date */
    HAL_RTC_GetDate(&hrtc, &sTimeStampDateget, RTC_FORMAT_BIN);

		time[0]=sTimeStampDateget.Year;
		time[1]=sTimeStampDateget.Month;
		time[2]=sTimeStampDateget.Date;
		time[3]=sTimeStampget.Hours;
		time[4]=sTimeStampget.Minutes;
		time[5]=sTimeStampget.Seconds;
		time[6]=sTimeStampDateget.WeekDay;
    
}



void hal_rtc_set(uint8_t year , uint8_t mon , uint8_t day ,
                   uint8_t hour , uint8_t min , uint8_t sec , uint8_t week)
{
    RTC_DateTypeDef sDate;
    RTC_TimeTypeDef sTime;

    sTime.Hours = hour;
    sTime.Minutes = min;
    sTime.Seconds = sec;
    sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
    {
        Error_Handler();
    }

    sDate.WeekDay = week;
    sDate.Month = mon;
    sDate.Date = day;
    sDate.Year = year;

    if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    {
        Error_Handler();
    }
  
}
#ifndef __rtc_H
#define __rtc_H
#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

extern RTC_HandleTypeDef hrtc;

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void MX_RTC_Init(void);

/* USER CODE BEGIN Prototypes */

void hal_rtc_read(uint8_t *time);

void hal_rtc_set(uint8_t year , uint8_t mon , uint8_t day ,uint8_t hour , uint8_t min , uint8_t sec , uint8_t week);

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif
#endif /*__ rtc_H */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

 

 

#include "gbsp_rtc.h"
#include "rtc.h"

#include "gunit.h"



//1480494176
//时间戳 每年的起始值
const uint32_t gdwUnixTimeStampYear[100]=
{ 946656000, 978278400,1009814400,1041350400,1072886400,1104508800,1136044800,1167580800,1199116800,1230739200,//00-1-1 0:0:0 09-1-1 0:0:0
1262275200,1293811200,1325347200,1356969600,1388505600,1420041600,1451577600,1483200000,1514736000,1546272000,//10-1-1 0:0:0
1577808000,1609430400,1640966400,1672502400,1704038400,1735660800,1767196800,1798732800,1830268800,1861891200,//20-1-1 0:0:0
1893427200,1924963200,1956499200,1988121600,2019657600,2051193600,2082729600,2114352000,2145888000,2177424000,//30-1-1 0:0:0
2208960000,2240582400,2272118400,2303654400,2335190400,2366812800,2398348800,2429884800,2461420800,2493043200,//40-1-1 0:0:0
2524579200,2556115200,2587651200,2619273600,2650809600,2682345600,2713881600,2745504000,2777040000,2808576000,//50-1-1 0:0:0
2840112000,2871734400,2903270400,2934806400,2966342400,2997964800,3029500800,3061036800,3092572800,3124195200,//60-1-1 0:0:0
3155731200,3187267200,3218803200,3250425600,3281961600,3313497600,3345033600,3376656000,3408192000,3439728000,//70-1-1 0:0:0
3471264000,3502886400,3534422400,3565958400,3597494400,3629116800,3660652800,3692188800,3723724800,3755347200,//80-1-1 0:0:0
3786883200,3818419200,3849955200,3881577600,3913113600,3944649600,3976185600,4007808000,4039344000,4070880000//90-1-1 0:0:0
};
//100年最大时间戳
const uint32_t gdwUnixTimeMax=4102415990;//2099/12/31 23:59:50     4102415999;//2099/12/31 23:59:59
//每月的1日的 总天数
const uint16_t      gwUnixTimeStampMonth[12]={0, 31,59,90,120,151,181,212,243,273,304,334};
const static uint8_t no_leap_year[12]={6,2,2,5,0,3,5,1,4,6,2,4};//非闰年
const static uint8_t leap_year[12]={5,1,2,5,0,3,5,1,4,6,2,4};//闰年  
const static uint8_t no_leap_year_month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};//非闰年
const static uint8_t leap_year_month_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年  

unsigned char is_leap_year(unsigned char year)
{    
    if((year%4==0)&&(year!=0)) 
        return 1;  
    else 
        return 0; 
}

unsigned char RTC_Get_Day(unsigned char year,unsigned char month)
{
    return is_leap_year(year)?leap_year_month_day[month-1]:no_leap_year_month_day[month-1]; 
}

unsigned char get_week(unsigned char year,unsigned char month,unsigned char day)
{
    uint8_t temp;
    
    temp=is_leap_year(year)?leap_year[month-1]:no_leap_year[month-1]; 
    
    return ((day+temp+((year/4+year)%7))%7); 
}

void time_to_stamp(uint32_t *stamp,uint8_t *dt)//由日期时间 转成 时间戳
{
    if((*(dt+1)>0)&&(*(dt+1)<3))
    {
        *stamp = (((gwUnixTimeStampMonth[*(dt+1)-1] + 
                    (*(dt+2)-1))*24 + *(dt+3)) * 60 + 
                    *(dt+4)) * 60 + *(dt+5);
    }
    else
    {
        *stamp = (((gwUnixTimeStampMonth[*(dt+1)-1] + 
                    (*(dt+2)-1) + ((is_leap_year(*(dt+0)))?1:0))*24 + 
                   *(dt+3)) * 60 + *(dt+4)) * 60 + *(dt+5);
    }
    
    *stamp +=gdwUnixTimeStampYear[*(dt+0)];
}


void stamp_to_time(uint32_t *dwStamp,uint8_t *dt)//由 时间戳 转成 日期时间
{
    uint8_t i,j;
    uint16_t wUnixTimeStampMonth[12];
    uint32_t dwD;

    if(*dwStamp>gdwUnixTimeMax)//大于 2099/12/31 23:59:50
    {
        *(dt+0)=99;*(dt+1)=12;*(dt+2)=31;
        *(dt+3)=23;*(dt+4)=59;*(dt+5)=50;
    }
    else
    {
        for(i=0;i<100;i++)
        {
            if(gdwUnixTimeStampYear[i]>*dwStamp)
                break;
        }
        if(i==0)
        {
            for(j=0;j<6;j++)*(dt+i)=0;
                return;
        }
        else
        {
            *(dt+0)=i-1;

            if(is_leap_year(*(dt+0))==1)
            {
                for(j = 0 ; j < 2; j++)
                {
                    wUnixTimeStampMonth[j]=gwUnixTimeStampMonth[j];
                }
                for(j = 2; j < 12; j++)
                {
                    wUnixTimeStampMonth[j]=gwUnixTimeStampMonth[j]+1;
                }
            }
            else
            {
                for(j = 0; j < 12; j++)
                {
                    wUnixTimeStampMonth[j]=gwUnixTimeStampMonth[j];
                }
            }
            //printf("年:%d\r\n",*(dt+0));
            dwD=*dwStamp-gdwUnixTimeStampYear[i-1];
            //printf("dwD Zs=%d\r\n",dwD);
            *(dt+5)=dwD%60;
            //printf("dwD 秒=%d\r\n",*(dt+5));
            dwD=dwD/60;
            *(dt+4)=dwD%60;
            //printf("dwD 分钟=%d\r\n",*(dt+4));
            dwD=dwD/60;
            *(dt+3)=dwD%24;
            //printf("dwD 小时=%d\r\n",*(dt+3));
            dwD=dwD/24;
            //printf("dwD 天数=%d\r\n",dwD);
            for(i=0;i<12;i++)
            {
                if(wUnixTimeStampMonth[i]>dwD)
                    break;
            }
            *(dt+1)=i;
            *(dt+2)=(dwD-wUnixTimeStampMonth[i-1])+1;
        }
    }
}


void rtc_set_time( rtcTimeType *time)
{
    hal_rtc_set(time->year,time->mon,time->day,time->hour,time->min,time->sec ,time->week);
}


uint32_t rtc_read_stamp( void )
{
	uint32_t unix_stamp = 0;

	uint8_t dataTime[7];

	hal_rtc_read(dataTime);

	time_to_stamp(&unix_stamp , dataTime);

	return unix_stamp;
}

void rtc_read_time(rtcTimeType *time)
{
    uint8_t dataTime[7];
    
    hal_rtc_read(dataTime);
    
    time->year = dataTime[0];
    time->mon  = dataTime[1];
    time->day = dataTime[2];
    time->hour = dataTime[3];
    time->min = dataTime[4];
    time->sec = dataTime[5];
    time->week = dataTime[6];
   
}

uint32_t rtc_time_to_stamp(rtcTimeType *time)
{
    uint32_t unix_stamp = 0;
    uint8_t dataTime[7];
    
		dataTime[0] = time->year;
		dataTime[1] = time->mon;
		dataTime[2] = time->day;
		dataTime[3] = time->hour;
		dataTime[4] = time->min;
		dataTime[5] = time->sec;
		dataTime[5] = time->week;
    
    time_to_stamp(&unix_stamp , dataTime);

    printf("Input = 20%d-%02d-%02d %02d:%02d:%02d, output stamp =%ld\n" ,
                dataTime[0],dataTime[1],dataTime[2] ,dataTime[3],dataTime[4],dataTime[5] ,unix_stamp);    
    
    
    return unix_stamp;
}

void rtc_stamp_to_time(rtcTimeType *time ,uint32_t unix_stamp)
{
    uint8_t dataTime[7];


    stamp_to_time(&unix_stamp ,dataTime );
                 
    time->year = dataTime[0];
    time->mon = dataTime[1];
    time->day = dataTime[2];
    time->hour = dataTime[3];
    time->min = dataTime[4];
    time->sec = dataTime[5];

    time->week = get_week(time->year , time->mon , time->day);
    
    printf("Input stamp:%d ,out time:20%d-%02d-%02d %02d:%02d:%02d\n" ,unix_stamp,time->year,time->mon,time->day,
                                                     time->hour,time->min,time->sec);    
        
}


void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
		log_err("Rtc alarm\r\n");
		log_err("Rtc alarm\r\n");
		while(1);
}

void rtc_alarm_callback( void)
{

}

void rtc_set_time_form_stamp( uint32_t unix_stamp)
{
    rtcTimeType time;
    
    rtc_stamp_to_time(&time , unix_stamp);
    
    hal_rtc_set(time.year,time.mon,time.day,time.hour,time.min,time.sec,time.week);
}


rtcType    rtc=
{
    .set_time               = rtc_set_time,
    .set_time_form_stamp    = rtc_set_time_form_stamp,
    .read_stamp             = rtc_read_stamp,
    .read_time              = rtc_read_time,
    .time_to_stamp          = rtc_time_to_stamp,
    .stamp_to_time          = rtc_stamp_to_time,
};


void test_rtc(void)
{
	for(char i=0;i<2;i++)
	{
			//1--获得时间错
		    static uint32_t stamp=0;
			stamp = rtc.read_stamp();
			printf("stamp = rtc.read_stamp()=%08X\r\n",stamp);

            //2--获得时间结构体
			rtcTimeType time;
			rtc.read_time(&time);
			log_err("Time  =  20%02d-%02d-%02d %02d:%02d:%02d ,week:%d\r\n" ,
						time.year,time.mon,time.day,
						time.hour,time.min,time.sec,
						time.week);
				
			//3自己转化玩儿	
			stamp = 1559208020	;
			rtc.stamp_to_time(&time ,stamp );

				
            //4设置时间
			rtc.set_time_form_stamp(stamp);	
	}
}
#ifndef _GBSP_RTC_H_
#define _GBSP_RTC_H_

#include <stdint.h>


typedef struct
{
    uint8_t year;
    uint8_t mon;
    uint8_t day;
    uint8_t hour;
    uint8_t min;
    uint8_t sec;
    uint8_t week;
}rtcTimeType;

typedef struct
{
    void        (*set_time)                 (rtcTimeType *time);
    void        (*set_time_form_stamp)      (uint32_t unix_stamp);
	uint32_t    (*read_stamp)	            ( void );
	void        (*read_time)                (rtcTimeType *time);
    uint32_t    (*time_to_stamp)            (rtcTimeType *time);
    void        (*stamp_to_time)            (rtcTimeType *time ,uint32_t unix_stamp);
}rtcType;

extern void rtc_alarm_callback( void);

extern rtcType  rtc;

void test_rtc(void);

#endif



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值