西安网站优化推广公司,新乡网站建设哪家正规,html制作个人简历代码案例,wordpress win主题Unix时间戳
最早是在Unix系统使用的#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前#xff0c;Linux、Windows、安卓这些系统#xff0c;其底层的计时系统都是使用Unix时间戳。
Uinx时间戳#xff08;Unix Timestamp#xff09;定义为从UTC/…Unix时间戳
最早是在Unix系统使用的之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前Linux、Windows、安卓这些系统其底层的计时系统都是使用Unix时间戳。
Uinx时间戳Unix Timestamp定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数不考虑闰秒。也就是说时间戳是一个秒计数器且只记秒不会向分钟、小时进位。
其年月日小时分钟均通过计算秒得出。 世界上所有时区共用一个时间戳的秒计数器不同时区通过添加偏移来得到当地时间。如上图所示相比于伦敦北京时间偏移了8个小时。 UTC/GMT
GMT即格林尼治标准时间可理解为伦敦时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时以此确定计时标准。
但GMT是以前的时间标准因为地球自转一周的时间是不固定的由于潮汐力、地球活动等原因地球目前是越转越慢的因此时间基准也是不固定的即1秒到底是多长。
为了时间的定义更标准科学家又提出来新的计时系统叫做UTC即协调世界时。是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9192631770周所持续的时间为1秒。
当原子钟计时一天的时间与地球自转一周的时间相差超过0,9秒时UTC会执行闰秒来保证其计时与地球自转的协调一致。
闰秒计时标准是恒定不变的但是地球越转越慢误差超过0.9秒时计时系统就多走一秒来等一下地球的自转。 时间戳转换
C语言的time.h模块提供了时间获取和时间戳转换的相关函数可以方便地进行秒计数器、日期时间和字符串之间的转换。 函数 作用time_t time(time_t *seconds)获取系统时钟 struct tm *gmtime(const time_t *timer) 秒计数器转换为日期时间格林尼治时间 struct tm *localtime(const time_t *timer) 秒计数器转换为日期时间当地时间 time_t mktime(struct tm *timeptr) 日期时间转换为秒计数器当地时间 char *ctime(const time_t *timer) 秒计数器转换为字符串默认格式 char *asctime(const struct tm *timeptr) 日期时间转换为字符串默认格式 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 日期时间转换为字符串自定义格式
数据类型
1、秒计数器时间类型time_t64位有符号的整型数据用于存储时间戳中一直自增的秒数。
2、日期时间类型struct tm是一个结构体具体如下 3、字符串时间类型char*就是char类型数据的指针。用来指向一个表示时间的字符串。 BKP简介
BKP备份寄存器可用于存储用户应用程序数据当VDD2.0~3.6V电源被切断他们仍然由VBAT1.8~3.6V维持供电。当系统在待机模式下被唤醒或系统复位或电源复位时他们也不会被复位除非VBAT掉电。
用户数据存储容量
20字节中容量和小容量84字节大容量和互联型
对于C8T6芯片为中容量对应20字节。可以看出BKP的容量其实非常小一般只能存储少量的参数。 BKP基本结构 后备区域
图中的橙色部分我们可以叫做后备区域。注意是BKP处于后备区域但后备区域不只有BKP还有RTC的相关电路。
STM32后备区域的特性就是当VDD主电源掉电时后备区域仍然可以由VBAT的备用电池供电当VDD上电时后备区域供电会由VBAT切换为VDD可以节省电池电量。
内部寄存器
BKP里主要有状态寄存器、控制寄存器、数据寄存器、RTC时钟校准寄存器。其中数据寄存器是主要部分用来存储数据的。每个数据寄存器都是16位的一个数据寄存器可以存2个字节对于中容量和小容量的设备里面有DR1~DR10总共10个数据寄存器共20个字节。
侵入检测
BKP可以从PC13位置的TAMPER引脚引入一个检测信号当TAMPER产生一个上升沿或者下降沿时会清除BKP所有的内容以保证安全。
时钟输出
将RTC的相关时钟从PC13位置的RTC引脚输出出去供外部使用。其中输出校准时钟时再配合RTC时钟校准寄存器可以对RTC的误差进行校准。 RTC简介
RTC即实时时钟STM32中RTC是一个独立的定时器可为系统提供时钟和日历年月日时分秒的功能。挂在APB1总线上。
RTC和时钟配置系统处于后备区域系统复位时数据不清零VDD2.0~3.6V断电后可借助VBAT1.8~3.6V供电继续走时。
秒计数器与分频器
在RTC中负责计数的装置只有一个32位的秒计数器。且1秒就要自增一次所以驱动秒计数器的时钟---TR_CLK是一个1Hz的信号。但实际提供给RTC的时钟也就是RTCCLK一般频率都比较高。所以显然需要在这之间加一个分频器保证输出给计数器的频率为1Hz。
RTC中的预分频器是一个20位的分频器可编程可以选择对输入时钟进行1~2^20分频这样可以适配不同频率的输入时钟。
RTC时钟来源
RTCCLK的来源主要有以下3种
HSE时钟除以1288MHz/128LSE振荡器时钟37.768KHzLSI振荡器时钟40KHz
其中HSE是高速外部时钟信号通常为高速晶振、LSE低速外部时钟信号、LSI低速内部时钟信号。具体可参考RCC章节知识。
【注意】为了更好使用RTC模块外部硬件电路也需要配置好。即备用电池模块、外部低速晶振等。 RTC框图 左边阴影区为核心的分频和计数区域右边为中断输出使能和NVIC部分上面为APB1总线读写部分下面阴影区是与PWR关联的部分。阴影区均为后备区域
【注意】对于RTC和BKP的寄存器其实都是16位的。例如左边的RTC_CR控制寄存器实际上是两个16位的寄存器RTC_CRH和RTC_CRL。
分频器
由两个寄存器组成即重装载寄存器RTC_PRL和余数寄存器RTC_DIV与定时器时基单元的计数器CNT和重装寄存器ARR是一样作用。且计几个数溢出一次就是几分频
RTC_DIV是自减的计数器每来一个输入时钟DIV的值自减一次自减到0时再来一个时钟DIV输出一个脉冲溢出信号同时从PRL获取重装值回到重装值继续自减。
闹钟寄存器
RTC内部除了32位的秒寄存器RTC_CNT外还有一个32位的闹钟寄存器RTC_ALR其作用为设置闹钟。
我们可以在ALR里写一个秒数设定闹钟当CNT值与ALR设定的闹钟值一样时就会产生RTC_Alarm闹钟信号通向右边的中断系统。在中断函数里可执行需要的操作。
【注意】RTC_Alarm闹钟信号还可使主机退出待机模式。
中断
除了上述的RTC_Alarm闹钟信号能触发中断外还有RTC_Second、RTC_Overflow能够触发中断。
其中RTC_Second是秒中断开启后每秒触发一个中断。RTC_Overflow是指当32位的秒计数器计满后溢出时触发的中断这个中断得到2106年才会触发。 RTC操作注意事项
1、使能
对于一般的片上外设只需要开启时钟使能即可使用。但对于RTC模块却有些复杂首先要设置RCC_APB1ENR开启APB1上外设的时钟要同时开启PWR和BKP的时钟。然后设置PWR_CR的DBP位来使能对BKP和RTC的访问。
2、关于读取
若在读取RTC寄存器时RTC的APB1接口曾经处于禁止状态则软件首先必须等待RTC_CRL寄存器中的RSF位寄存器同步标志被硬件置1。
可观察RTC内部框图可以看出APB1的时钟为PCLK1在主电源掉电时会停止而RTC里的寄存器时钟为RTCCLK。当我们用PCLK1驱动的总线去读取RTCCLK驱动的寄存器时就会有一个时钟不同步的问题。PCLK1的频率为36MHz远大于RTCCLK的36KHz如果在APB1刚开启时就立刻读取RTC寄存器有可能RTC寄存器还没有更新到APB1总线上这样读取到的值为错误的。
所以APB1总线刚开启时要等一下RTCCLK只要RTCCLK来一个上升沿RTC把它的寄存器值同步到APB1总线上。
3、关于写入
必须设置RTC_CRL寄存器中的CNF位使RTC进入配置模式后才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
在STM32的标准库函数中写寄存器的函数都自动帮我们加上了这个操作不需要我们再配置了。
4、写等待机制
对于RTC任何寄存器的写操作都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位判断RTC寄存器是否处于更新中。仅当RTOFF为1时才可以写入RTC寄存器。
因为RCLK1与RTCCLK时钟频率不同用PCLK的频率写入后这个值还不能立刻更新到RTC寄存器里面要等RTCCLK时钟来一个上升沿值更新到RTC寄存器里写入才算完成。