STM32F103单片机RTC结合time.h使用

您所在的位置:网站首页 单片机中的rtc STM32F103单片机RTC结合time.h使用

STM32F103单片机RTC结合time.h使用

2024-06-30 14:56:50| 来源: 网络整理| 查看: 265

STM32F103单片机RTC结合time.h使用

在使用stm32f103系列单片机的时候总是会碰到RTC计时的问题,103系列单片机的RTC使用的是秒计时

在经过一段时间的研究,终于发现了一种比较简单而且易于理解的使用方法,就是结合系统文件time.h的使用 首先要添加头文件 #include 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(); }


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