STM32使用FREERTOS获取系统时间

2023-05-16

使用CUBE_MX生成带有free_RTOS操作系统的工程,我们经常会使用到系统相对时间,尤其是使用其做数据采集的项目中经常需要给你数据打上时间的标签就需要实时获取系统的相对时间。
当然,我们可以单独开一个时钟来计时,但是我们在使用操作系统的时候就已经选用了一个定时器,这个定时器做的事情很简单就是为操作系统提供时间节拍,如果我们能够使用这个时钟就能减少很多的初始化定时器的工作,而且能够省下一个定时器。
我们都知道使用cube_MX生成带有free_RTOS操作系统的工程中的时钟节拍都是1ms(当然这个时间有的选择,但是最好保持为默认的1ms)。于是,我们是否可以使用这个时钟节拍来获取我们所需要的系统时间,答案当然是可以的。在使用cube_MX生成的工程的main.c文件中可以找到HAL_TIM_PeriodElapsedCallback()这样一个函数,如下

 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM6) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */

  /* USER CODE END Callback 1 */
}

我这边使用的是TIM6为操作系统提供基础时钟,这个定时器6的回调函数中有一个HAL_IncTick(),这个函数就是系统滴答时钟递增函数,是的,毫秒级别的,我们进入这个函数看看

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

里面就一条语句,很好理解,全局变量uwTick就是操作系统的滴答时钟计数器,于是我们只要在使用中获取到这个变量的数值就能获取操作系统的相对时间,相对于系统开始运行的时间的毫秒数。往下看一看,果然由这个提供变量数据的函数,所以我们直接使用这个函数就能获取操作系统相对的系统时钟

