STM32F103单片机RTC结合time.h使用
来源:互联网 发布:电脑无法安装软件 编辑:程序博客网 时间:2024/06/05 23:02
STM32F103单片机RTC结合time.h使用
在使用stm32f103系列单片机的时候总是会碰到RTC计时的问题,103系列单片机的RTC使用的是秒计时
在经过一段时间的研究,终于发现了一种比较简单而且易于理解的使用方法,就是结合系统文件time.h的使用
首先要添加头文件 #include <time.h>
RTC的初始化和普通方式无区别
u8 RTC_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(); //更新时间 return 0;}
设置时间和读取时间采用结构体的方式
首先需要定义一个时间结构体
typedef struct { vu8 hour; vu8 min; vu8 sec; vu16 w_year; vu8 w_month; vu8 w_date;}_calendar_obj;_calendar_obj calendar;//时钟结构体
在设置时间时
oid Clock_SetTime(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec){ time_t time_t_Set_Time; //定义time_t类型的设置时间结构体 struct tm tm_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寄存器的写操作完成 }}
读取时间
void Clock_Get(void){ struct tm *local; time_t RTCTime; 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; //秒}
打开秒中断
void RTC_IRQHandler(void){ if (RTC_GetITStatus(RTC_IT_SEC) != RESET) //秒钟中断 { Clock_Get();//更新时间 } RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);//清闹钟中断 RTC_WaitForLastTask(); }
1 0
- STM32F103单片机RTC结合time.h使用
- stm32f103 rtc日历
- stm32f103 rtc 获取 日历 时钟
- STM32F103单片机使用PA13,PA14引脚的一些问题
- RTC与Maven Release Plugin结合使用遇到的问题
- stm32f103 RTC周期性待机唤醒(一)
- stm32f103 RTC周期性待机唤醒(一)
- STM32F103系列RTC晶振问题解决记录
- 一种可行的STM32F103外设RTC使用方法
- stm32f103 RTC周期性待机唤醒(一)
- Linux time rtc
- 【程序】STM32F103单片机使用定时器DMA进行全自动8位数码管动态扫描
- time.h的使用(转载的)
- time.h
- time.h
- time.h
- time.h
- time.h
- CMakeList配置之编译多个.cpp文件
- 每天一个小题目——翻转数组
- mysql数据库主从同步
- DB2缓冲池、表空间详解
- log4j 输入日志文件入门
- STM32F103单片机RTC结合time.h使用
- 微信jssdk config:invalid signature 签名错误 ,问题排查过程
- OVERLAPPED详解
- 小硅片与大数据的结合 ——协鑫光伏的新制造之路
- Skinned Mesh 原理解析和一个最简单的实现示例
- hive错误锦集
- arcgis api for javascript 自动适应网站
- 苏州协鑫与阿里云合作阶段性完成,良品率已提升1%
- Android|图形图像之Volley