“rtc”是real time clock 的简称,意为实时时钟。stm32提供了一个秒中断源和一个闹钟中断源。
rtc的技术器是一个32位的计数器,使用32.768khz的外部晶振。
2038年问题
在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。所有使用unix时间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。这种时间表示法在类unix(unix-like)操作系统上是一个标准,并会影响以其c编程语言开发给其他大部份操作系统使用的软件。
在大部份的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
#include#include“system.h”#include“usart.h”#include“rtc.h”#defineled1paout(4)#defineled2paout(5)voidgpio_init(void);externconstu8*week_table[7];intmain(void){rcc_init(9);//系统时钟设置usart1_init(72,9600);nvic_init(0,0,rtc_irqchannel,0);//设置中断gpio_init();rtc_init();//rtc_time_autoset();//将当前编译时间作为rtc开始时间rtc_time_set(2012,7,7,20,50,0);//设定开始时间参数说明:年,月,日,时,分,秒rtc_alarm_set(2012,7,7,20,50,30);//设定闹钟事件时间led1=1;while(1);}voidgpio_init(void){rcc-》apb2enr|=1《《2;//使能porta时钟gpioa-》crl&=0x0000ffff;//pa0~3设置为浮空输入,pa4~7设置为推挽输出gpioa-》crl|=0x33334444;//usart1串口i/o设置gpioa-》crh&=0xfffff00f;//设置usart1的tx(pa.9)为第二功能推挽,50mhz;rx(pa.10)为浮空输入gpioa-》crh|=0x000008b0;}
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;//定义时钟结构体,主函数直接可以调用此结构体读出时间//平年
特斯拉家用充电桩参数及规格
一文详解RISC-V指令集
中国联通:为满足携号转网项目技术要求,相关设备只能从华为处采购
南昌VR研究院成立,注册资本达6亿
无人机采用单相机双拼航线飞行实现倾斜摄影的设计
基于STM32单片机秒中断源和闹钟中断源的解决方案
便携式充电桩检测仪用于交流和直流充电桩产品功能验证
业内尺寸最小的液体镜头驱动器,用于自动对焦的微型相机模块-M
浅谈安科瑞智能照明系统在生物制药车间的应用与选型
用于多媒体解决方案的嵌入式视频处理器内核的软件基础架构
低功率40m连续波发射机
电子芯闻早报:苹果触控笔,谷歌人形机器人
iPhone15最新消息:印度工厂开始组装iPhone15 iPhone15系列USBC数据线曝光
【资料下载】IMG CXM GPU:面向复杂消费级设备的无缝视觉体验
魅蓝E3与红米Note5之间如何抉择?
无线充电技术经典问答
微软Surface Laptop 4曝光:有望搭载AMD锐龙5000 APU
一文读懂汽车芯片—图像传感器芯片
了解基准电压源拓扑和规格
小米MIX3在故宫举行发布会,小米手机2018年出货量10月将破1亿台