您的位置 首页 系统

根据STM32单片机秒中止源和闹钟中止源的解决方案

基于STM32单片机秒中断源和闹钟中断源的解决方案-在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。所有使用UNIX时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。这种时间表示法在类Unix(Unix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。

“RTC”是Real TIme Clock 的简称,意为实时时钟STM32供给了一个秒中止源和一个闹钟中止源。

RTC的技能器是一个32位的计数器,运用32.768khz的外部晶振

2038年问题

核算机应用上,2038年问题可能会导致某些软件在2038年无法正常作业。一切运用UNIX时刻表明时刻的程序都将受其影响,因为它们以自1970年1月1日通过的秒数(疏忽闰秒)来表明时刻。这种时刻表明法在类Unix(Unix-like)操作体系上是一个规范,并会影响以其C编程言语开发给其他大部份操作体系运用的软件。

根据STM32单片机秒中止源和闹钟中止源的解决方案

在大部份的32位操作体系上,此“TIme_t”数据方式运用一个有正负号的32位元整数(signedint32)存储核算的秒数。也就是说最大能够计数的秒数为 2^31次方 能够算得:

2^31/3600/24/365 ≈ 68年

所以依照此“TIme_t”规范,在此格局能被表明的最终时刻是2038年1月19日03:14:07,星期二(UTC)。超越此一瞬间,时刻将会被掩盖(wrap around)且在内部被表明为一个负数,并形成程序无法作业,因为它们无法将此时刻识别为2038年,而可能会依单个实作而跳回1970年或1901年。

关于PC机来说,时刻开始于1980年1月1日,并以无正负符号的32位整数的方式按秒递加,这与UNIX时刻十分相似。能够算得:

2^32/3600/24/365 ≈ 136年

到2116年,这个整数将溢出。

Windows NT运用64位整数来计时。可是,它运用100纳秒作为增量单位,且时刻开始于1601年1月1日,所以NT将遇到2184年问题。

苹果公司声明,Mac在29,940年之前不会呈现时刻问题!

因为RTC是一个32位计数器,相同其计时时刻是有限的。库函数中运用到了C规范时刻库,时刻库中的计时开始时刻是1900年,能够知道时刻库中不是用 有符号位的32位整数来表明时刻的,否则在1968年就现已溢出了。假如用32位无符号整数计时,其溢出时刻为2036年左右,所以会遇到这个问题。

直接操作寄存器中,能够自在设定这个时刻戳开始的年份,RTC的32位寄存器存储的仅仅间隔这个开始年份的总秒数,所以不会遇到这个问题。并且能够用无符号32位的二进制表明时刻,这意味着此类体系的时刻戳能够表明更多的秒数。可是因为其运用32位寄存器表明秒数,最大只能计时到136年后。

本例完结运用STM32每秒输出一次当时的时刻,并设置一个闹钟,到时刻时输出提示信息。

直接操作寄存器

RTC实时时钟的操作原则是 在每次读写前都要确保上一次读写完结。

代码较多,运用到的寄存器请拜见手册 (system.h 和stm32f10x_it.h等相关代码参照STM32 直接操作寄存器开发环境装备)

User/main.c

User/stm32f103x_it.c

#include“stm32f10x_it.h”#include“system.h”#include“stdio.h”#include“rtc.h”#defineLED1PAout(4)#defineLED2PAout(5)#defineLED3PAout(6)#defineLED4PAout(7)//externvoidWwdg_Feed(void);//externu16Read_Bkp(u8reg);externvoidRtc_Get(void);externconstu8*Week_Table[7];voidRTC_IRQHandler(void){if(RTC-》CRL&0x0001)//秒钟中止{LED4=!LED4;Rtc_Get();printf(“\r\nTIme:%d-%d-%d,%d:%d:%d,Todayis%s\r\n”,timer.year,timer.month,timer.date,timer.hour,timer.minute,timer.second,Week_Table[timer.week]);}if(RTC-》CRL&0x0002)//闹钟中止{LED3=1;printf(“\r\nIt‘stimetodosth.\r\n”);RTC-》CRL&=~(0x0002);//铲除闹钟中止}RTC-》CRL&=0x0FFA;//铲除溢出,秒钟中止while(!(RTC-》CRL&(1《《5)));//等候RTC寄存器操作完结}

Library/src/rtc.c

#include#include“rtc.h”#include“stdio.h”tmtimer;//界说时钟结构体,主函数直接能够调用此结构体读出时刻//平年

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/347056.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部