STM32F4 RTC日历和Count转换

发布者:ularof不加糖最新更新时间:2022-07-14 来源: csdn关键字:STM32F4  RTC日历 手机看文章 扫描二维码
随时随地手机看文章

虽然F4硬件自带了日历功能,可以直接读年月日,但有些场合使用计数值存储还是更方便。


这里根据正点原子F1中RTC例程的年月日转换,写了适用于F4的RTC日历转计数值。


两个函数的声明:


uint32_t RTC_DataToCnt(RTC_TimeTypeDef RTC_TimeStruct,RTC_DateTypeDef RTC_DateStruct);

void RTC_CntToData(uint32_t RTC_Count,RTC_TimeTypeDef* RTC_TimeStruct,RTC_DateTypeDef* RTC_DateStruct);


函数实现内容:


const u8 mon_table[12]= {31,28,31,30,31,30,31,31,30,31,30,31};

//判断是否是闰年函数

//月份   1  2  3  4  5  6  7  8  9  10 11 12

//闰年   31 29 31 30 31 30 31 31 30 31 30 31

//非闰年 31 28 31 30 31 30 31 31 30 31 30 31

//输入:年份

//输出:该年份是不是闰年.1,是.0,不是

u8 Is_Leap_Year(u16 year)

{

    if(year%4==0) //必须能被4整除

    {

        if(year%100==0)

        {

            if(year%400==0)return 1;//如果以00结尾,还要能被400整除

            else return 0;

        } else return 1;

    } else return 0;

}


//

uint32_t RTC_DataToCnt(RTC_TimeTypeDef RTC_TimeStruct,RTC_DateTypeDef RTC_DateStruct)

