当前位置: 首页 > news >正文

2、HAL库利用滴答定时器systick(1ms中断)实现时间计数戳

文档说明:通过滴答定时器的1ms中断实现时间计数,标记需要的时间标志,在主函数中查询标志,避免延时函数消耗CPU

1、HAL库systick定时器说明

在CubeMx生成的代码main()函数首先执行的函数为HAL_Init();里面会进行滴答定时器初始化;

/*** @brief  This function is used to initialize the HAL Library; it must be the first *         instruction to be executed in the main program (before to call any other*         HAL function), it performs the following:*           Configure the Flash prefetch, instruction and Data caches.*           Configures the SysTick to generate an interrupt each 1 millisecond,*           which is clocked by the HSI (at this stage, the clock is not yet*           configured and thus the system is running from the internal HSI at 16 MHz).*           Set NVIC Group Priority to 4.*           Calls the HAL_MspInit() callback function defined in user file *           "stm32f4xx_hal_msp.c" to do the global low level hardware initialization *            * @note   SysTick is used as time base for the HAL_Delay() function, the application*         need to ensure that the SysTick time base is always set to 1 millisecond*         to have correct HAL operation.* @retval HAL status*/
HAL_StatusTypeDef HAL_Init(void)
{/* Configure Flash prefetch, Instruction cache, Data cache */ 
#if (INSTRUCTION_CACHE_ENABLE != 0U)__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE */#if (DATA_CACHE_ENABLE != 0U)__HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */#if (PREFETCH_ENABLE != 0U)__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE *//* Set Interrupt Group Priority */HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */HAL_InitTick(TICK_INT_PRIORITY);/* Init the low level hardware */HAL_MspInit();/* Return function status */return HAL_OK;
}

此处就是在做初始化滴答定时器:

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */HAL_InitTick(TICK_INT_PRIORITY);

意思就是他的中断函数会1ms调用1次,HAL_InitTick函数里面就是实现配置的

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{/* Configure the SysTick to have interrupt in 1ms time basis*/if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U){return HAL_ERROR;}......return HAL_OK;
}typedef enum
{HAL_TICK_FREQ_10HZ         = 100U,HAL_TICK_FREQ_100HZ        = 10U,HAL_TICK_FREQ_1KHZ         = 1U,HAL_TICK_FREQ_DEFAULT      = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

由此可得HAL_SYSTICK_Config(系统时钟/1000U/1),所以是1KHz的中断

2、时间戳文件

Timestamp_Driver.h

#ifndef _Timestamp_Driver_H_
#define _Timestamp_Driver_H_
#include "main.h"typedef enum
{Timestamp_10ms    = 0,Timestamp_50ms    = 1,Timestamp_100ms   = 2,Timestamp_200ms   = 3,Timestamp_500ms   = 4,Timestamp_1s      = 5,Timestamp_2s      = 6,Timestamp_10s     = 7,
}Timestamp_Flag_EnumDef;typedef struct
{/******************************* bit  Annotation:Timestamp_Flag_EnumDef 使用后需自行清零* 7--10s* 6--2s* 5--1s* 4--500ms* 3--200ms* 2--100ms* 1--50ms* 0--10ms* ***************************/uint8_t Flag;uint16_t msCnt;//Max 10s
}Timestamp_User_StructDef;extern void Timestamp_UserInit(Timestamp_User_StructDef *p);
extern void Timestamp_Timer(Timestamp_User_StructDef *p);
extern uint8_t Timestamp_GetStatus(Timestamp_User_StructDef *p,Timestamp_Flag_EnumDef flag);#endif

Timestamp_Driver.c

/**********************************************************************
*file:时间戳文件
*author:残梦
*date:2022.9.2
*note:注:用户禁止使用、更改
为了方便将时间进行计数划分,方便将任务按实时性划分运行,减少消耗
**********************************************************************/
#include "Timestamp_Driver.h"/****************************************
@function:时间戳初始化
@param:
@return:void
@date:2022.9.2
@note:
****************************************/
void Timestamp_UserInit(Timestamp_User_StructDef *p)
{p->msCnt = 0;  p->Flag = 0;
}/****************************************
@function:时间戳计时器
@param:
@return:void
@date:2022.9.2
@note:
****************************************/
void Timestamp_Timer(Timestamp_User_StructDef *p)
{p->msCnt++;p->Flag |= ((((p->msCnt % 10) == 0)?1:0) << Timestamp_10ms);p->Flag |= ((((p->msCnt % 50) == 0)?1:0) << Timestamp_50ms);p->Flag |= ((((p->msCnt % 100) == 0)?1:0) << Timestamp_100ms);p->Flag |= ((((p->msCnt % 200) == 0)?1:0) << Timestamp_200ms);p->Flag |= ((((p->msCnt % 500) == 0)?1:0) << Timestamp_500ms);p->Flag |= ((((p->msCnt % 1000) == 0)?1:0) << Timestamp_1s);p->Flag |= ((((p->msCnt % 2000) == 0)?1:0) << Timestamp_2s);p->Flag |= ((((p->msCnt % 10000) == 0)?1:0) << Timestamp_10s);p->msCnt = (p->msCnt >= 10000)?0:p->msCnt;
}/****************************************
@function:获取时间戳x状态
@param:flag--Timestamp_Flag_EnumDef
@return:0--无效,1--有效
@date:2022.8.13
@note:
****************************************/
uint8_t Timestamp_GetStatus(Timestamp_User_StructDef *p,Timestamp_Flag_EnumDef flag)
{uint8_t temp = 0,status = 0;temp = 1 << flag;status = (p->Flag & temp)?1:0;p->Flag &= (~temp);return status;
}

说明:此文件其实就是循环计数1ms计算时间是否等于标志时间,没什么特别的

3、使用时间戳

1、添加文件Timestamp_Driver.c到工程
2、定义时间戳变量

Timestamp_User_StructDef TimestampNRT;//定义时间戳:SysTick_Handler()调用计数

3、主函数初始化时间戳

Timestamp_UserInit(&TimestampNRT);

4、滴答定时器中断服务函数中调用时间戳计数函数

void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 */extern Timestamp_User_StructDef TimestampNRT;//时间戳Timestamp_Timer(&TimestampNRT);  //1ms计数一次/* USER CODE END SysTick_IRQn 1 */
}

