定时器TIM配置微妙延时函数

定时器TIM配置微妙延时函数

文章目录

  • 定时器TIM配置微妙延时函数
    • `开胃小菜(BOOT0、BOOT1)`
      • Boot0
      • Boot1(如果有)
    • 三种定时器
      • 高级控制定时器(TIM1,TIM8)
      • 通用定时器(TIM2, TIM3, TIM4, TIM5)
      • 基本定时器(TIM6, TIM7)
    • `TIM6配置Delay_us()`
      • `Prescaler (分频系数)`
      • `Counter Mode (计数模式)`
      • `Counter Period (重载值)`
      • `auto-reload preload (自动重载预载)`
      • `代码`
      • `重要问题`
      • `简单粗暴的毫秒延时,取别名`
    • `PS:定时器中断服务函数`
  • `如果对你有帮助,就点赞收藏把!(。・ω・。)ノ♡`


开胃小菜(BOOT0、BOOT1)

在STM32系列微控制器中,Boot0和Boot1是两个用于 选择启动模式 的引脚。
主要功能是决定芯片启动时加载哪个存储区域的代码
这两个引脚的状态组合决定了微控制器从哪个内存位置开始执行代码,从而影响启动过程和运行的固件。

Boot0

这个引脚通常用于选择启动模式。
例如,在STM32F103RCT6芯片中
如果Boot0引脚被拉高(通常连接到VCC),则微控制器将从Flash存储器启动;
如果Boot0引脚被拉低(通常连接到GND),则将从SRAM启动。
这是一种常见的配置,但具体行为可能会根据不同的STM32系列略有变化,所以最好查阅相应芯片的数据手册以获取准确信息。

Boot1(如果有)

有些STM32芯片可能还有一个Boot1引脚,用于进一步扩展启动模式的选择。
结合Boot0和Boot1的不同电平状态,可以选择从不同的存储介质启动,如系统存储器、用户闪存或其他。

不同STM32芯片上有不同的配置和选项,Boot0和Boot1的功能,需要查看该芯片的参考手册或数据表来确定

三种定时器

stm32f103芯片一般包含了以下类型的定时器:

高级控制定时器(TIM1,TIM8)

STM32F1系列微控制器中功能最强大的定时器,通常用于电机控制等高级应用,支持多达4路的PWM输出、捕获和比较模式等多种功能。高级控制定时器可以实现复杂的波形生成和电机控制策略,如PID控制、死区时间设置等。

通用定时器(TIM2, TIM3, TIM4, TIM5)

通用定时器是最常用的定时器类型,适用于多种用途,可以用于生成脉冲宽度调制(PWM)信号(PWM输出、输入捕获和输出比较)、计数外部事件等。通用定时器通常具有多个通道,每个通道都可以独立地进行配置和使用。

基本定时器(TIM6, TIM7)

基本定时器相对简单,通常用于 简单的计数 或产生基本的 时间延迟 。它们的功能不如通用定时器丰富,但在一些简单的应用场合非常有用。

TIM6配置Delay_us()

采用的是stm32f103芯片,8M外接晶振,所以系统时钟为72MHz。
使用软件stm32cubeode

.IOS 配置如下:

在这里插入图片描述
Prescaler-------------------分频系数
Counter Mode------------计数模式(方向)
Counter Period ----------重装载值
auto-reloadpreload------自动重载预载

Prescaler (分频系数)

设置适当的预分频系数,可以调整定时器计数器的时钟频率,从而改变定时器计数的速度。
确保定时器以所需的频率进行计数,这对于生成精确的时间延迟或周期性事件至关重要。
比如说,上面设置的是72分频,已知系统时钟频率是 72 M H z 72MHz 72MHz
所以定时器时钟就是 72 M H z / 72 = 1 M H z 72MHz/72 = 1MHz 72MHz/72=1MHz ,即 定时器每计数一次耗时 1 u s 1us 1us

Counter Mode (计数模式)

在大多数定时器中,计数模式可以是 向上计数向下计数双向计数
这决定了定时器计数器的计数方向。
选择正确的计数模式对于满足特定应用的需求非常重要。
向上计数:从0开始计数到65535
向下计数:从65535开始计数到0
双向计数:计数器从一个设定的值开始,向上计数到最大值,然后向下计数到最小值,如此循环。
双向计数通常用于需要测量周期性事件或信号的频率和持续时间

Counter Period (重载值)

定时器计数器在达到该值后产生事件(如中断或复位)的周期长度。
设置合适的重载值定义了定时器计数器的周期,这可以用于生成特定的时间间隔或频率。
通俗来讲
向上计数:计数器从0开始计数,计数到65535(重载值),就会触发事件。
向下计数:计数器从65535(重载值)开始计数,计数到0,就会触发事件。

auto-reload preload (自动重载预载)

当设置此功能时,每当计数器达到预设的重载值(65535)时,它会自动重新加载预设值(65535),从而使定时器能够无缝地继续计数。这允许定时器持续运行,无需软件干预,适用于需要连续或周期性操作的应用。

