Unix时间戳

江科大学习记录

Unix时间戳

  • Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
  • 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
  • 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
    在这里插入图片描述
    UTC/GMT
  • GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
  • UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致
    时间戳转换
    C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
    在这里插入图片描述
    秒计数器转换为日期时间(格林尼治时间)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t timer;
struct tm *time_Structue;
int main()
{timer = time(NULL);printf("%d\n",timer);time_Structue = gmtime(&timer);printf("%d年-%d月-%d日-%d时-%d分",time_Structue->tm_year+1900,time_Structue->tm_mon+1,time_Structue->tm_mday,time_Structue->tm_hour,time_Structue->tm_sec);printf("\n星期%d\n",time_Structue->tm_wday);system("pause");return 0;
}

blog.csdnimg.cn/2b384342094842869d2d1514b6082a53.png)

秒计数器转换为日期时间(当地时间)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t timer;
struct tm *time_Structue;
int main()
{timer = time(NULL);printf("%d\n",timer);time_Structue = localtime(&timer);printf("%d年-%d月-%d日-%d时-%d分",time_Structue->tm_year+1900,time_Structue->tm_mon+1,time_Structue->tm_mday,time_Structue->tm_hour,time_Structue->tm_sec);printf("\n星期%d\n",time_Structue->tm_wday);system("pause");return 0;
}

在这里插入图片描述
日期时间转换为秒计数器(当地时间)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t timer;
struct tm *time_Structue;
int main()
{timer = time(NULL);printf("%d\n",timer);time_Structue = localtime(&timer);printf("%d年-%d月-%d日-%d时-%d分",time_Structue->tm_year+1900,time_Structue->tm_mon+1,time_Structue->tm_mday,time_Structue->tm_hour,time_Structue->tm_sec);printf("\n星期%d\n",time_Structue->tm_wday);timer = mktime(time_Structue);printf("转换为秒计数器:%d\n",timer);system("pause");return 0;
}

在这里插入图片描述
日期时间转换为字符串(默认格式)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t timer;
struct tm *time_Structue;
char* str;
int main()
{timer = time(NULL);printf("%d\n",timer);time_Structue = localtime(&timer);printf("%d年-%d月-%d日-%d时-%d分",time_Structue->tm_year+1900,time_Structue->tm_mon+1,time_Structue->tm_mday,time_Structue->tm_hour,time_Structue->tm_sec);printf("\n星期%d\n",time_Structue->tm_wday);timer = mktime(time_Structue);printf("转换为秒计数器:%d\n",timer);str = asctime(time_Structue);printf("字符串:%s\n",str);system("pause");return 0;
}

在这里插入图片描述

在这里插入图片描述

BKP简介

  • BKP(Backup Registers)备份寄存器

  • BKP可用于存储用户应用程序数据。当VDD(2.0—3.6V)电源被切断,他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位

  • TAMPER引脚产生的侵入事件将所有备份寄存器内容清除

  • RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲

  • 存储RTC时钟校准寄存器

  • 用户数据存储容量:

    20字节(中容量和小容量)/ 84字节(大容量和互联型)

BKP基本结构
在这里插入图片描述

RTC简介

  • RTC(Real Time Clock)实时时钟

  • RTC是一个独立的定时器,可为系统提供时钟和日历的功能

  • RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0~3.6V)断电后可借助VBAT(1.8—3.6V)供电继续走时

  • 32位的可编程计数器,可对应Unix时间戳的秒计数器

  • 20位的可编程预分频器,可适配不同频率的输入时钟

  • 可选择三种RTC时钟源:

    HSE时钟除以128(通常为8MHz/128)
    LSE振荡器时钟(通常为32.768KHz)
    LSI振荡器时钟(40KHz)

RTC框图
在这里插入图片描述
输出给TR_CLK的频率为1Hz,计时周期为1s,让RTC_CNT按秒计数
RTC基本结构
在这里插入图片描述
硬件电路
在这里插入图片描述
RTC操作注意事项

  • 执行以下操作将使能对BKP和RTC的访问:

    设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
    设置PWR_CR的DBP,使能对BKP和RTC的访问

  • 若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1

  • 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器

  • 对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器
    案例:读写BKP寄存器

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "key.h"
#include "OLED.h"uint16_t ArrayWrite[] = {0x1234,0x4567};
uint16_t ArrayRead[2];void RCC_Clock_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
}void OLED_Test(void)
{char *str = "hello world";OLED_ShowString(1,2,str);
}int main(void)
{uint16_t keyNum;;RCC_Clock_Init();Key_Init();OLED_Init();OLED_Test();PWR_BackupAccessCmd(ENABLE);//BKP_WriteBackupRegister(BKP_DR1,0x1234);OLED_ShowString(2,1,"W:");OLED_ShowString(3,1,"R:");while(1){keyNum = Key_Scan();if(keyNum == 1){ArrayWrite[0]++;ArrayWrite[1]++;BKP_WriteBackupRegister(BKP_DR1,ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2,ArrayWrite[1]);OLED_ShowHexNum(2,3,ArrayWrite[0],4);OLED_ShowHexNum(2,8,ArrayWrite[1],4);}else {ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(3,3,ArrayRead[0],4);OLED_ShowHexNum(3,8,ArrayRead[1],4);}}	
}