5、main()函数while中查询时间标志并执行操作

    if(Timestamp_GetStatus(&TimestampNRT,Timestamp_1s))//标志会查询后清除{printf("Timestamp_1s\r\n");}

相关文章:

2、HAL库利用滴答定时器systick(1ms中断)实现时间计数戳

文档说明&#xff1a;通过滴答定时器的1ms中断实现时间计数&#xff0c;标记需要的时间标志&#xff0c;在主函数中查询标志&#xff0c;避免延时函数消耗CPU 1、HAL库systick定时器说明 在CubeMx生成的代码main()函数首先执行的函数为HAL_Init();里面会进行滴答定时器初始化…...

Spring入门学习

Spring入门学习 文章目录Spring入门学习Spring概述Spring FrameworkIOCIOC容器DIIOC容器的实现类①FileSystemXmlApplicationContext②ClassPathXmlApplicationContext基于XML管理bean入门案例创建类创建xml在Spring配置文件中配置bean测试Spring概述 Spring 是最受欢迎的企业级…...

webpack(4版本)使用

webpack简介&#xff1a;webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器(module bundler)。在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析&#xff0c;打包生成对应的静态资源(bundle)…...

Linux安装ElasticSearch

下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 1 版本选择 ElasticSearch 7 及以上版本都是自带的 jdk&#xff0c;假如需要配置指定的 jdk 版本的话&#xff0c;可以在 es 的 bin 目录下找到elasticsearch-env.bat 这个文件&#x…...

Linux中C语言编程经验总结

​ 修改记录 版本号日期更改理由V1.02022-03-15MD化 总则 仅总结一些常用且实用的编程规范和技巧&#xff0c;且避免记忆负担&#xff0c;聚焦影响比较大的20% ! 编译器 打开全warning编译器开关 正例 gcc -W -Wall -g -o someProc main.c反例 gcc -g -o someProc main…...

jvisualvm工具使用

jdk自带的工具jvisualvm&#xff0c;可以分析java内存使用情况&#xff0c;jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存&#xff0c;打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…...

redis五大IO网络模型、内存回收

目录1.0用户空间和内核态空间1.1 网络模型-阻塞IO1.2 网络模型-非阻塞IO1.3 网络模型-IO多路复用1.3.1 网络模型-IO多路复用-select方式1.3.2 网络模型-IO多路复用模型-poll模式1.3.3 网络模型-IO多路复用模型-epoll函数1.3.4 网络模型-epoll中的ET和LT1.3.5 网络模型-基于epol…...

【C/C++】内存管理详解

目录内存布局思维导图1.C/C内存分布数据段&#xff1a;栈&#xff1a;代码段&#xff1a;堆:2.C语言中动态内存管理方式3.C内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型4.operator new 与 operator delete函数5.new和delete的实现原理5.1内置类型5.2自定…...

Android ProcessLifecycleOwner 观察进程生命周期

