基于STM32定时器中断讲解(HAL库)

基于STM32定时器中断讲解(HAL库)

1、定时器简单介绍

以STM32F103C8T6中几个定时器为例

  1. TIM1:这是一个高级定时器,不仅具备基本的定时中断功能,还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景,为开发者提供强大的时间控制和信号处理能力。
  2. TIM2、TIM3和TIM4:这些是通用定时器,同样具有定时功能,但在功能上与高级定时器有所区别。通用定时器通常用于实现一些基本的定时任务,如LED闪烁、脉冲宽度测量等。
    每个定时器都由一个**16位计数器、预分频器和自动重装寄存器的时基单元组成。**预分频器可以对时钟进行分频,计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时,会触发中断,从而执行相应的定时任务。
    以下是总结框图
    在这里插入图片描述

2、定时器工作原理

定时器核心是计数器。
在这里插入图片描述
在这里插入图片描述

讲解:首先时钟源经过预分频器(一般为72MHZ/36MHZ),内部一般取72,然后进行计数,当计数器时间超过预设时间,则会产生中端。ARR是为了将CNT进行自动清空,重新计数。

3、定时器框图

参考stm32f103c8t6中文参考手册:
在这里插入图片描述
为防止看不同,特地将此图进行简化,以下是简化图:
在这里插入图片描述
结合手册进行观看。【注意:PSC写0则为1分频】

4、定时器计数模式

计数模式主要分为向上计数、向下计数、中心对齐计数。
在这里插入图片描述
下图为三种计数方式的图解:

在这里插入图片描述
当溢出时则会触发中断。一般采用向上计数。

5、定时器溢出时间计算

在这里插入图片描述
举例:如用内部时钟源72MHZ则(PSC+1)/F=T=1/f,表示计一个数所用的时间。ARR为重装载,根据所需要的时间Tout来配置重装载(ARR+1)表示要计的数目。
比如要计500ms,则ARR可以为4999,PSC为7199。

6、定时器中断的配置

#include "timer.h"
#include "led.h"
TIM_HandleTypeDef timer_handle = {0};//定义结构体//时基工作参数配置
void timer_init(uint16_t ARR,uint16_t PSC)//传入ARR自动重装寄存器和PSC分频(16位寄存器)
{timer_handle.Instance = TIM2;//用哪个时钟timer_handle.Init.Prescaler = PSC;//PSC分频timer_handle.Init.Period = ARR;//传入ARR自动重装寄存器的值timer_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式向上计数timer_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//自动重载寄存器(可用可不用)HAL_TIM_Base_Init(&timer_handle);HAL_TIM_Base_Start_IT(&timer_handle);
}//map函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)//弱函数经常被其他函数直接自动调用
{if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE();HAL_NVIC_SetPriority(TIM2_IRQn,2,2);HAL_NVIC_EnableIRQ(TIM2_IRQn);}}//中断服务函数编写
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&timer_handle);//公共中断函数
}//回调函数配置
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//弱函数经常被其他函数直接自动调用
{
if(htim->Instance == TIM2)
{led_toggle();//写入功能,根据自己需要进行完善
}
}
//弱函数拿指针定义,其余拿变量    

附图:在这里插入图片描述
定时器中断配置图。

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

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

相关文章

UE5 项目迁移 注意事项记录

做项目的时候项目越做越大 132g的体量一旦移动复制就耗时间 这个时候迁移派上了用场 前置知识:会使用基本ue迁移流程 以下是迁移注意事项 迁移步骤 首先把项目插件plugins复制粘贴到新项目中其次把.project文本形式 全部复制粘贴新项目中开始迁移项目 选中要迁移的…

套接字+Socket连接

制作加载中动画: 创建Panel,制作预制体,在Image游戏物体中添加DOTween插件,相关设置如下: (此为DOTween Pro,需付费,也可按下面的数值编写代码解决) Socket套接字 套接字就是将IP地址与主机端口号合并在一…

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析

一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …

使用Rust + WebAssembly提升前端渲染性能:从原理到落地

一、问题背景:为什么选择WebAssembly? 最近在开发数据可视化大屏项目时,我们遇到了一个棘手的问题:前端需要实时渲染10万数据点的动态散点图,使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言,3DMAX的UV By Element修改器无疑是一款高效工具,它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…

【神经网络与深度学习】改变随机种子可以提升模型性能?

引言 随机种子在机器学习和数据处理领域中至关重要,它决定了模型训练、数据划分以及参数初始化的随机性。虽然固定随机种子能确保实验的可重复性,但改变随机种子有时会意外提升模型性能。本文将探讨这一现象的潜在原因,并揭示随机性如何影响…