{

    u16 t;

    u32 seccount=0;

    for(t=0; t //把所有年份的秒钟相加

    {

        if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数

        else seccount+=31536000;   //平年的秒钟数

    }

    RTC_DateStruct.RTC_Month-=1;

    for(t=0; t //把前面月份的秒钟数相加

    {

        seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加

        if(Is_Leap_Year(RTC_DateStruct.RTC_Year)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数

    }

    seccount+=(u32)(RTC_DateStruct.RTC_Date-1)*86400;//把前面日期的秒钟数相加

    seccount+=(u32)RTC_TimeStruct.RTC_Hours*3600;//小时秒钟数

    seccount+=(u32)RTC_TimeStruct.RTC_Minutes*60; //分钟秒钟数

    seccount+=RTC_TimeStruct.RTC_Seconds;//最后的秒钟加上去


    return seccount;

}


//

void RTC_CntToData(uint32_t RTC_Count,RTC_TimeTypeDef* RTC_TimeStruct,RTC_DateTypeDef* RTC_DateStruct)

{

    static u16 daycnt=0;

    u32 timecount=0;

    u32 temp=0;

    u16 temp1=0;

    timecount=RTC_Count;

    temp=timecount/86400;   //得到天数(秒钟数对应的)

    if(daycnt!=temp)//超过一天了

    {

        daycnt=temp;

        temp1=0; //从1970年开始 //从0年开始

        while(temp>=365)

        {

            if(Is_Leap_Year(temp1))//是闰年

            {

                if(temp>=366)temp-=366;//闰年的秒钟数

                else {

                    temp1++;

                    break;

                }

            }

            else temp-=365;   //平年

            temp1++;

        }

        RTC_DateStruct->RTC_Year=temp1;//得到年份

        temp1=0;

        while(temp>=28)//超过了一个月

        {

            if(Is_Leap_Year(RTC_DateStruct->RTC_Year)&&temp1==1)//当年是不是闰年/2月份

            {

                if(temp>=29)temp-=29;//闰年的秒钟数

                else break;

            }

            else

            {

                if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年

                else break;

            }

            temp1++;

        }

        RTC_DateStruct->RTC_Month=temp1+1; //得到月份

        RTC_DateStruct->RTC_Date=temp+1;  //得到日期

    }

    temp=timecount%86400;      //得到秒钟数

    RTC_TimeStruct->RTC_Hours=temp/3600;      //小时

    RTC_TimeStruct->RTC_Minutes=(temp%3600)/60; //分钟

    RTC_TimeStruct->RTC_Seconds=(temp%3600)%60; //秒钟

    return ;

}


简单的测试程序,其中rtc_update_flag在RTC中断中赋值的,用于更新后打印。


 while(1)

    {

        if(rtc_update_flag==1)

        {

            rtc_update_flag=0;

            RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);

            RTC_GetDate(RTC_Format_BIN,&RTC_DateStruct);


            sprintf((char*)tbuf,"read  :%02d:%02d:%02d-%02d:%02d:%02drn",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date,

                    RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);

            printf("%s",tbuf);

            rtc_cnt=RTC_DataToCnt(RTC_TimeStruct,RTC_DateStruct);

            RTC_CntToData(rtc_cnt,&RTC_TimeStruct1,&RTC_DateStruct1);


            sprintf((char*)tbuf,"update:%02d:%02d:%02d-%02d:%02d:%02drn",RTC_DateStruct1.RTC_Year,RTC_DateStruct1.RTC_Month,RTC_DateStruct1.RTC_Date,

                    RTC_TimeStruct1.RTC_Hours,RTC_TimeStruct1.RTC_Minutes,RTC_TimeStruct1.RTC_Seconds);

            printf("%s",tbuf);


        }

    }


打印结果如下:

在这里插入图片描述

关键字:STM32F4  RTC日历 引用地址:STM32F4 RTC日历和Count转换

上一篇:RT-Thread 自动初始化机制
下一篇:stm32设置MAC地址设置建议

推荐阅读最新更新时间:2024-11-11 16:14

基于STM32F407的FatFs文件系统在SD卡驱动上的移植
最近在做SD卡驱动,以前移植过efsl,觉得用的人不是很多,现在移植个FatFs,也跟上队伍。 第一步,保证SD卡底层驱动函数正确,包括SD卡初始化、SD扇区读写等。 第二步,下载FatFs源码,名为ff9b.zip,解压在src文件夹中可以得到diskio.c、ff.c、以及\option\cc936.c这三个源码文件,在STM32F407工程文件中创建FatFs文件夹,加入这几个源码以及相应头文件,并且在系统Include Path中加入这个文件夹的位置,以编译时找到其头文件。 第三步开始移植。diskio.c这个文件中定义了fatfs文件系统与硬件存储器之间的接口函数,供文件系统调用,包
[单片机]
第7章 STM32F429下载和调试方法(IAR8)
7.1 初学者重要提示 如果使用JLINK调试下载STM32F429,可以使用JLINK V8,V9和V10。 如果使用STLINK调试下载STM32F429,推荐使用最新的电脑端驱动和对应的固件,详情见第2章的2.6小节。 JLINK无法下载解决思路以及常见问题整理,适用于其它LINK:http://www.armbbs.cn/forum.php?mod=viewthread&tid=21708 。 7.2 使用IAR调试和下载程序设置(JLINK) 调试下载STM32F429,可以使用JLINK V8,V9和V10,JLINK的驱动安装等相关文件已经在本教程第2章的2.5章节有说明 在上个章节里面,我们已经
[单片机]
第7章 <font color='red'>STM32F4</font>29下载和调试方法(IAR8)
STM32F407的GPIO操作
/* #include stm32f4_discovery.h #include stm32f4xx_conf.h uint32_t Gb_TimingDelay; void Delay(uint32_t nTime); void main( ) { SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断 RCC- AHB1ENR |= 0x00000008; //使能GPIOD 时钟 RCC- APB2ENR |= (1 14); //使能syscfg 时钟 GPIOD- MODER &= 0x00FFFFFF; //设置PD12,13,14,
[单片机]
STM32开发笔记48:STM32F4+DP83848以太网通信指南系列(二):系
本章为系列指南第二章,主要是介绍一下STM32F4的时钟配置。时钟是一个嵌入式产品从零开始开发的基石,一切逻辑都在时钟的节奏中安静地弹奏着,时钟为整个电路带来了欢快的「心跳」。开发者如果对时钟没有控制能力,就会把脉不准整个旋律的节奏,从而导致诸如通信波特率、通信时序、延时操作等关键功能全都紊乱,系统的构建也就无从谈起。 时钟如此重要,那么普通开发者,需要对时钟有多深的认知呢?STM32F4的时钟配置到底复不复杂?几行代码能搞定? 不要着急,我下面将用最简单的白话文来剖析STM32的时钟系统。不过在这之前,我们应该先吃一颗定心丸,因为在STM32中配置时钟是非常简单的,简单到我们甚至不需要写一行代码就能配置好,因为从标准库3.5版本
[单片机]
STM32开发笔记48:<font color='red'>STM32F4</font>+DP83848以太网通信指南系列(二):系
stm32f4中通过dma采集adc
环境: 主机:WIN8 开发环境:MDK5.13 MCU:STM32F407IGH 源代码: drv_power.h /********************************************************************* * 电源模块驱动层头文件 * (c)copyright 2015,jdh * All Right Reserved *新建日期:2014/10/20 by jdh *修改时间:2015/3/2 by jdh *****************************************************************
[单片机]
UCOSII在STM32F407上的移植
1、ucosii移植准备工作 1.1准备基础工程: 移植的时候需要一个基础工程,为了方便起见我们就选取跑马灯实验,作为ucossii移植的基础工程。 1.2Ucossii源码: 1)Micrium官网下载 2)开发板光盘自带 2、Ucossii移植步骤 1)step1 在基础工程文件夹中先建立UCOSII文件夹,然后在基础工程中UCOSII下建立相应的文件夹:CONFIG、CORE和PORT。 2)step2 向core文件夹中添加文件, 3)step3 向CONFIG文件夹中添加文件, 4)step4 向PORT文件件中添加文件, 5)step5 将Ucosii源码添加到工程中,打开工程,选择 新建三个分组:
[单片机]
UCOSII在<font color='red'>STM32F4</font>07上的移植
stm32f407】库函数
本文通过简单介绍 STM32库的各个文件及其关系,让读者建立 STM32库的概念,看完后对库有个总体印象即可 1. 1.1什么是 STM32 库? 在 51单片机的程序开发中,我们直接配置 51单片机的寄存器,控制芯片的工作方式,如中断,定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1还是置 0。这些都是很琐碎的、机械的工作,因为 51单片机的软件相对来说较简单,而且资源很有限,所以可以直接配置寄存器的方式来开发。STM32库是由 ST公司针对 STM32提供的函数接口,即 API(Application Program Interface),开发者可调用这些函数接口来配置STM
[单片机]
【<font color='red'>stm32f4</font>07】库函数
STM32F407 USB虚拟双串口
准备工作 通过STM32CubeMX生成一份标准的USB VCP例程. 代码修改 端点配置修改 增加第二个虚拟串口用到的端点配置,一个虚拟串口需要用到3个非0端点(2个bulk和一个interrupt) 设置增加端点的FIFO 注意 : 这里的FIFO大小的设置有一定的讲究,否则会导致一些异常,如将端点1和端点3的FIFO大小都设置为0x80则会导致某一个虚拟串口的数据会乱码显示 在参考的文章中发现这里为新增的端点设置内存时,有的为端点2和端点3设置FIFO,有的为端点3和端点4设置FIFO.测试发现:实际这里只需要为端点3设置FIFO. 为新增的端点增加初始化操作 描述符修改 将设备描述符修改为复合设备描述符
[单片机]
<font color='red'>STM32F4</font>07 USB虚拟双串口
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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