文章目录简介使用依赖用法1&#xff0c;结合 LiveData用法2&#xff0c;获取 owner的 lifecycle 实例&#xff0c;并对 lifecycle 添加观察者简介 ProcessLifecycleOwner 直译&#xff0c;就是&#xff0c;进程生命周期所有者。 通过 DOC 注释了解到&#xff1a; Lifecycle.E…...

如何编写一个 npm 插件?

提到写 npm 插件&#xff0c;很多没搞过的可能第一感觉觉得很难&#xff0c;无从下手&#xff0c;其实不然。 我们甚至写个简单的 console.log(hello word)&#xff0c;都是可以当成一个插件发布上去的。 其实无从下手的主要难点还是在于你的具体要做的功能逻辑&#xff0c;这…...

mapstruct- 让VO,DTO,ENTITY转换更加便捷

mapstruct- 让VO&#xff0c;DTO&#xff0c;ENTITY转换更加便捷 1. 简介 MapStruct是一个代码生成器&#xff0c;简化了不同的Java Bean之间映射的处理&#xff0c;所谓映射指的就是从一个实体变化成一个实体。例如我们在实际开发中&#xff0c;DAO层的实体和一些数据传输对…...

IAR警告抑制及还原

工作中需要临时抑制 警告 Pa084&#xff0c;源代码如下&#xff1a; sy_errno_t sy_memset_s(void *dest, sy_rsize_t dmax, int value, sy_rsize_t n) { sy_errno_t err; if (dest NULL) { return SY_ESNULLP; } if (dmax > SY_RSIZE…...

工厂模式(Factory Pattern)

1.什么是工厂模式 定义一个创建对象的接口&#xff0c;让其子类自己决定实例化哪一个工厂类&#xff0c;工厂模式使其创建过程延迟到子类进行。 2.工厂模式的作用 实现创建者和调用者的分离 3.工厂模式的分类 简单工厂模式工厂方法模式抽象工厂模式 4.工厂模式的优缺点 优…...

JavaScript语法学习--《JavaScript编程全解》

《JavaScript编程全解》 JavaScript琐碎基础 0.前言 1.RN: react native是Facebook于2015年4月开源的跨平台移动应用开发框架&#xff0c;是Facebook早先开源的JS框架 React 在原生移动应用平台的衍生产物&#xff0c;支持iOS和安卓两大平台。 2.ts与js js&#xff1a;是弱…...

linux安装极狐gitlab

1. 官网寻找安装方式 不管我们使用任何软件&#xff0c;最靠谱的方式就是查看官方文档。gitlab提供了相应的安装文档&#xff0c;并且有对应的中文文档。地址如下&#xff1a; https://gitlab.cn/install/ 我在这里以CentOS作为安装示例&#xff0c;大家可根据自己的需要选择…...

软考高级信息系统项目管理(高项)原创论文——人力资源管理

人力资源管理 某市某国有装备制造公司智能安防信息管控平台项目是在公司推进企业信息化进程和实现企业可持续发展的背景下于2016年8月提出来的,我公司积极应标并最终顺利中标,而我有幸被任命为项目经理,担任起该项目的管理工作。该项目投资金额为530万元,其中软件部分为360…...

Java Lambda表达式 匿名内部类 函数式接口(FunctionalInterface)

Java Lambda表达式定义背景示例匿名类实现Lambda表达式实现对比匿名类和Lambda实现Lambda表达式&#xff08;调用&#xff09;说明Lambda表达式的语法Java 1.8 新特性&#xff1a;函数式接口jdk 1.8 自带的函数式接口 &#xff08;举例&#xff09;定义 参考Oracle官网&#x…...

javaEE 初阶 — 流量控制与拥塞控制

文章目录1. 流量控制2. 拥塞控制TCP 工作机制&#xff1a;确认应答机制 超时重传机制 连接管理机制 滑动窗口 1. 流量控制 流量控制是一种干扰发送的窗口大小的机制&#xff0c;滑动窗口&#xff0c;窗口越大&#xff0c;传输的效率就越高&#xff08;一份时间&#xff0c;…...

HTML自主学习 - 2

一、表格 基本语法 <table><tr><td>单元格内容1</td><td>单元格内容2</td><td>单元格内容3</td></tr></table> 1、<table> </table>标签用于定义表格 2、<tr> </tr>标签用于定义表格的…...

【转载】通过HAL库实现MODBUS从机程序编写与调试-----STM32CubeMX操作篇

通过HAL库实现MODBUS从机程序编写与调试-----STM32CubeMX操作篇[【STM32】RS485 Modbus协议 采集传感器数据](https://blog.csdn.net/qq_33033059/article/details/106935583)基于STM32的ModbusRtu通信--ModbusRtu协议(一)基于STM32的ModbusRtu通信--终极Demo设计(二)STM32RS48…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...