案例二:RTC实时时钟
main

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"
int main(void)
{OLED_Init();MyRTC_Init();//char *str = "hello world";OLED_ShowString(1,1,"Date:XXXX-XX-XX");OLED_ShowString(2,1,"Tim:XX-XX-XX");OLED_ShowString(4,1,"DIV:");while(1){MyRTC_ReadTime();OLED_ShowNum(1,6,TimeData.year,4);OLED_ShowNum(1,11,TimeData.mon,2);OLED_ShowNum(1,14,TimeData.day,2);OLED_ShowNum(2,5,TimeData.hour,2);OLED_ShowNum(2,8,TimeData.min,2);OLED_ShowNum(2,11,TimeData.sec,2);OLED_ShowNum(3,1,RTC_GetCounter(),10);OLED_ShowNum(4,5,RTC_GetDivider(),10);}}

MyRTC.c

#include "MyRTC.h"
#include "time.h"Time TimeData = {2023,1,1,23,59,55,		
};void MyRTC_SetTime(void)
{time_t time_cnt;struct tm time_data;time_data.tm_year = TimeData.year - 1900;time_data.tm_mon = TimeData.mon - 1;time_data.tm_mday = TimeData.day;time_data.tm_hour = TimeData.hour;time_data.tm_min = TimeData.min;time_data.tm_sec = TimeData.sec;time_cnt = mktime(&time_data) - (8*60*60);RTC_SetCounter(time_cnt);RTC_WaitForLastTask();
}void MyRTC_ReadTime(void)
{time_t time_cnt;struct tm time_data;time_cnt = RTC_GetCounter()+(8*60*60);time_data = *localtime(&time_cnt);TimeData.year = time_data.tm_year+1900;TimeData.mon = time_data.tm_mon+1;TimeData.day = time_data.tm_mday;TimeData.hour  =time_data.tm_hour;TimeData.min = time_data.tm_min;TimeData.sec = time_data.tm_sec;	
}void MyRTC_Init(void)
{//设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//设置PWR_CR的DBP,使能对BKP和RTC的访问PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1) != 0xAAAA){//打开LSERCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY == RESET));RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);//必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1RTC_WaitForSynchro();//仅当RTOFF状态位是1时,才可以写入RTC寄存器RTC_WaitForLastTask();RTC_SetPrescaler(32768 - 1);RTC_WaitForLastTask();MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1,0xAAAA);}else {//必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1RTC_WaitForSynchro();//仅当RTOFF状态位是1时,才可以写入RTC寄存器RTC_WaitForLastTask();}}
#ifndef _MYRTC_H
#define _MYRTC_H
#include "stm32f10x.h"                  // Device header
#include "Delay.h"void MyRTC_Init(void);
void MyRTC_SetTime(void);
void MyRTC_ReadTime(void);
typedef struct{uint16_t year;uint16_t mon;uint16_t day;uint16_t hour;uint16_t min;uint16_t sec;}Time;
extern Time TimeData;
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108742.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML番外篇(五)-移动端适配

一、媒体查询 1.认识媒体查询 媒体查询是一种提供给开发者针对不同设备需求进行定制化开发的一个接口。 你可以根据设备的类型&#xff08;比如屏幕设备、打印机设备&#xff09;或者特定的特性(比如屏幕的宽度)来修改你的页面。 媒体查询的使用方式主要有三种&#xff1a;…

算法笔记:球树

1 KD树的问题 算法笔记&#xff1a;KD树_UQI-LIUWJ的博客-CSDN博客 在kd树中&#xff0c;导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体&#xff0c;而求最近邻时使用的是欧式距离&#xff08;超球&#xff09;。超方体与超球体相交的可能性是极高…

【VsCode】SSH远程连接Linux服务器开发,搭配cpolar内网穿透实现公网访问(1)

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

SpringBootWeb案例 Part3

目录 1. 新增员工 1.1 需求 1.2 接口文档 1.3 思路分析 PostMapping RequestBody //把前端传递的JSON数据填充到实体类中 1.4 功能开发 1.5 功能测试 1.6 前后端联调 2. 文件上传 2.1 文件上传简介 Spring中提供了一个API&#xff1a;MultipartFile&#xff0c;使…

爬虫逆向实战(二十一)-- 某某点集登录与获取数据

登录 一、数据接口分析 主页地址&#xff1a;某某点集 1、抓包 通过抓包可以发现登录接口是phonePwdLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有pwd和sig两个加密参数 请求头是否加密&#xff1f; 无响应是否加密&#x…

144. 二叉树的前序遍历-C++

题目来源&#xff1a;力扣 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 代码实现&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNo…

深入理解linux内核--程序的执行

可执行文件 在第一章中我们把进程定义为“执行上下文”。这就意味着进行特定的计算需要收集必要的信息&#xff0c;包括所访问的页&#xff0c;打开的文件&#xff0c;硬件寄存器的内容等等。 可执行文件是一个普通文件&#xff0c;它描述了如何初始化一个新的执行上下文&…

飞腾FT-2000/4、D2000 log报错指导(1)

在爱好者群中遇见了很多的固件问题,这里总结记录了大家的交流内容和调试心得。主要是飞腾桌面CPU FT-2000/4 D2000相关的,包含uboot和UEFI。希望对大家调试有所帮助。 这个专题会持续更新,凑够一些就发。 1 UEFI启动时报错: ASSERT_EFI_ERROR (Status = Not Found) ASS…

ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

环境信息&#xff1a;VMware Workstation 17 Pro ubuntu20.04 (清华源) ubuntu 源点进去选&#xff1a;ubuntu-22.04.3-desktop-amd64.iso 如果之前装过VPP&#xff0c;用以下命令确定是否卸载干净&#xff1a; dpkg -l | grep vpp dpkg -l | grep DPDK 卸载&#xff1a; …

【springboot】WebScoket双向通信:

文章目录 一、介绍&#xff1a;二、案例&#xff1a;三、使用&#xff1a;【1】导入WebSocket的maven坐标【2】导入WebSocket服务端组件WebSocketServer&#xff0c;用于和客户端通信【3】导入配置类WebSocketConfiguration&#xff0c;注册WebSocket的服务端组件【4】导入定时…

DevOps系列文章 之 Python基础

Python语法结构 语句块缩进 1.python代码块通过缩进对齐表达代码逻辑而不是使用大括号 2.缩进表达一个语句属于哪个代码块 3.缩进风格 &#xff1a; 建议使用四个空格 如果是Linux系统的话&#xff0c;可以这样做&#xff0c;实现自动缩进 &#xff1a; vim ~/.vimrc set ai…

中国芯,寻找新赛道迫在眉睫

北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述&#xff0c;一个是中国芯群体中上市公司股价闪崩的有点多&#xff0c;另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业&#xff08;fabless商业模式&#xff09;…

编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。

环境&#xff1a; CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff08;3&#xff09;安装nginx服务&#xff0c;将提供的dest目录…

计算机安全学习笔记(I):访问控制安全原理

访问控制原理 从广义上来讲&#xff0c;所有的计算机安全都与访问控制有关。 RFC 4949: Internet Security Glossary, Version 2 (rfc-editor.org) RFC 4949 定义的计算机安全&#xff1a;用来实现和保证计算机系统的安全服务的措施&#xff0c;特别是保证访问控制服务的措施…

学信息系统项目管理师第4版系列03_文件与标准

审核未通过&#xff0c;删除文件部分&#xff0c;仅保留标准化相关内容&#xff0c;重发 12. 标准化 12.1. 采用国际标准和国外先进标准的程度分为等同采用、修改采用和等效采用 3 种 12.1.1. 【高21上选20】 12.1.2. 采用指与国际标准在技术内容和文本结构上相同,或者与国…

8.7.tensorRT高级(3)封装系列-调试方法、思想讨论

目录 前言1. 模型调试技巧总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-调试方法、思想讨论 课程大纲可看…

Sping源码(七)— 后置处理器(自定义后置处理器)

上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程&#xff0c;以及BFPP和BDRPP类的介绍&#xff0c;这篇文章我们来自定义实现一个类的后置处理器。 自定义PostProcessor 自定义PostProcessor的方式一共两种&#xff0c;都是根据invokeBeanFactoryPo…

2023年高教社杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

软件工程(十八) 行为型设计模式(四)

1、状态模式 简要说明 允许一个对象在其内部改变时改变它的行为 速记关键字 状态变成类 类图如下 状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。比如订单从待付款到待收货的咋黄台发生变化,执行的逻辑是不一样的。 所以我们将状态抽象为一…

电商项目part05 分布式ID服务实战

背景 日常开发中&#xff0c;需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应 一个订单。现实生活中也有各种 ID&#xff0c;比如身份证 ID 对应且仅对应一个人…