代码

在这里插入图片描述
设置分频系数,由于初始化的时候已经设置好了,这里可以不设置了;

设置重装载值,写延时函数的话,
向上计数这一行绝对不能要
向下技术根据实际情况来设置
写定时器中断服务函数也需要

部分博主无脑搬运,工程师们可要仔细辨认

计数值归零,实际上就是将0赋值给计数器的初始值
可以F12跳转到宏定义

/**
  * @brief  Set the TIM Counter Register value on runtime.
  * @param  __HANDLE__ TIM handle.
  * @param  __COUNTER__ specifies the Counter register new value.
  * @retval None
  */
#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__)  ((__HANDLE__)->Instance->CNT = (__COUNTER__))

实际上就是一个赋值
写成这样也可以

__HAL_TIM_SET_COUNTER(&htim6,0);//把定时器计数值归零

开启定时器,获取计数值,如果计数值达到输入 u s us us 次,则关闭定时器

__HAL_TIM_GET_COUNTER(&htim6) //获取计数值

重要问题

为什么向上计数时 第201行 不能要?
举个例子:
比如我输入的是1000,也就是Timer6_Delay_us(1000);(即us = 1000;)
我们看看这个函数的原型

/**
  * @brief  Set the TIM Autoreload Register value on runtime without calling another time any Init function.
  * @param  __HANDLE__ TIM handle.
  * @param  __AUTORELOAD__ specifies the Counter register new value.
  * @retval None
  */
#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \
  do{                                                    \
    (__HANDLE__)->Instance->ARR = (__AUTORELOAD__);  \
    (__HANDLE__)->Init.Period = (__AUTORELOAD__);    \
  } while(0)

倒数第二行

 (__HANDLE__)->Init.Period = (__AUTORELOAD__);    \

Period 是不是很眼熟?-------->重装载值!!!
也就是将重装载值设置成了999(1000-1),每次计数到999,就会从0重新开始
也就是计数值最大只能到达999(1000-1)
再看跳出 while 循环的条件

	while(1)
	{
	    Count = __HAL_TIM_GET_COUNTER(&htim6);
	    if(Count > us)
	      break;
	}

这里的计数值 Count 最大值只能到达999(1000-1),而我们输入的 u s us us == 1000;
那么这个循环就无法终止也就是为什么卡死在这的原因

为什么一开始用着也没什么事呀?运气好呗,没什么干扰

简单粗暴的毫秒延时,取别名

在这里插入图片描述


PS:定时器中断服务函数

前面说了,如果需要使用定时器中断服务函数,就需要 第201行 或者 提前就设置好重装载值

什么意思呢?

向上计数,从0计数到重装载值,就会自动触发 定时器中断服务函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim7)    //判断是哪个定时器请求的中断 在这个函数里可以if判断多个定时器请求的中断
	{
		//触发事件
	}
}

H A L HAL HAL 库提供了一个回调函数 HAL_TIM_PeriodElapsedCallback
当定时器的周期完成时,这个回调函数会被调用,触发事件。
即计数器的值达到了自动重载寄存器 ARR 的值并发生溢出或更新事件
这个函数通常在定时器的中断服务例程中被调用,允许用户执行一些事件

参数 htim 是一个指向 TIM_HandleTypeDef 结构体的指针,包含了定时器的控制和状态信息。
这个回调函数通常用于处理定时器周期到达时的中断服务例程(ISR)。


┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈┈
┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈
┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈
▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈┈

如果对你有帮助,就点赞收藏把!(。・ω・。)ノ♡

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

dxf数据结构

DXF(Drawing Exchange Format,绘图交换格式)是Autodesk公司开发的一种CAD(计算机辅助设计)文件格式,用于实现AutoCAD与其他软件之间的CAD数据交换。DXF格式文件是一种开放的矢量数据格式,具有多…

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~ 文章目录 怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…

爱秀国际英语公信力怎么样?靠谱吗?

同爱秀国际英语公信力怎么样? ①爱秀国际英语成立于09年,已经有15年的教学积累,专门针对大学生研发的英语口语课程。 ②历年来不仅教学效果显著,在社会上也获得过很多荣誉,在历年的教育大会上也荣获过诸多认可&…

maven私有镜像仓库nexus部署使用

maven私有镜像仓库nexus部署使用 1、Nexus部署 #查找镜像 docker search sonatype/nexus3 #拉取镜像 docker pull sonatype/nexus3 #持久化目录 mkdir -p /data/nexus/data chmod 777 -R /data/nexus/data #启动服务 docker run -d --name nexus3 -p 8081:8081 --restart alw…

创建React 项目的几种方式

①.react自带脚手架 使用步骤: 1、下载 npm i create-react-app -g 2、创建项目命令: create-react-app 项目名称 ②.Vite构建工具创建react步骤:(推荐) 方法一: 1、yarn create vite 2、后续根据提示步…

