STM32单片机入门学习——第41节: [12-1] Unix时间戳
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.18
STM32开发板学习——第41节: [12-1] Unix时间戳
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、Unix时间戳
- 问题
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图

2、STM32F103C6和51对比

3、STM32F103C6核心板

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图

引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)

数据手册

解答和科普
一、Unix时间戳

实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 ● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
VBAT接3.3V电源,在BKP备份寄存器写入两个数据,然后再把它们读出来,显示一下,BKP备份寄存器和上一节学的Flash存储器类似,而BKP的数据,是需要VBAT引脚接上备用电池来维持的,只要VBAT有电池供电,即使STM32主电源断电,BKP的值也可以维持原状。现在STM32断电,但是VBAT有电,可以维持BKP的数据,再次上电后,在没有写数据的情况下,直接读出BKP,它的数据和断电之前是一样的,这说明BKP的数据在主电源断电后,得到了保持,并且按下复位键,可以按下复位键,BKP的数据也不会复位,那如果把VBAT的电池断电,再次拔掉主电源,重新上电,BKP的数据就清零了,因为BKP本质上,不能完全掉电不丢失,它的数据,需要VBAT引脚提供备用电源来维持,这就是BKP备份寄存器的特性。如果你的STM32接了备用电池,那BKP可以完成一些主电源掉电时,保存少量数据的任务,这就是第一个代码的现象。其实备份寄存器和VBAT引脚的存在,更多的是为了服务RTC的。
第二个代码,实时时钟。第一行是日期,目前给的一个测试时间,2023年1月2日,第二行是时间,目前是0时0分这些秒,第三行是时间戳的秒计数器,目前是16亿多。第四行时RTC预分频器的计数值。首先是复位,复位之后时间会继续运行,然后,实时时钟,在系统主电源断电后,他还要继续运行。关机后,里面时钟还必须要继续走,所以只要在VBAT接上了备用电源,在断开系统主电源,然后插上,可以看到时间数据不会丢失,并且,在主电源断开的时间里,RTC会继续走,不会因为主电源断电而暂停,这就是RTC实时时钟的程序现象。可以发现,RTC这个复位和主电源掉电后,数据不丢失,就是借用BKP来实现的,所以RTC和BKP关联程度是比较高的,这就是实时时钟的程序现象。
BUG,给主电源断电后,VBAT的电源还会给微弱地整个系统供电,这导致我主电源拔掉后,电源指示灯和OLED屏幕还会微弱地亮着,这是一个问题。还有的芯片,在进行RTC实验时,会出现RTC晶振不起振的情况,这会导致程序卡死在等待晶振起振的地方,这个问题我还没有找到完美的解决方法,但是在学习过程中,也是可以有一些替代方法可以使用的。
Uinx时间戳:定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒。
这款STM32,它的时间戳是32位的数据类型,这个时间戳,在STM32程序中定义的其实是无符号的32位,无符号32最大数值是2^32-1.
世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间.所有时区共用一个时间戳的秒计数器,也就是在伦敦秒计数器是0,在北京也是0,然后根据不同时区,再加上时间偏移,就能确定了。

当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致,计时标准不变,地球越转越慢,相差超过0.9秒时,我的计时系统就多走一秒,来等一下地球的自转,会出现7时59分60秒。闰秒机制的设计,也会造成一些程序BUG,1分钟会有61秒的情况。


秒计数器和日期时间,如何进行相互转换,这时候需要用到time.h模块。
C语言的time.h模块,提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换,使用还是非常方便的。

秒计数器类型名,叫作time_t,其实是一个typedef重命名的类型,实际上就是int64类型,是一个64位有符号的整形数据。

下一个时间类型是日期时间数据类型strruct tm

年代是1900年。
在STM32中,使用的是typedef struct 新名字,这样的形式定义的。这里没有使用typedef,而是在花括号前给结构体起来一个名字,叫tm,这样在使用的时候,数据类型名,就是两个词struct tm,然后跟着的是变量名,这样的方式也是可以的。和我们STM32库函数里的方式是一样的效果。
接着最后一个,是字符串数据类型,类型名是char *,就是char型数据的指针,用来表示指向一个表示时间的字符串。

time()是用来获取当前时间的,这个函数,在电脑里,可以直接读取电脑的时间,但是在STM32是用不了的,因为STM是一个离线的裸机系统,它也不知道是什么时间,


有了秒计数器后,接着把它转换为日期时间的格式,第二个,gmtime,将秒计数器的值,转换为格林尼治,也就是伦敦时间,参数是const time_t ,秒计数器指针类型,是输入参数,返回值struct tm 是日期时间结构体指针类型,在这个图里,它的作用就是这里,秒计数器转换为日期时间。
time_data = gmtime(time_cnt);这样,就是指针跨级赋值;等号右边是地址,等号左边却是一个变量,这是不行的,有两个,一个是在右边,函数的返回值,加上*,取内容,
time_data= gmtime(time_cnt);
这样的好左右就都是变量了,结构体变量之间互相赋值,没问题,或者右边不加,定义的变量,我们定义为指针类型,这样等号左右都是指针,结构体指针之间互相赋值,也没问题,这两种方法都可以。
年时:是从1900年经过的年数,月是从月经过的月数。