/**
  * @brief Provides a tick value in millisecond.
  * @note This function is declared as __weak to be overwritten in case of other 
  *       implementations in user file.
  * @retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

在这里使用的是一个uint32_t的数据类型来表示操作系统的系统时钟,但是真的能够满足我们的需求吗?我们可以计算一下这个操作系统时钟的适用范围。可以使用如下公式计算从这个变量从开始计数到他置零经历的时间
sec: 2^32/1000 = 4294967296/1000=4294967.296
min: sec/60 = 71582.78826666
hour: min/60 = 1193.04647111
day: hour/24 = 49.7102696969
这样这个变量可以跑超过49天才会被置零,足够我们使用,但是要注意49天这个期限。
我们可以重新封装一下这个函数

uint32_t Get_sys_time_ms(void)
{
	return HAL_GetTick();
}

完美,但是有时候我们需要精度更高的系统时间怎么办?
这很好办,操作系统使用的心跳是按照ms来计的,但是他对于我们所选用的系统定时的操作是us级别的,周期为999us,正好在一次定时器的中断到来的时候上升1ms,所以我们可以将HAL_GetTick()的毫秒时钟乘以1000然后叫上定时器的计数就可以获得系统的相对时间,us级别的。

uint32_t Get_sys_time_us(void)
{
  uint32_t sys_us = 1000*HAL_GetTick()+TIM6->CNT;
  return sys_us;
}

如此我们就提供了系统微秒级别的系统相对时间。但是这个更需要考虑时间的范围(量程),它只能表示几个小时。
到这里大家又想到了,使用两个数据来表示就可以获得更大的量程了,是的,这个很简单自己去完成就行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32使用FREERTOS获取系统时间 的相关文章

随机推荐

  • 1.unity3d Astar pathfinding 第一个例子

    1 场景准备 先建立一个scene 添加一个plane xff0c 让其坐标处于 0 0 0 xff0c 并三方向scale都为10 添加一个新的layer xff0c 命名为Ground xff0c 并将上面建立的plane设置为Grou
  • [STM32]开源多功能DAP 脱机烧录器 DAPLink仿真下载器

    网上已经有很多开源脱机烧录器的了 xff0c XVIN1987的很小巧 xff0c 很有参考价值 xff0c 志明的很庞大 xff0c 源码较多较复杂 xff0c 于是自己在无线DAP的基础上 xff0c 添加了脱机烧录功能 xff0c u
  • 全志V3S 入门 RTL8723BS 连接wifi

    开发板 xff1a 荔枝派zero linux xff1a 5 10 rootfs xff1a buildroot 2017 8 1 使用最新的主线linux内核5 10 xff0c 主线5 10内核linux make ARCH 61 a
  • ESP32蓝牙 华为手机容易断连解决

    在长达两年的售后中 xff0c 收到华为手机连接ESP32蓝牙是最容易断开连接的 xff0c 一开始小米手机 苹果手机都没问题 xff0c 就只有华为 xff0c 一连上就断开 xff0c 所以我们认为是APP问题 xff0c 于是我们去找
  • ESP32-S3 LVGL http下载B站头像 JPG显示

    最近在用ESP32S3获取B站JPG头像进行显示 记录一下 xff0c 开发板链接 xff1a ESP32 S3 LVGL 开发板 人工智能语音识别 人脸识别 触摸 音频 淘宝网 taobao com 直接上代码 xff1a 第一种下载方式
  • Docker概述(二)(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 Docker概述 xff08 二 xff09 文章目录 Docker概述 xff08
  • 【串口通信】K210与STM32串口通信、K210与OpenMV串口通信

    串口通信 K210与STM32串口通信 K210与OpenMV串口通信 串口通信前言为何需要串口通信 K210如何进行串口通信K210串口配置K210串口发送相关定义K210串口发送测试K210串口接收相关定义K210串口接收测试 STM3
  • 【ESP32S3系列】1、使用ESP32S3开发板点亮WS2812

    开发板链接 xff1a ESP32 S3 LVGL 开发板BLE人工智能语音人脸识别触摸 音频芯片wifi 淘宝网 taobao com 板子上的LED是WS2812 xff0c 它的引脚分别是 xff1a VDD xff1a 电源 xff
  • win10 使用sonarqube扫描ESP32 C语言工程代码

    社区版的扫描不了C代码 xff0c 所以要找个破解的 项目场景 xff1a 最近项目上霍尼韦尔要求使用sonarqube来扫描代码得出漏洞报告 xff0c 网上找了一圈没有比较容易成功的 xff0c 总结下经验 电脑里要有visual st
  • ESP32 如何引入静态库lib.a

    只需要在Cmakelist txt里这样写 xff1a 如果这个lib正常运行的话需要用到json和lwip相关的函数 xff0c 那就添加一个PRIV REQUIRES 这个component的名字即可
  • OPENMV结合PIX飞控实现四轴定点 循迹 2017电赛

    本文章代码已上传Github xff1a https github com Kevincoooool 2017 Follow 有兴趣的可以加个STAR 自从17年国赛之后 xff0c 自己做了openmv xff0c 加了很多群 xff0c
  • 简易旋转倒立摆设计报告

    完整文档和源码 xff1a https github com Kevincoooool inverted pendulum 43 2017年成都信息工程大学 第六届 电协杯 电子设计竞赛 简易旋转倒立摆及控制装置 xff08 I题 xff0
  • OpenMV-IDE 免KEY提示 编译教程

    很多人在购买了OpenMV之后都没有购买key xff0c 虽然key作为一种捐赠开发者的形式存在 xff0c 但大多数人都是不愿意每次使用都看到那三个提示框的 xff0c 而且不愿意去购买key xff0c 附上我的编译教程 xff1a
  • OpenMV H7也就是OpenMV4来啦 最新

    17年开始做过了四个版本的openmv 可谓是电赛好帮手 开发了两年的openmv xff0c 我的目的就是让openmv变得便宜 目前官方的第四代openmv还在众筹中 xff1a https www kickstarter com pr
  • 开源一个安卓四轴上位机+配套ESP8266 UDP串口通信源码

    手机APP是由匿名四轴遥控器修改而来 xff0c 在原有基础上添加了双摇杆控制和单摇杆控制 数据通过UDP和ESP8266通信 协议可修改 安卓app源码 xff1a https github com Kevincoooool KSTC V
  • c++中函数屏蔽和函数参数屏蔽

    情况一 函数的屏蔽 例如 nbsp nbsp void Function int a int b nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp int c a b 若是不使用函
  • STM32串口之奇偶校验设置

    今天 xff0c 在调试rs485的时候出现了32芯片串口端可以正常发送数据 xff0c 485芯片数据输出端不能发送数据 xff0c 自己查了下485芯片手册 xff0c 发现485芯片有个引脚通过32芯片给出高低电平来控制它是接受还是发
  • 基于AudioQueue实现音频的录制和播放(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 基于AudioQueue实现音频的录制和播放 文章目录 基于AudioQueue实现音
  • webots建立四连杆机构模型

    webots建立四连杆机构模型 使用webots内置的插件构建四连杆机构建立robot形状参考文献 使用webots内置的插件构建四连杆机构 首先 xff0c 可以去官网下载最新的webots xff0c 网址 xff1a https ww
  • STM32使用FREERTOS获取系统时间

    使用CUBE MX生成带有free RTOS操作系统的工程 xff0c 我们经常会使用到系统相对时间 xff0c 尤其是使用其做数据采集的项目中经常需要给你数据打上时间的标签就需要实时获取系统的相对时间 当然 xff0c 我们可以单独开一个