Unix时间戳

news2024/11/15 4:22:06

江科大学习记录

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){
		
					//打开LSE
			RCC_LSEConfig(RCC_LSE_ON);
			while(RCC_GetFlagStatus(RCC_FLAG_LSERDY == RESET));
			RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
			RCC_RTCCLKCmd(ENABLE);
			

			
			//必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
			RTC_WaitForSynchro();
			//仅当RTOFF状态位是1时,才可以写入RTC寄存器
			RTC_WaitForLastTask();
			
			RTC_SetPrescaler(32768 - 1);
			RTC_WaitForLastTask();
			
			MyRTC_SetTime();
			BKP_WriteBackupRegister(BKP_DR1,0xAAAA);
	}else {
		
			//必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
			RTC_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.coloradmin.cn/o/935940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

Kubernetes对象深入学习之五:TypeMeta无效之谜

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习之五》系列的第五篇&#xff0c;从前文的分析也能看出&#xff0c;代表对象类型的schema.ObjectKind&#xff0c;于…

uview ui 1.x ActonSheet项太多,设置滚动

问题&#xff1a;ActionSheet滚动不了。 使用uview ui &#xff1a;u-action-sheet, 但是item太多&#xff0c;超出屏幕了&#xff0c; 查了一下文档&#xff0c;并没有设置滚动的地方。 官方文档&#xff1a;ActionSheet 操作菜单 | uView - 多平台快速开发的UI框架 - uni-a…

【C语言】程序环境预处理 -- 详解

一、程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。执行环境&#xff0c;它用于实际执行代码。 1、翻译环境 组成一个程序的每个源文件通过编译过程分别转换成目标代…

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是通过setI…

python+mysql+前后端分离国内职位数据分析(源码+文档+指导)

系统阐述的是使用国内python职位数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…

Linux(实操篇二)

Linux实操篇 Linux(实操篇二)1. 常用基本命令1.3 时间日期类1.3.1 date显示当前时间1.3.2 显示非当前时间1.3.3 date设置系统时间1.3.4 cal查看日历 1.4 用户管理命令1.4.1 useradd添加新用户1.4.2 passwd设置用户密码1.4.3 id查看用户是否存在1.4.4 cat /etc/passwd 查看创建了…

【python】python智能停车场数据分析(代码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

TypeError: ‘set‘ object is not subscriptable

问题出现的背景&#xff1a;写了一个python脚本&#xff0c;在脚本里用到了 pyexcel_xlsx 这个包&#xff0c;这个包可以读取excel文件。在本地运行可以运行成功&#xff0c;在Linux服务器上面运行报这个错。两边python都是用到3.8版本的&#xff0c;pyexcel_xlsx 版本也相同…

2023-8-26 字符串哈希

题目链接&#xff1a;字符串哈希 #include <iostream>using namespace std;typedef unsigned long long ULL;const int N 100010, P 131;char str[N]; ULL h[N], p[N];ULL get(int l, int r) {return h[r] - h[l - 1] * p[r - l 1]; }int main() {int n, m;cin >…

3000-6000元优质全单吉他推荐,雅马哈LL16、卡马A1、VEAZEN费森S88和伊斯特曼E1D深度评测对比,哪一款会是你心目中的首选呢?

对于初学新手和进阶的朋友来说&#xff0c;可以入手一把性价比很不错的吉他当然是最理想的&#xff0c;对音质和手感有更高要求的&#xff0c;后期想要演出需求的&#xff0c;不妨考虑全单吉他。下面就给大家推荐四款市面上3000-6000元比较热门值得推荐的全单吉他系列品牌&…

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测 目录 分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测…

从源码到原理剖析activity核心知识点

如何在onResume方法中获取到View的宽高&#xff1f; 有两种方式&#xff1a;post和addOnGlobalLayoutListener override fun onResume() {super.onResume()Log.e("onresume",tabBottom.width.toString()"--"tabBottom.height.toString())//view.post之所以…

Docker之私有仓库 RegistryHabor

目录 一、Docker私有仓库&#xff08;Registry&#xff09; 1.1 Registry的介绍 二、搭建本地私有仓库 2.1首先下载 registry 镜像 2.2在 daemon.json 文件中添加私有镜像仓库地址 2.3运行 registry 容器 2.4Docker容器的重启策略 2.5为镜像打标签 2.6上传到私有仓库 2…

SpringBoot+MyBatisPlus+MySql+vue2+elementUi的案例、java访问数据库服务、java提供接口服务

文章目录 前言后端关键代码前端关键代码完整代码 前言 1、项目不使用前后端分离。 2、在创建SpringBoot的时候要注意各个插件间的版本问题。 3、后端技术SpringBootMyBatisPlusMySql。 4、前端技术vue2elementUi。 后端关键代码 简单介绍 1、数据库名称ssm_db 2、表名称tbl_bo…

「MySQL-03」用户管理与给用户授权

目录 一、用户管理 1. 用户信息 2. 创建用户 3. 删除用户 4. 修改用户密码 二、给用户授权 0.MySQL数据库提供的权限列表 1. 给用户授权 2. 回收权限 一、用户管理 1. 用户信息 1.0 数据库mysql和user表 安装好 MySQL后&#xff0c;里面会有一个默认的数据库mysql里面有一个u…

保姆级 Keras 实现 Faster R-CNN 十

保姆级 Keras 实现 Faster R-CNN 十 一. 建议区域矩形二. 定义 ProposalLyaer1. __init__函数2. build 函数3. call 函数3.1 生成 anchor_box3.2 找出 anchor 处最大分数, 最大分数对应的 anchor_box 和修正参数3. 3 修正 anchor_box3.4 完成 call 函数 4. compute_output_shap…

高精度地图定位在高速公路自动驾驶系统中的应用

近年来随着汽车保有量不断增加&#xff0c;随之而来的是: ( 1) 严重的交通拥堵&#xff0c;通行效率低下&#xff0c;用在通行上的时间不断增加; ( 2) 交通事故频发&#xff0c;交通事故导致的伤亡人数和费用不断增加&#xff0c;而且绝大多数事故是由人为因素导致的; ( 3) 大气…

视频批量剪辑利器!轻松在固定的位置上添加str字幕,

在如今的数字时代&#xff0c;视频内容的制作和分享变得越来越普遍。如果你是一个视频创作者&#xff0c;或者经常需要编辑和分享视频内容&#xff0c;那么我们为你带来了一款视频批量剪辑工具&#xff0c;让你轻松在固定位置添加字幕&#xff0c;打造专业级剪辑效果&#xff0…