java技术总监简历模板

模板信息 简历范文名称:java技术总监简历模板,所属行业:其他 | 职位,模板编号:XDNUTA 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…

OpenLayers:侦听缩放级别的变化

在实际开发中我们常常需要根据不同的缩放级别设置不同的展示效果或者执行不同的操作,因此侦听缩放级别的变化就很重要。想要侦听变化就需要依赖于OpenLayers中的事件系统,下面我将介绍两个相关的事件。 一、地图事件 moveend 1.介绍 在地图的移动结束…

Langchain4j基于ElasticSearch的向量数据库配置后,启动报错

报错信息: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failedat co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:34…

如何解决 403 错误:请求被拒绝,无法连接到服务器

解决 403 错误:请求被拒绝,无法连接到服务器 当您在浏览网站或应用时,遇到 403 错误,通常会显示类似的消息: The request could not be satisfied. Request blocked. We can’t connect to the server for this app o…

PyTorch 2.0编译模式深度评测:图优化对GPU利用率的影响

一、编译革命的性能拐点 PyTorch 2.0的torch.compile通过TorchDynamo与XLA两种编译模式,将动态图执行效率推向新高度。本文基于NVIDIA A100与Google TPUv4硬件平台,通过ResNet-50、Transformer-XL等典型模型,揭示不同编译策略对GPU资源利用率…

在CentOS环境中安装MySQL数据库保姆级教程

一.确认当前系统版本 1.1登录系统,切换至root账户 如图所示: 1.2:在终端中执行如下命令查看系统版本 cat /etc/redhat-release 二.添加 MySQL Yum 源 2.1访问MySQL开发者专区 https://dev.mysql.com/downloads/repo/yum/ TIPS: 1.发布包命…

SpringBoot智能排课系统源码开发与实现

概述 基于SpringBoot框架开发的智能排课系统。该系统是一款功能完善的校园管理系统,包含管理员、教师和学生三种角色权限,实现了课程管理、排课算法、成绩录入等核心功能,是学习SpringBoot开发和企业级项目实践的优质资源。 主要内容 1. 管…

探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析

在 RocketMQ 构建高可靠、强一致性消息系统的架构中,DLedgerServer 扮演着举足轻重的角色,而 MemberState 作为 DLedgerServer 内部用于描述节点状态的核心类,更是整个分布式日志模块稳定运行的关键。深入理解 MemberState 的设计理念、功能特…

字符串匹配 之 KMP算法

文章目录 习题28.找出字符串中第一个匹配项的下标1392.最长快乐前缀 本博客充分参考灵神和知乎的另一位博主 灵神KMP算法模版 知乎博主通俗易懂讲解 对于给定一个主串S和一个模式串P,如果让你求解出模式串P在主串S中匹配的情况下的所有的开始下标简单的做法又称为Brute-Force算…

Nginx相关知识

目录 一.HTTP请求数据在服务器中的传输与处理详解 1.2 套字节 1.3 零拷贝技术 二.I/O模型 2.1 I/O模型简介 2.2 常见的I/O模型及其特点 1.同步/异步 2.阻塞vs 非阻塞 3. 同步/异步与阻塞/非阻塞的关系 4.多路复用I/O模型 5.异步I/O模型 三.Nginx模块 3.1 概述ng…

分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告

数字经济浪潮奔涌向前,Web3.0发展方兴未艾,分布式数字身份(Decentralized Identity,简称DID)通过将分布式账本技术与身份治理相融合,在Web3.0时代多方协作的分布式应用场景中发挥核心作用,是构建…

ES6入门---第三单元 模块四:Set和WeakSet

set数据结构: 类似数组,但是里面不能有重复值,如果有,只显示一个 set用法: let setArr new Set([a,b]); setArr.add(a); 往setArr里面添加一项 let setArr new Set().add(a).add(b).add(c); setArr.delete(b); 删除一项 setArr.ha…

Cognito

首先Cognito没有提供登录至AWS控制台的功能,然而您可以通过Cognito Identity Pool获取到IAM role的credentials [1],再另外通过代码自行将IAM role credentials拼凑成AWS控制台登录的URL [2]。 最后,由于Cognito的使用除了User Pool以及Iden…

EfficientNet 改进:与Transformer结合的图像分类模型

1.介绍 在计算机视觉领域,EfficientNet因其高效的网络架构设计而广受欢迎。 本文将深入分析一个结合EfficientNet主干和Transformer分类头的创新模型实现。 模型概述 这个实现将EfficientNet的高效特征提取能力与Transformer的强大序列建模能力相结合,主要包含以下几个核心…