【STM32】定时器+基本定时器

一、定时器的基本概述

1.软件定时器原理

原来我们使用51单片机的时候,是通过一个__nop()__来进行延时

我们通过软件的方式来进行延时功能是不准确的,受到很多不确定因素。

2.定时器原理:计数之间的比值

因为使用软件延时受到影响,所以我们尽量使用硬件来进行定时。硬件同时执行效率也比软件的高。

3.STM32定时器分类

4.STM32定时器特性表

注意点:

1)基本定时器是向上计数器(递增)

2)预分频器系数是从1-65536(但是实际上存储的数值范围是0-65535)--》所以存在+1和-1的问题

5.STM32基本,通用,高级定时器功能整体区别

二、基本定时器(TIM6/TIM7)

1.基本概念

“触发DAC”---》指的是数据电路和模拟电路之间的转换

2.基本定时器框图

1.注意点

1)基本定时器的时钟源是:内部时钟

2)自动重载寄存器和预分频器都有相对应的影子寄存器

3)决定自动重载寄存器(ARR)和预分频器(PSC)是否马上将值更新(是否有缓冲)到影子寄存器的取决于ARPE位

有缓冲--》减少时间误差

无缓冲---》有大量的时间误差

4)影子寄存器中的值更新也要有事件触发

5)实际起作用的是:影子寄存器,其不能直接被访问到

6)溢出条件是CNT==ARR影子寄存器,而不是ARR本身

7)当溢出时,会产生两种结果:中断和DMA输出   中断事件

2.内部时钟频率问题

1)定时器最终的时钟频率不仅仅取决于外部传入的时钟频率还取决于是否进行分频。

举个例子

3.STM32定时器计数模式及溢出条件

递增计数模式实例说明

递减计数模式实例说明

中心对齐模式实例说明

三、定时器寄存器

1.TIM6 和TIM7 控制寄存器 1(TIMx_CR1)

该寄存器用于设置ARR寄存器是否具有缓冲,并且使能/关闭计数器

是否有缓冲的区别:应用场景

1.假设我们现在让led先亮1s,然后灭,在亮2s,假设1s对应的ARR=99,2s对应的ARR=199

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,我们要修改CNT的值为199,这个修改过程需要浪费时间

b)此时有缓冲,则再亮1s的这个时间段,我们就可以修改ARR=199,因为有缓冲,是等到下一个周期才起作用。

2.假设我们现在让led先亮1s,然后灭,在亮1s,假设1s对应的ARR=99

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

b)此时有缓冲,则再亮1s,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

2.TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)

用于使能更新中断

3. TIM6 和TIM7 状态寄存器(TIMx_SR)

用于判断是否发生更新中断,由硬件置1,软件清零

4. TIM6 和TIM7 计数器(TIMx_CNT)

计数器是可读可写,并且再运行过程中也是可以对其进行修改。

5. TIM6 和TIM7 预分频器(TIMx_PSC)

6. TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

四、定时器溢出时间计算方法

1)这里ARR+1,可以这样理解,例如ARR的值为2,则计数器从0到1,从1到2,此时并不会立刻溢出,而是再经过一个时钟脉冲后才会溢出,所以实际的溢出时间是三个时钟脉冲,即ARR+1个时钟脉冲

2)ARR里面的值是从零开始的

推导过程

溢出时间=计数个数*f

五、定时器中断配置步骤

1.具体步骤

注意点:

1)记得开启计数器

2)记得使能中断(定时器,NVIC)

3)编写中断服务函数

4)设置NVIC,时钟等基础

5)设置定时器相关的基础参数

6)定时器溢出中断中断回调函数

1)定时器初始化--》HAL_TIM_Base_Init

2)设置中断优先级,使能中断---》HAL_NVIC_SetPriority &&  HAL_NVIC_EnableIRQ

3)编写中断服务函数---》去start.s文件中查找对应的名字【TIM6_IRQHandler】然后再这个函数中调用【HAL_TIM_IRQHandler(这个再hal_tim.c中)】

3)编写定时器的回调函数--》这个函数是在中断处理程序中调用的--》HAL_TIM_PeriodElapsedCallback

4)启动定时器(计数器)和中断---》HAL_TIM_Base_Start_IT

2.相关HAL库函数

1.HAL_TIM_OC_Init:定时器初始化

在stm32f1xx_hal_tim.c中

HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)
{/* Check the TIM handle allocation */if (htim == NULL){return HAL_ERROR;}/* Check the parameters */assert_param(IS_TIM_INSTANCE(htim->Instance));assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));if (htim->State == HAL_TIM_STATE_RESET){/* Allocate lock resource and initialize it */htim->Lock = HAL_UNLOCKED;/* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */HAL_TIM_OC_MspInit(htim);}/* Set the TIM state */htim->State = HAL_TIM_STATE_BUSY;/* Init the base time for the Output Compare */TIM_Base_SetConfig(htim->Instance,  &htim->Init);/* Initialize the TIM state*/htim->State = HAL_TIM_STATE_READY;return HAL_OK;
}