问题
总结
本节课主要是学习了Unix时间戳,和如何用函数实现时间戳到现在时间的转换,相互的,转换与被转换。
相关文章:
STM32单片机入门学习——第41节: [12-1] Unix时间戳
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.18 STM32开发板学习——第41节: [12-1] Unix时间戳 前言开发板说明引用解答和科普一…...
无人机自主导航与路径规划技术要点!
一、自主导航与路径规划技术要点 1. 传感器融合 GPS/北斗定位:提供全局定位,但在室内或遮挡环境下易失效。 惯性测量单元(IMU)**:通过加速度计和陀螺仪实时追踪姿态,弥补GPS信号丢失时的定位空缺。 …...
AI绘画SD中,如何保持生成人物角色脸部一致?Stable Diffusion精准控制AI人像一致性两种实用方法教程!
在AI绘画StableDiffusion中,一直都有一个比较困难的问题,就是如何保证每次出图都是同一个人。今天就这个问题分享一些个人实践,大家和我一起来看看吧。 一. 有哪些实现方式 方式1:固定Seed种子值。 固定Seed种子值出来的图片人…...
java 设计模式 策略模式
简介 策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法…...
std::set (C++)
std::set 1. 概述定义特点 2. 内部实现3. 性能特征4. 常用 API5. 使用示例6. 自定义比较器7. 注意事项与优化8. 使用建议 1. 概述 定义 template<class Key,class Compare std::less<Key>,class Allocator std::allocator<Key> > class std::set;特点 有…...
STM32 HAL 通用定时器延时函数
使用通用定时器TIM3,实现ms、us延时。 delay.c #include "delay.h" #include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** brief 初始化定时器3用于延时* param 无* retval 无*/ void Delay_Init(void) {TIM_ClockConfigTypeDef sClock…...
RK3588S开发板将SPI1接口改成GPIO
参考官方教程:ROC-RK3588S-PC 一.基本知识: 1.GPIO引脚计算: ROC-RK3588S-PC 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,常用以下公式计算引脚:GPIO…...
PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
在孩子的成长过程中,总有那么一些“与众不同”的孩子。他们似乎总是坐不住,课堂上小动作不断,注意力难以集中,作业总是拖拖拉拉……这些行为常常被家长和老师简单地归结为“淘气”“不听话”。然而,他们可能并不只是“…...
DemoGen:用于数据高效视觉运动策略学习的合成演示生成
25年2月来自清华、上海姚期智研究院和上海AI实验室的论文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 视觉运动策略在机器人操控中展现出巨大潜力,但通常需要大量人工采集的数据才能有效执行。驱动高数据需…...
极狐GitLab 账号限制有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 账户和限制设置 (BASIC SELF) 默认项目限制 您可以配置新用户能在其个人命名空间中创建的默认最大项目数。此限制仅影响更改…...
@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染
JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染 JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染1、JsonView 注解产生的背景2、为了满足不同场景下返回对应的属性的做法有哪些?2.1 最快速的实现则是针对不同场景新建不同的 DTO…...
JVM之经典垃圾回收器
一、垃圾回收算法 1. 标记-清除(Mark-Sweep) 步骤: 标记:遍历对象图,标记所有存活对象。清除:回收未被标记的垃圾对象。 特点:简单,但会产生内存碎片。 2. 标记-复制(…...
15 nginx 中默认的 proxy_buffering 导致基于 http 的流式响应存在 buffer, 以 4kb 一批次返回
前言 这也是最近碰到的一个问题 直连 流式 http 服务, 发现 流式响应正常, 0.1 秒接收到一个响应 但是 经过 nginx 代理一层之后, 就发现了 类似于缓冲的效果, 1秒接收到 10个响应 最终 调试 发现是 nginx 的 proxy_buffering 配置引起的 然后 更新 proxy_buffering 为…...
人工智能学习框架完全指南(2025年更新版)
一、核心框架分类与适用场景 人工智能框架根据功能可分为深度学习框架、机器学习框架、强化学习框架和传统工具库,以下是主流工具及选型建议: 1. 深度学习框架 (1)PyTorch 核心优势:动态计算图、灵活性强,适合科研与快速原型开发,支持多模态任务(如NLP、CV) 。技术生…...
安卓手机万能遥控器APP推荐
软件介绍 安卓手机也能当“家电总控台”?这款小米旗下的万能遥控器APP,直接把遥控器做成“傻瓜式操作”——不用配对,不连蓝牙,点开就能操控电视、空调、机顶盒,甚至其他品牌的电器!雷总这波操作直接封神&…...
颚式破碎机的设计
一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备,其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高,设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力:根据目…...
PH热榜 | 2025-04-18
1. Wiza Monitor 标语:跟踪工作变动,接收Slack和电子邮件的提醒。 介绍:Wiza Monitor是一款用于追踪职位变动的工具,可以实时跟踪客户和潜在客户的工作变动,还可以通过电子邮件和Slack发送提醒,让你的客户…...
Android平台 Hal AIDL 系列文章目录
目录 1. Android Hal AIDL 简介2. AIDL 语言简介3. Android 接口定义语言 (AIDL)4. 定义AIDL 接口5. AIDL 中如何传递 Parcelable 对象6. 如何使用AIDL 定义的远程接口进行跨进程通信7. 适用于 HAL 的 AIDL8. Android Hal AIDL 编译调试9. 高版本Android (AIDL HAL) 沿用HIDL方…...
十、数据库day02--SQL语句01
文章目录 一、新建查询1.查询窗口的开启方法2. 单语句运行方法 二、数据库操作1.创建数据库2. 使用数据库3. 修改数据库4. 删除数据库和查看所有数据库5. 重点:数据库备份5.1 应用场景5.2 利用工具备份备份操作还原操作 5.3 扩展:使用命令备份 三、数据表…...
基于Atlas 800I A2 + Ubuntu 22.04 LTS 离线部署神州鲲泰问学一体机平台
一.环境信息 1.1.硬件信息 Atlas 800I A2 1.2.操作系统 版本: cat /etc/os-release PRETTY_NAME"Ubuntu 22.04 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04 (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubun…...
Shell脚本-变量是什么
在Shell脚本编程中,变量是一个非常基础且重要的概念。它们用于存储数据,并可以在整个脚本中引用这些数据来执行各种操作。理解如何定义、使用和管理变量是编写有效Shell脚本的关键。本文将详细介绍Shell脚本中的变量,包括其基本概念、类型以及…...
MCP 协议:AI 世界的 “USB-C 接口”,开启智能交互新时代
MCP协议:AI世界的“USB-C接口”,开启智能交互新时代 在AI技术飞速发展的今天,不同AI模型、应用与设备之间的交互和协同需求愈发迫切。就像USB-C接口统一了电子设备的数据传输与充电标准一样,**MCP协议(Model Communic…...
服务器的算力已经被被人占用了,我如何能“无缝衔接”?
今天遇到一个问题,服务器已经被别人占用了,我又不知道什么时候他能结束,因此很难去训练自己的模型,隔一会去看看别人是否结束又太麻烦,于是便可以写这个脚本文件来自动检测服务器是否空闲,一有空闲就可以自…...
大数据面试问答-批处理性能优化
1. 数据存储角度 1.1 存储优化 列式存储格式:使用Parquet/ORC代替CSV/JSON,减少I/O并提升压缩率。 df.write.parquet("hdfs://path/output.parquet")列式存储减少I/O的核心机制: 列裁剪(Column Pruning) …...
浅析数据库面试问题
以下是关于数据库的一些常见面试问题: 一、基础问题 什么是数据库? 数据库是按照数据结构来组织、存储和管理数据的仓库。SQL 和 NoSQL 的区别是什么? SQL 是关系型数据库,使用表结构存储数据;NoSQL 是非关系型数据库,支持多种数据模型(如文档型、键值对型等)。什么是…...
Android 12.0 framework实现对系统语言切换的功能实现
1.前言 在12.0的系统rom定制化开发过程中,在定制某些接口的过程中,需要通过系统提供接口,然后实现对系统语言的切换 功能实现,接下来分析下系统中关于系统语言切换的相关功能 2.framework实现对系统语言切换的功能实现的核心类 frameworks/base/core/java/android/app/IA…...
实时直播弹幕系统设计
整个服务读多写少,读写比例大概几百比1. 如果实时性要求高的话,可以采用长连接模式(轮询的话,时效性不好,同时对于评论少的直播间可能空转) websocket 和 SSE架构 只要求服务端推送的话,可以…...
[Java · 初窥门径] Java 语言初识
🌟 想系统化学习 Java 编程?看看这个:[编程基础] Java 学习手册 0x01:Java 编程语言简介 Java 是一种高级计算机编程语言,它是由 Sun Microsystems 公司(已被 Oracle 公司收购)于 1995 年 5 …...
【SQL Server】数据探查工具1.0研发可行性方案
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 想抢先解锁数据自由的宝子,速速戳我!评论区蹲一波 “蹲蹲”,揪人唠唠你的超实用需求! 【SQL Server】数据探查工具1.0研发可行性方案…...
谓词——C++
1.一元谓词 1.定义 2.案例 查找容器有没有大于五的数字 #include<stdio.h> using namespace std; #include<string> #include<vector> #include<set> #include <iostream> class myfind { public:bool operator()(int a){return a > 5;} …...