新书速览|Vue.js 3.x+Express全栈开发:从0到1打造商城项目

《Vue.js 3.xExpress全栈开发:从0到1打造商城项目》 1 本书内容 《Vue.js 3.xExpress全栈开发 : 从0到1打造商城项目》是一本详尽的全栈开发教程,旨在通过Vue.js和Express框架引导读者从零开始构建一个完整的电商项目。内容覆盖电商项目的基本结构&…

OpenCV 看这一篇就够了 持续更新中

目录 一、基础操作 1. openCV界面 2. 图像的基础操作 2.1 图像的输入与输出 2.2 图片的数组的本质 2.3 修改像素尺寸 3. 视频的基础操作 3.1 视频的本质 3.2 视频的输入与输出 3.2.1 视频文件读取 3.2.2 摄像头捕获 3.2.3 视频保存 4. 回调函数 二、界面控件 1.…

家具回收靠谱的平台

在如今的社会,随着生活水平的提高和消费观念的转变,家具的更新换代日益频繁。然而,如何妥善处理旧家具成为了许多人面临的难题。幸运的是,市场上涌现出了众多家具回收平台,为我们解决了这一烦恼。在众多的平台中&#…

微信开发授权登录梳理总结

授权登录流程对比 微信公众号/网页 微信文档地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 流程图如下: 特殊说明: 步骤1拼接的微信地址是:https://open.weixin.qq…

Monaco 多行提示的实现方式

AI 代码助手最近太火爆,国内有模型厂商都有代码助手,代码助手是个比较典型的 AI 应用,主要看前端,后端的模型都差不多,国内外都有专门的代码模型。现在都是集中在 VSCode 和 Idea的插件,本文通过 Monaco 实…

O2OA平台所提供的开箱即用的内置应用

本篇介绍一下O2OA平台所提供的开箱即用的内置应用 作为协同办公领域的快速开发平台,为了让企业能够快速搭建企业级的协同应用,O2OA在设计之初就内置了一些通用的、实用的企业办公应用,如考勤管理,日程管理,会议管理等…

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构:字符串(Strings)、列表(Lists)、哈希表(Hashes)、集合(Sets)和有序集合(Sorted Sets)。这些数据结…

UNI_App平台调试指南 debug(十五)

App平台调试指南 debug 常规开发里,在 HBuilderX 的运行菜单里运行 App,手机端的错误或 console.log 日志信息会直接打印到控制台。 如果需要更多功能,比如审查元素、打断点 debug,则需要启动调试模式。自 HBuilderX 2.0.3+ 版本起开始支持 App 端的调试。 #打开调试窗口…

浅谈三车平台车型对比功能实用奖-竞品分析

目录: 一、项目背景 二、竞品概述 三、竞品目标功能对比 3.1、车型对比入口位置 3.2、车型对比首页 3.3、添加/删除车型功能 3.4、选择车型后功能对比 3.5、配置对比的功能 四、总结 一、项目背景 在汽车购买过程中,消费者经常面临着选择困难&…

腰肌筋膜炎最好的治疗方法

腰部疼痛是腰肌筋膜炎的主要症状,这种疼痛可能是隐痛、酸痛或肿胀痛,且疼痛可能呈持续性或间歇性。在长时间站立、坐姿、弯腰或腰部受寒着凉后,疼痛通常会加重。疼痛可能会扩散到腰部的其他区域,甚至可能影响到臀部或大腿后侧。疼…

【CORS 报错】跨域请求问题:CORS 多种环境下的解决方案

🔥 个人主页:空白诗 文章目录 一、CORS错误的常见原因二、解决方案1. Vue3 Vite项目下的解决方案创建Vue3 Vite项目配置Vite的代理发送请求 2. jQuery项目下的解决方案使用CORS请求头使用JSONP 3. 其他环境下的解决方案使用服务器端代理设置CORS头使用…

推荐一款功能强大的 GPT 学术优化开源项目GPT Academic:学术研究的智能助手

今天,我将向大家介绍一个强大的开源项目—GPT Academic,它或许正是你一直在寻找的理想工具。 已一跃成为 60.4k Star 的热门项目 GPT Academic 目前在 GitHub 上已经揽获了 60.4k 的 Star,这不仅反映了它的受欢迎程度,更证明了它…

汇川伺服 (5)直线驱动器功能

一、直线驱动器 流程 电机参数 设置编码器 设置过载保护线 相序辨识 角度辨识

Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法

一直都是通过OkHttp远程服务端进行数据交互,突发奇想能不能也通过OkHttp在局域网的情况下对两个安卓设备或者手机进行数据交互呢? 这样一方安卓设备要当做服务端与另一个安卓设备通过OkHttp进行数据交互即可 当然还可以通过 socket 和 ServerSocket 通…

【简历】兰州某大学一本硕士:面试通过率基本是为0

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一个一本硕士的Java简历,那这个简历因为学校本身,它是一个一本的硕士,我们一般认为这一本硕士&a…