关键结构体介绍

2.HAL_TIM_Base_MspInit

这个函数的作用:MSP是指和MCU相关的初始化

 3.HAL_TIM_Base_Start

启动计数器

4.HAL_TIM_Base_Start_IT

启动定时器的中断

5. TIM6_IRQHandler

1)这个函数名根据所使用的定时器类型去start.s中查找

2)再这个函数中调用“HAL_TIM_IRQHandler”

6.HAL_TIM_PeriodElapsedCallback

编写定时器溢出回调函数,这个是用户根据相关的要求编写

三、中断服务函数VS中断回调函数

HAL库中的中断,在callback回调函数和中断函数中处理有何区别 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)

中断服务函数:TIM6_IRQHandler--->这个实际上不编写业务代码,只是提供一个中断入口

中断回调函数:HAL_TIM_PeriodElapsedCallback--->这个回调函数中编写了相关的业务代码,真正的处理

  1. 中断服务函数(ISR): 中断服务函数是由硬件触发并由操作系统或者嵌入式系统执行的函数。当中断事件(例如,定时器溢出、外部触发等)发生时,CPU会跳转到相应的中断服务函数来执行相关的操作。在这个上下文中,ISR 是系统级别的,用于响应底层的硬件事件。

  2. 中断回调函数: 中断回调函数通常是用户或应用程序级别定义的函数,它会在中断服务函数的上下文中执行。在某些情况下,中断服务函数可能会调用用户定义的回调函数。这个回调函数是由用户定义的,用于处理中断事件,执行与中断相关的应用程序逻辑。在这个上下文中,回调函数是应用程序级别的,用于定制中断发生时的行为。

六、编程实战:定时器中断实验

STM32CubeMX学习笔记(5)——基本定时器接口使用_counter mode mx-CSDN博客

1.条件分析

2.相关频率,溢出时间的计算

3.代码编写

操作代码

TIM_HandleTypeDef g_timx_handle;//定时器中断初始化函数
void btim_timx_int_init(uint16_t arr,uint16_t psc){g_timx_handle.Instance=TIM6;g_timx_handle.Init.Prescaler=psc;//分频参数g_timx_handle.Init.Period=arr;//预装载值//定时器初始化的基本参数HAL_TIM_Base_Init(&g_timx_handle);//打开定时器6的中断HAL_TIM_Base_Start_IT(&g_timx_handle);}
//定时器基础MSP初始化函数(就是初始化NVIC,CLOCK等)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){//判断地址是否为定时器6if(htim->Instance==TIM6){//打开定时器6的时钟__HAL_RCC_TIM6_CLK_ENABLE();//初始化NVICHAL_NVIC_SetPriority(TIM6_IRQn,1,3);//设置优先级HAL_NVIC_EnableIRQ(TIM6_IRQn);//打开定时器6中断}}//编写中断服务函数
//去start.s文件中查找
//代码作用:实际上这个函数是提供了一个定时器中断的入口
//并不进行业务的处理
void TIM6_IRQHandler(){HAL_TIM_IRQHandler(&g_timx_handle);
}//编写定时器溢出回调函数
//代码作用:编写用户相关的业务代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){//判断地址是否为定时器6if(htim->Instance==TIM6){//翻转led,使得闪烁HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);}
}

main函数

int main(){HAL_Init();sys_stm32_clock_init(RCC_PLL_MUL9);delay_init();btim_timx_int_init(5000-1,7200-1);while(1){}}

通用定时器

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

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

相关文章

Spring中的循环依赖解决方案

前言:测试环境突发BeanCurrentlyInCreationException,导致后端服务启动失败,一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖,是代码质量低下的表现。多数人寄希望于框架层来给擦屁股,造成了整个代码的…

大数据-玩转数据-Flume

一、Flume简介 Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Unix环境下运行。Flume基于流式架构,容错性强,也很灵活简单。Flume、Kafka用来实时进行数据收集,Spark、Flink用来实时处理数据,impala用来实时查询。二、Flume…

开放领域对话系统架构

开放领域对话系统是指针对非特定领域或行业的对话系统,它可以与用户进行自由的对话,不受特定领域或行业的知识和规则的限制。开放领域对话系统需要具备更广泛的语言理解和生成能力,以便与用户进行自然、流畅的对话。 与垂直领域对话系统相比…

AIX5.3安装weblogic10.3

目录 1安装IBM JDK 1.6 2图形化准备 3安装weblogic 准备 4图形化界面安装 1安装IBM JDK 1.6 1.1检查操作系统 # oslevel 5.3.0.0 # bootinfo -y (显示AIX机器硬件是64位) 64 # bootinfo -K (显示AIX系统内核是64位) 64 因此,系统需要安装64位的jdk,…

JavaWeb Day09 Mybatis-基础操作01-增删改查

目录 环境准备 ①Emp.sql ②Emp.java 一、删除 ①Mapper层 ②测试类 ③预编译SQL(查看mybatis日志) 1.性能 2.安全 ④总结 二、新增 ①Mapper层 ②测试类 ③结果 ④新增(主键返回) 1.Mapper层 2.测试类 ⑤总结​…

上机4KNN实验4

目录 编程实现 kNN 算法。一、步骤二、实现代码三、总结知识1、切片2、iloc方法3、归一化4、MinMaxScale()5、划分测试集、训练集6、KNN算法 .py 编程实现 kNN 算法。 1、读取excel表格存放的Iris数据集。该数据集有5列,其中前4列是条件属性…

Carla之语义分割及BoundingBox验证模型

参考: Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera) Carla自动驾驶仿真五:opencv绘制运动车辆的boudingbox(代码详解) Carla官网Bounding Boxes Carla官网创建自定义语义标签…

【QT】飞机大战

0 项目简介 飞机大战是我们大家所熟知的一款小游戏,本教程就是教大家如何制作一款自己的飞机大战 首先我们看一下效果图 玩家控制一架小飞机,然后自动发射子弹,如果子弹打到了飞下来的敌机,则射杀敌机,并且有爆炸的特…

隧道施工工艺流程vr线上虚拟展示成为产品3D说明书

行业内都知道,汽车生产的大部分都需要冲压加工来完成,因此汽车冲压工艺是汽车制造过程中的重要环节,传统的展示方式往往局限于二维图纸和实地操作,难以充分展现工艺的细节和流程。然而,随着技术的进步,汽车…

不同优化器的应用

简单用用,优化器具体参考 深度学习中的优化器原理(SGD,SGDMomentum,Adagrad,RMSProp,Adam)_哔哩哔哩_bilibili 收藏版|史上最全机器学习优化器Optimizer汇总 - 知乎 (zhihu.com) import numpy as np import matplotlib.pyplot as plt import torch # …

优秀智慧园区案例 - 中建科技产业园(中建·光谷之星),万字长文解析先进智慧园区建设方案经验

一、项目背景 中建科技产业园(中建光谷之星),位于武汉光谷中心城、中国(湖北)自贸试验区武汉片区双核心区,光谷发展主轴高新大道北侧,建筑面积108万平米,是中建三局“中建之星”和“…

设计模式—结构型模式之代理模式

设计模式—结构型模式之代理模式 代理模式(Proxy Pattern) ,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,对象结构型模式。 静态代理 比如我们有一个直播平台,提供了直播功能,但是如果不进行美颜,可能就比较冷清…

Adobe Photoshop 2020给证件照换底

1.导入图片 2.用魔法棒点击图片 3.点选择,反选 4.选择,选择并遮住 5.用画笔修饰证件照边缘 6. 7.更换要换的底的颜色 8.新建图层 9.使用快捷键altdelete键填充颜色。 10.移动图层,完成换底。

【ArcGIS Pro微课1000例】0030:ArcGIS Pro中自带晕渲地貌工具的妙用

在ArcGIS中,制作地貌晕渲效果通常的做法是先制作山体阴影效果,然后叠加在DEM的下面,再改变DEM的透明度来实现。而在ArcGIS Pro中自带了效果显著的晕渲地貌工具。 文章目录 一、晕渲地貌工具1. 符号系统2. 栅格函数二、山体阴影效果1. 工具箱2. 栅格函数打开ArcGIS Pro3.0,加…

【C++】类和对象(2)--构造函数

目录 一 概念 二 构造函数特性 三 默认构造函数 一 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year << "-" << _month <…

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

OpenGL_Learn10(颜色)

1. 颜色 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。换句话说&#xff0c;那些不能被物体所吸收(Absorb)的颜色&#xff08;被拒绝的颜色&#xff09;就是我们能够感知到的物体的颜色。例如&#xff0c;太阳光…

AI工具-PPT-SlidesAI

SlidesAI 使用手册 https://tella.video/get-started-with-slidesai-tutorial-18yq 简介 SlidesAI 是一款快速创建演示文稿的AI工具&#xff0c;适用于无设计经验的用户。 开始使用 1. **安装与设置** - 访问 [SlidesAI官网](https://www.slidesai.io/zh)。 - 完成简单的设置…

玩转硬件之C51的玩法(一)——破解“口红糖”中的电路

智能玩具&#xff1a;玩具行业的新风口 玩具是儿童的好伙伴&#xff0c;也是成人的乐趣来源。 随着科技的进步和消费的升级&#xff0c;玩具的形式和功能也在不断创新&#xff0c;智能玩具作为玩具行业的新风口&#xff0c;正受到越来越多的关注和喜爱。 什么是智能玩具&…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证&#xff0c;前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色&#xff0c;创建OSS bucket 1.1 添加用户 登录阿里云管理控制台&#xff0c;右侧头像&#xff0c;进入访问控制 点击左侧导航栏的身份管理的用户&#xff0c;点击…