STM32F103单片机RTC结合time.h使用
扫描二维码
随时随地手机看文章
在使用stm32f103系列单片机的时候总是会碰到RTC计时的问题,103系列单片机的RTC使用的是秒计时
在经过一段时间的研究,终于发现了一种比较简单而且易于理解的使用方法,就是结合系统文件time.h的使用
首先要添加头文件
#include
RTC的初始化和普通方式无区别
u8RTC_Init(void){//检查是不是第一次配置时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外设时钟PWR_BackupAccessCmd(ENABLE);//使能后备寄存器访问if(BKP_ReadBackupRegister(BKP_DR1)!=0x5AA5)//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎{BKP_DeInit();//复位备份区域RCC_LSEConfig(RCC_LSE_ON);//设置外部低速晶振(LSE),使用外设低速晶振while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)//检查指定的RCC标志位设置与否,等待低速晶振就绪{}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟RCC_RTCCLKCmd(ENABLE);//使能RTC时钟RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成RTC_WaitForSynchro();//等待RTC寄存器同步RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能RTC秒中断RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成RTC_EnterConfigMode();//允许配置RTC_SetPrescaler(32767);//设置RTC预分频的值RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成Clock_SetTime(2015,1,14,17,42,55);//设置时间RTC_ExitConfigMode();//退出配置模式BKP_WriteBackupRegister(BKP_DR1,0x5AA5);//向指定的后备寄存器中写入用户程序数据}else//如果已配置过则不再进行配置{RTC_WaitForSynchro();//等待最近一次对RTC寄存器的写操作完成RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能RTC秒中断RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成}RTC_NVIC_Config();//RCT中断分组设置Clock_Get();//更新时间return0;}1234567891011121314151617181920212223242526272829303132333435
设置时间和读取时间采用结构体的方式
首先需要定义一个时间结构体
typedefstruct{vu8hour;vu8min;vu8sec;vu16w_year;vu8w_month;vu8w_date;}_calendar_obj;_calendar_objcalendar;//时钟结构体123456789101112
在设置时间时
oidClock_SetTime(u16syear,u8smon,u8sday,u8hour,u8min,u8sec){time_ttime_t_Set_Time;//定义time_t类型的设置时间结构体structtmtm_Set_Time;//定义tm结构的设置时间结构体tm_Set_Time.tm_year=(u32)(syear-1900);//从2000年开始算起tm_Set_Time.tm_mon=(u32)(smon-1);//月tm_Set_Time.tm_mday=(u32)sday;//日tm_Set_Time.tm_hour=(u32)hour;//时tm_Set_Time.tm_min=(u32)min;//分tm_Set_Time.tm_sec=(u32)sec;//秒time_t_Set_Time=mktime(&tm_Set_Time);//得到计数初值if(time_t_Set_Time!=0xFFFFFFFF){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);//使能PWR和BKP外设时钟PWR_BackupAccessCmd(ENABLE);//使能RTC和后备寄存器访问RTC_SetCounter(time_t_Set_Time);//设置RTC计数器的值RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成}}1234567891011121314151617181920212223
读取时间
voidClock_Get(void){structtm*local;time_tRTCTime;RTCTime=RTC_GetCounter();//获取当前RTC高字节local=localtime(&RTCTime);//把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地日历时间calendar.w_year=(u16)(local->tm_year+1900);//从1900年起calendar.w_month=(u16)(local->tm_mon+1);//月calendar.w_date=(u16)local->tm_mday;//日calendar.hour=(u16)local->tm_hour;//时calendar.min=(u16)local->tm_min;//分calendar.sec=(u16)local->tm_sec;//秒}123456789101112131415