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

发布者:岭南布衣最新更新时间:2017-09-27 来源: eefocus关键字: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;
}1234567891011121314151617181920212223242526272829303132333435

设置时间和读取时间采用结构体的方式 
首先需要定义一个时间结构体

typedef struct {
    vu8 hour;
    vu8 min;
    vu8 sec;            
    vu16 w_year;
    vu8  w_month;
    vu8  w_date;
}_calendar_obj;


_calendar_obj calendar;//时钟结构体                   123456789101112

在设置时间时

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寄存器的写操作完成
    }
}1234567891011121314151617181920212223

读取时间

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;          //秒}123456789101112131415

打开秒中断

void RTC_IRQHandler(void)
{        
    if (RTC_GetITStatus(RTC_IT_SEC) != RESET)   //秒钟中断
    {                           
        Clock_Get();//更新时间   
    }
    RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);//清闹钟中断
    RTC_WaitForLastTask();                                           
}123456789
关键字:STM32F103  单片机  RTC  time.h 引用地址:STM32F103单片机RTC结合time.h使用

上一篇:STM32F103控制ADS1115采集模拟信号
下一篇:使用STM32 HAL库读取RTC时间芯片SD3088

推荐阅读最新更新时间:2024-03-16 15:38

飞思卡尔单片机MC9S12XEP100中断优先级设置
#include MC9S12XEP100.h void Interrup_priority(void) { //INT_CFADDR:Interrupt Request Configuration Address Register //INT_CFDATA0-7:Interrupt Request Configuration Data Registers INT_CFADDR = 0xD0; //选择中断所在的组别,0xD0,D表示组别 INT_CFDATA2 = 7; //选择该组别中的第2个中断,串口1,设置其优先级为
[单片机]
PIC单片机驱动LCD模块的设计
偏置电压是通过使用外部梯形电阻网络(电路见下图)而产生。因为梯形电阻网络连接在VDD和Vss之间,所以会有电流通过梯形电阻网络,电流大小与电阻成反比。也就是说,电阻越大,通过梯形电阻网络的电流就越小。如果使用10kΩ电阻,且VDD=5V,则梯形电阻网络将不断消耗166μA的电流。这对于一些使用电池供电的应用来说是很大的电流。 如何最大程度增大电阻,而又不会对显示质量产生负面影响?一些基本的电路分析可以帮助确定梯形网络中电阻增大的程度。 LCD模块实际上就是一个模拟多路开关,它交替地将LCD电压连接到各个段和公共引脚(段电极和公共电极交叉于每一个LCD像素点)。LCD像素可用电容进行模拟。梯形电阻网络中的每个分接点可以用戴维
[单片机]
PIC<font color='red'>单片机</font>驱动LCD模块的设计
解决EMC单片机多次烧录的办法
一般来说,EMC的OTP类型芯片是只能进行一次烧录的。但是如果在第一次烧录时,某一位为被烧为“1”,则该位可以再次被烧录成“0”;反之,如果已经被烧录成“0”了,则无法再次烧录成“1”。由此,有人发现了以下文章中介绍的这种多次烧录OTP芯片的方法。 在EMC单片机中,“ADD A,@0xFF”的机器码为全1。在下面这篇文章中,介绍的是用“ADD A,@0xFF”指令来预填,方便下次的改写。其实,还有更方便的办法: 文中提到的办法如下 ORG 0X000 ADD A,@0XFF ADD A,@0XFF ADD A,@0XFF ADD A,@0XFF ADD A,@0XFF ADD A,@0XFF ADD A,@0XFF MAIN
[单片机]
基于单片机的带温度显示的电子钟
单片机源程序如下: /* ******************************************************************************* * 《手把手教你学51单片机(C语言版)》 * 配套 KST-51 单片机开发板 示例源代码 * * 文件名:main.c * 描 述:第16章 作业题4 带温度显示的电子钟 * 版本号:v1.0.0 * 备 注:在lesson15_3基础上添加温度,温度显示在第二行右端,原时间位置相应左移 ***********************************************************
[单片机]
基于<font color='red'>单片机</font>的带温度显示的电子钟
基于MSP430单片机的微功耗中文人机界面设计
  在现代便携式智能仪器或手持设备中,中文人机界面成为一种事实上的行业标准。能显示汉字的图形点阵液晶和可输入数字的小键盘已成为智能设备必不可少的组成部分。同时作为便携式设备基本要求的低功耗特性也贯穿于中文人机界面的设计始终。   这种低功耗中文人机交互界面需要设计者在选取MCU和具体元器件上有特殊考虑。微功耗、小体积应作为选择相关器件的首要要求。   设计中,笔者采用MSP430F149单片机作为系统的MCU,通过选择合适的液晶显示模块在3V电平构建了一个低功耗的中文人机界面。此中文人机界面构成了微功耗数据采集系统的重要组成部分。 一、MSP430系列FLASH型单片机的微功耗特点   德州仪器公司(TI)推出的MSP43
[单片机]
单片机定时计数器电路设计
如果你有一个定时器,在你设定的时间到达时提醒你,你就再也不用担心忘记了煤气灶上煮的东西,使东西煮糊了或者水烧干了;午睡睡过了头了。本文介绍一个用AT89C205l单片机制作的倒计数定时器,可在1~99分钟内设置定时时间,时间到达时会用嘟、嘟的报警声提醒你,在定时过程中用数码管显示剩余的时间。 电路工作原理: 倒计数 定时器 电路见图.电路由单片机电路、数码显示电路和报警电路等部分组成。   AT89C2051、X1、R1、C1等组成单片机电路,Rl、C1组成单片机的复位电路,接通电源的瞬间,由于电源电压通过对C1的充电过程,单片机AT89C2051的复位端1脚获得一个高电平复位脉冲,使得单片机进入初始状态。
[单片机]
<font color='red'>单片机</font>定时计数器电路设计
PIC18F458单片机休眠状态工作方式与激活
/*该程序实现PIC18F458的休眠状态工作方式,并由实验板上的按键产生"电平变化中断"将其从休眠状态中激活。休眠与激活的状态由与D口相连的8个LED显示。休眠时高4个 LED发光,低4个LED熄灭; 激活以后高4个LED熄灭,低4个LED发光*/ #include "p18f458.h" unsigned long i; /*系统初始化子程序*/ void initial() { INTCON=0x08; /*全局中断禁止,"电平变化中断"只执行唤醒功能*/ /*清除B口电平变化中断标志*/ TRISA=0x00; /*A口设置为输出*/ TRISB=0XF0; /*RB1输出,RB4输入*/ TRISD=0
[单片机]
单片机上实现动态加载功能
本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的一些宏定义 /common/dl_
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved