基于STM32内部RTC的时钟程序

发布者:LovingLife2023最新更新时间:2015-07-30 来源: eefocus关键字:STM32  内部RTC  时钟程序 手机看文章 扫描二维码
随时随地手机看文章
在网站上找了一些软件时钟程序,在秒时与日历转换时,大多是逐年计算,计算周期会随着年份增加,而增多。于是自己写了一个简化的秒时与日历转换程序,按闰年周期进行除法运算,计算周期固定,不随秒时与基础年时间差增长而增长,效率明显提高。

程序带有闰年计算与星期计算,基础年为2001年1月1日0时0分0秒,算法可支持到3200年2月28日23时59分59秒。但由于RTC计数器是32位,所以硬件只能支持到2137年2月7日6时28分15秒,也足够使用了。

以下为程序代码:

/****************************************************************************
* 函数名: GetRTCWeek
* 功  能: 计算Week
* 输  入: 秒时
* 输  出: 无.
* 返  回: 星期
*/
//u8 GetRTCWeek(RTC_T *_tRtc)
u8 GetRTCWeek(u32 lDay)
{
 //u32 lDay;
 //lDay = GetSecondFromDateTime(_tRtc)/SECOND_OF_DAY;
 lDay /= SECOND_OF_DAY;
 lDay += RTC_BASE_WEEK;
 lDay %= 7;
 return (u8)lDay;
}

/****************************************************************************
* 函数名: GetSecondFromDateTime
* 功  能: 基于2001/1/1/00:00:00的日期计算秒时 
* 输  入: RTC_T 日期时间结构体
* 输  出: 无.
* 返  回: 秒时
*/
uint32_t GetSecondFromDateTime(RTC_T *_tRtc)
{
 u32 y,sec,fy;
 const u32 *ptr;
 y = (u32)((_tRtc->year - (u16)RTC_BASE_YEAR)&0x0000FFFF);
 fy = y / 4;
 sec = fy * DAY_OF_FOURYEAR;
 if(y/100){//百年不润
      sec -= y/100;
 }
 if(y/400){//四百年再润
      sec += y/400;
 }
 y %= 4;
 sec += y * DAY_OF_YEAR;
 ptr = DayOfCurrentMonthNormal;
 if(y == 3 && _tRtc->month > 2 && IsRTCLeapYear(_tRtc->year)){//当前年为润年,并且月份已过2月,天数加1
      ptr = DayOfCurrentMonthLeap;
   }
 sec += ptr[_tRtc->month]; 
 sec += _tRtc->day - 1;
 sec *= 24;
 sec += _tRtc->hour;
 sec *= 60;
 sec += _tRtc->minute;
 sec *= 60;
 sec += _tRtc->second;
 return sec;
}

/****************************************************************************
* 函数名: GetDateTimeFromSecond
* 功  能: 由秒时计算基?001/1/1/00:00:00的日期
* 输  入: RTC_T 日期时间结构体
* 输  出: 无.
* 返  回: 无
*/
void GetDateTimeFromSecond(u32 lSec, RTC_T *_tRtc)
{
   uint16_t y,m;
   u32 lDay;
 const u32 *ptr;
   
   lDay = lSec / SECOND_OF_DAY;        /* 转为基于天的时间 */
 _tRtc->year = RTC_BASE_YEAR;//基数年份
 y = lDay / DAY_OF_FOURYEAR;
 y *= 4;
 _tRtc->year += y;
 lDay %= DAY_OF_FOURYEAR;
 if(y/100){//百年不润
  lDay += y/100;
 }
 if(y/400){//四百年再润
  lDay -= y/400;
 }
 y = lDay / DAY_OF_YEAR;
 _tRtc->year += y;  /* 得到年份 */
 lDay %= DAY_OF_YEAR;
 ptr = DayOfCurrentMonthNormal;
 if(y == 3 && IsRTCLeapYear(_tRtc->year)){//当前年为润年,并且月份已过2月,天数加1
  ptr = DayOfCurrentMonthLeap;
 }
 for(m=12;m>1;m--){    /* 查询月份 */
  if(lDay >= ptr[m]) {
   lDay -= ptr[m];
   break;
  }
 }
 _tRtc->month = m;
 _tRtc->day  = lDay+1;
 _tRtc->week = GetRTCWeek(lSec);
 
 lSec = lSec % SECOND_OF_DAY;
 _tRtc->hour = lSec / SECOND_OF_HOUR;
 lSec %= SECOND_OF_HOUR;
 _tRtc->minute  = lSec / SECOND_OF_MINUTE;
 _tRtc->second  = lSec % SECOND_OF_MINUTE; 
}

关键字:STM32  内部RTC  时钟程序 引用地址:基于STM32内部RTC的时钟程序

上一篇:STM32-学习
下一篇:基于单片机的DES加密解密算法C源码

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

stm32 GPIO的8种工作模式
上图的最右端为I/O引脚,左端的器件位于芯片内部。I/O并联了两个用于保护的二极管。 注:部分图片内容来自《STM32库开发实战指南》
[单片机]
<font color='red'>stm32</font> GPIO的8种工作模式
stm32小容量、中容量和大容量产 在选择启动文件时该怎么选
如下图所示,根据flash 的大小将芯片分为大容量 中容量 小容量 可以想象 ,对应的启动文件肯定也分为大容量 中容量 小容量 来看看3.5 的标准库自带的启动文件 根据字面意思, hd(High Density )是大容量, md(Medium Density ) 是中容量 ld (Low Density ) 是小容量 可是启动不止三个,大中小之外还有后面跟vl后缀的 并且还有后缀cl 和 xl 的文件。 解释一下 CL:connective line 指的是互联型产品 stm32f105xx和stm32f107xx 系列 Xl :extreme line 超高密度型 产品 这种应该
[单片机]
<font color='red'>stm32</font>小容量、中容量和大容量产 在选择启动文件时该怎么选
如何构建STM32单片机keil的开发环境
新建工程 工程名设为stm32_demo,选择芯片型号为STM32F103B,如图, 因为下载的STM32库中有启动代码,所以这里选择“否”,不拷贝启动代码。 在工程文件下,新建Startup、Headers、User、Libraries、CMSIS、Lists、Output文件夹。 文件夹 用途 Startup 启动文件,Flash在16~32Kb小容量,64~128Kb中容量,256~512Kb大容量 CMSIS Cortex微控制器软件接口标准文件,该目录下文件适用所有Cortex系列 Libraries 存放STM32的驱动库文件 Headers 自定义的全局头文件 User 用户文件,我们把main.c放在该目录
[单片机]
如何构建<font color='red'>STM32</font>单片机keil的开发环境
STM32的低功耗设计
在谈到低功耗处理器时,我们第一个想到的总是MSP430,但其实STM32也能拥有不错的低功耗特性。通过合理的进行软件设置,STM32在工作时的功耗可以降至数十mA,而待机功耗可以降到数uA。总的来说,降低STM32功耗的方法主要有以下三种: 1. 关闭不需要的外设时钟 STM32的所有外设都可以独立开启和关断,通过将不需要的AHB/APB的时钟关闭,可以起到降低总待机功耗的作用。各个模块的典型功耗如下所示: Figure 1. APB1外设的典型功耗 Figure 2. APB2外设的典型功耗 2. 降低主时钟的工作频率 对数字电路而言,功耗是与主频呈正比的。在进行一般任务时主动降低功耗,在需要高性能运算时再恢复到
[单片机]
<font color='red'>STM32</font>的低功耗设计
STM32 关于复位类型的判断及软件复位 bug
STM 32在复位时,有严重BUG: 1.上电复位和外置的看门狗芯片重启复位是无法区分开来的!RCC_FLAG_BORRST, RCC_FLAG_PINRST, RCC_FLAG_LPWRRST三个都复位了! 2.这样当要在上电复位初始化关键代码时,这些代码看门狗复位则不用重启,这个关键代码会导致应用业务的异常!若两个中断分不开,导致系统异常看门狗复位时影响业务! /* RCC_FLAG_BORRST: POR/PDR or BOR reset //Power-on/power-down reset (POR/PDR reset) or brownout (BOR) reset RCC_FLAG_PINRST: P
[单片机]
stm32时钟选择与配置HSL HSE PLL
1. stm32时钟源分析 stm32f4有四个时钟源可供选择,分别是: HSE(外部高速),HSI(内部高速), LSE(外部低速), LSL(内部低速)。 1.1 外部时钟源一般由外挂晶振产生 LSE为32.767KHz晶振输入。 HSE为8MHz或16MHz,实验用的是16MHz 1.2 内部时钟源一般为内部RC震荡电路 LSI 为内部32.767KHz的RC电路 HSI 为内部16MHz的RC电路 2. stm32时钟源配置  四个时钟源中,只有HSI和HSE能作为整个系统的时钟源,LSI和LSE只作为看门狗,RTC及外部输出的时钟源。  HSI和HSE频率都不高,所以ARM设计了PLL(锁相环)来进行倍频,把
[单片机]
<font color='red'>stm32</font><font color='red'>时钟</font>选择与配置HSL HSE PLL
基于STM32的IAP升级程序分享
因为之前写个STM32的IAP升级程序,所以我总结了做IAP升级的三个主要的难点: 1、如何设置中断向量,也就是说中断向量的重定向 2、如何配置程序的起始地址 3、如何从IAP跳转到APP程序 4、使用库函数要注意的地方(防止被坑) 说文章的时候我已经完成了一个最简单的IAP升级程序,可以通过串口接收bin文件写入到flash里面,然后再运行。 1、如何设置中断向量,也就是说中断向量的重定向 STM8不像STM32那样有个一寄存器管理着中断向量的地址,所以STM32的中断可以任意设置(符合要求的情况之下),但是STM8的中断向量表是固定的 在0X8000地址,不能修改,所以BOOT区不能开中断,否则会和APP区的中断打架,但是
[单片机]
基于<font color='red'>STM32</font>的IAP升级<font color='red'>程序</font>分享
STM32 SysTick中断使用方法
SysTick中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在汇编文件中已经给出定义,直接到文件中查找即可。 本来NVIC提供了中断使能的函数,但是要求中断号要大于0(Value cannot be negative.),所以就不能调用NVIC中断使能函数了,直接在操作寄存器开启中断就可以了。 修改如下: #include delay.h #include led.h void Systick_Delayus
[单片机]
<font color='red'>STM32</font> SysTick中断使用方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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