STM32CubeMX教程8 TIM 通用定时器 - 输出比较

目录

1、准备材料

2、实验目标

3、实验流程

3.0、前提知识

3.1、CubeMX相关配置

3.1.1、时钟树配置

3.1.2、外设参数配置

3.1.3、外设中断配置

3.2、生成代码

3.2.1、外设初始化函数调用流程

3.2.2、外设中断函数调用流程

3.2.3、添加其他必要代码

4、常用函数

5、烧录验证

5.1、具体步骤

5.2、实验现象

6、注释详解


1、准备材料

开发板(STM32F407G-DISC1)

STM32CubeMX软件(Version 6.10.0)

ST-LINK/V2 驱动

keil µVision5 IDE(MDK-Arm)

逻辑分析仪nanoDLA

2、实验目标

使用STM32CubeMX软件配置STM32F407通用定时器的输出比较通道,并将其输出到四个LED灯引脚实现LED灯流水灯效果

3、实验流程

3.0、前提知识

STM32F407的定时器通道均可以实现输出比较功能,输出比较功能是利用当前计数值CNT与捕获/比较寄存器CRR的值作比较,如果值相等就会产生输出比较结果,此时也会产生输出比较完成中断或DMA请求

定时器产生的输出比较结果可以输出到比较通道的具体引脚上,也可以直接内部使用不输出到引脚,具体输出的电平由比较模式和输出极性共同决定

输出比较模式有①冻结:保持当前电平、②匹配时输出有效电平、③匹配时输出无效电平、④匹配时翻转输出电平、⑤强制输出有效电平和⑥强制输出无效电平六种模式

有效电平可以手动设置为高/低电平

3.1、CubeMX相关配置

请先阅读“STM32CubeMX STM32F4 HAL库 工程建立”实验3.4.1小节配置RCC和SYS

3.1.1、时钟树配置

系统时钟树配置与上一实验一致,均设置为STM32F407总线能达到的最高时钟频率,具体如下图所示

3.1.2、外设参数配置

在Pinout & Configuration页面右边芯片引脚预览Pinout view中找到LED灯的四个控制引脚PD12、PD13、PD14和PD15,依次左键单击并配置其功能为TIM4_CHx

然后在页面左侧功能分类栏目中点开Timers栏目,单击栏目下的TIM4,并将其Channel1~4全部配置为Output Compare CHx

具体配置如下图所示

然后对启用的TIM4定时器的四个通道参数进行设置,下面对重要参数介绍

①首先对计数器参数的设置与之前讲解的一致,这里不再赘述,周期设为500ms,不分频不预装载

②四个通道的输出比较模式均选择为了Toggle on match,即当比较寄存器CCR的值和当前定时器计数值CNT匹配时翻转通道引脚输出状态,四个通道从上到下其比较寄存器的值CCR依次为999、1999、2999和3999,这表示在一个时钟500ms周期内,通道1、2、3和4分别在100ms、200ms、300ms和400ms的时候翻转其对应通道引脚的值

③输出比较四个通达均不启用预装载,通道输出有效状态为高电平,其他的模式如其字面意思较为好理解,这里不再过多阐述

具体的参数配置如下图所示

3.1.3、外设中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选TIM4全局中断,然后选择合适的中断优先级即可

3.2、生成代码

请先阅读“STM32CubeMX STM32F4 HAL库 工程建立”实验3.4.3小节配置Project Manager

单击页面右上角GENERATE CODE生成工程

3.2.1、外设初始化函数调用流程

在生成的工程代码主函数main()中调用了MX_TIM4_Init()函数完成了对TIM4基本定时器参数,输出比较通道1/2/3/4参数的配置

然后在HAL_TIM_OC_Init()函数中调用了HAL_TIM_OC_MspInit()函数对TIM4时钟和中断进行了使能,并对中断优先级进行了配置

最后在MX_TIM4_Init()函数末尾调用了HAL_TIM_MspPostInit()函数对TIM4的四个输出比较通道引脚进行了复用设置,从而完成了整个初始化过程

如下图所示为TIM4输出比较初始化的具体函数调用流程

3.2.2、外设中断函数调用流程

再来看看输出比较中断回调函数流程,使能定时器全局中断后在stm32f4xx_it.c中自动生成了TIM4的中断处理函数TIM4_IRQHandler

TIM4_IRQHandler调用了HAL库的定时器中断处理函数HAL_TIM_IRQHandler,这个函数负责处理所有的定时器相关中断

通过判断中断来源及相关寄存器,最终输出比较事件完成的回调函数为HAL_TIM_OC_DelayElapsedCallback(或者是HAL_TIM_PWM_PulseFinishedCallback)(注释1),该函数为虚函数,需要用户重新实现

如下图所示为TIM4输出比较中断回调的具体函数调用流程

该实验目标不需要动态修改输出比较的参数,因此笔者这里没有重新在tim.c中重新实现该回调函数,需要提醒的是,输出比较事件完成时会同时进入HAL_TIM_OC_DelayElapsedCallback和HAL_TIM_PWM_PulseFinishedCallback两个回调函数中,因此请注意此实验确保注释掉PWM输出实验中HAL_TIM_PWM_PulseFinishedCallback函数体内动态修改占空比的代码,否则将达不到预期效果

3.2.3、添加其他必要代码

最后只需要在主函数中启动定时器(注释2),启动输出比较通道就可以实现本实验目标,启动代码如下图所示

源代码如下

HAL_TIM_Base_Start(&htim4);
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_1);
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_2);
HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_3);
HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_4);

4、常用函数

/*启动输出比较通道*/
HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

/*停止输出比较通道*/
HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

/*以中断方式启动输出比较通道*/
HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

/*停止以中断方式启动的输出比较通道*/
HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

/*输出比较通道完成回调函数*/
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)

5、烧录验证

5.1、具体步骤

“设置TIM4的4个通道为输出比较到通道 -> 配置TIM4基本参数及4个输出比较通道参数 -> NVIC中勾选TIM4全局中断并设置合适中断优先级 -> 在主函数中使用HAL_TIM_Base_Start(&htim4)启动定时器TIM4 -> 然后使用HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_x)函数开启四个通道的输出比较”

5.2、实验现象

烧录程序,上电单片机启动后会发现开发板上的四个LED灯,按照绿、橙、红和蓝的顺序依次点亮,然后不断循环,实际现象如下图所示

使用逻辑分析仪监测TIM4的四个输出通道引脚,可以看出TIM4的四个通道输出的电平翻转周期均为500ms,并且4个通道间每个通道均间隔100ms相继翻转状态

6、注释详解

注释1:在生成PWM波的实验中提到其使用的中断回调函数HAL_TIM_PWM_PulseFinishedCallback也可以换成输出比较完成的回调函数HAL_TIM_OC_DelayElapsedCallback,因为笔者发现在HAL库的定时器中断处理函数HAL_TIM_IRQHandler中,这两个函数是同时调用的,也就是说调用函数1,函数2也会跟着调用,所以笔者认为两个都可以使用

注释2:笔者发现在启动输出比较/输入捕获/PWM输出时,可以不调用定时器启动函数,执行HAL_TIM_xx_Start/HAL_TIM_xx_Start_IT函数时会自动启动定时器;另外HAL_TIM_OC_Start/HAL_TIM_OC_Start_IT两个输出比较启动函数和HAL_TIM_PWM_Start/HAL_TIM_PWM_Start_IT两个PWM输出启动函数,除了函数名和一些注释外其函数体内的代码一模一样;

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

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

相关文章

Mysql 容易忘的 sql 指令总结

目录 一、操作数据库的基本指令 二、查询语句的指令 1、基本查询语句 2、模糊查询 3、分支查询 4、 分组查询 5、分组查询 6、基本查询总结: 7、子查询 8、连接查询 三、MySQL中的常用函数 1、时间函数 2、字符串函数 3、聚合函数 4、运算函数 四、表…

Leetcode 63 不同路径 II

题意理解: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 要求:机器人只能…

Jmeter学习总结(4)——提取接口响应内容JSON Extractor

后置提取常见的方式:正则表达式和JSON Extractor。 而接口响应大多是JSON格式。 在JSON提取器之前,可以根据响应结果去编写所需要的JSON表达式,在结果树中选择JSON PATH TESTER。 {"server_time": 1232333333333,"data&quo…

基于ssm的4S店预约保养系统开发+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

双语!性能优越|融合黏菌和差分变异的量子哈里斯鹰算法SDMQHHO

前面的文章里卡卡介绍了哈里斯鹰优化算法(Harris Hawks Optimization, HHO).HHO是 Heidari等[1]于2019年提出的一种新型元启发式算法,设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突然袭击的狩猎风格,具有需调参数少、原理简单易实现、局部搜索…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用,异常抛出可以增强的点JoinPoint :也就是**被增强的方法的总称,可以获取具体方法的信息&#xff…

(2023,3D NeRF,无图像变分分数蒸馏,单步扩散)SwiftBrush:具有变分分数蒸馏的一步文本到图像扩散模型

SwiftBrush : One-Step Text-to-Image Diffusion Model with Variational Score Distillation 公众:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 方法 1.1 基础 1.2 SwiftBrus…

图像分割实战-系列教程2:Unet系列算法

图像分割实战-系列教程 总目录 语义分割与实例分割概述 Unet系列算法 1、Unet 整体结构:概述就是编码解码过程简单但是很实用,应用广起初是做医学方向,现在也是 语义分割与实例分割概述 Unet系列算法

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了,近期一直在忙项目的事,才有时间写博客,近期频繁出现sql问题,今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警,有个6千万的日志表,查询耗时大…

unity学习笔记----游戏练习0

一、修复植物种植的问题 1.当手上存在植物时,再次点击卡片上的植物就会在手上添加新的植物,需要修改成只有手上没有植物时才能再次获取到植物。需要修改AddPlant方法。 public bool AddPlant(PlantType plantType) { //防止手上出现多个植…

香橙派 ubuntu实现打通内网,外网双网络,有线和无线双网卡

当香橙派 ubuntu 连了有线,和无线时,默认请求外网时,只走一个网卡,如走了内网网卡,就只能访问内访问,访问不了外网;走了外网网卡就只能访问外网,访问不了内网; 实现双网…

显示器与按键(LCD 1602 + button)

一、实验目的: (1)学习lcd 1602的编程与使用、 (2)机械式复位开关button软件消抖的方法。 二、实验内容: 1、必做:先显示开机画面,:在1602显示器上,分两行…

Linux报错:audit: backlog limit exceeded

今天,一台虚拟机上操作昨天打开的连接一直没响应,新打开连接连接不上。SSH校验不通过。 通过IT的后台,可以看到满屏的audit: backlog limit exceeded。 问题原因:audit服务记录的审计事件超出默认(或设置)数量 ,达到或…

.一文带你了解Kylin:大数据框架开源分布式分析型数据仓库学习网站全攻略!

介绍:Apache Kylin是一个开源的分布式分析引擎,它为Hadoop和Apache Kylin是一个开源的分布式分析引擎,它为Hadoop和Spark提供SQL查询接口和多维分析(OLAP)能力,以支持超大规模的数据处理。Kylin最初由eBay …

HDFS客户端UnknownHostException事故解析

文章目录 前言事故现场问题分析是否是整个域名解析服务当时都出问题了是否是出问题的pods本身的域名解析有问题 异常发生的全部过程域名的解析是什么时候发生的,怎么发生的域名解析的详细流程 重试发生在什么地方为什么重试会无效 Bugfix代码详解关于StandardHostRe…

【神预言】2024年最具颠覆性的十大技术,每一条都令人咋舌!

大数据产业创新服务媒体 ——聚焦数据 改变商业 回首2023年,我们见证了数据智能领域的一场重要变革:数据智能的三大核心要素——数据、算法、和算力,如今已升级演化为大数据、大模型和大计算的全新范式。 在这个变革的十字路口上&#xff0c…

js实现前端下载图片和文件资料

说明:下载图片和文档资料是两种不同的方式,所以需要先判断下载的是图片还是word,excel等文件资料 目录 1.文件资料下载: 2.图片资源下载 1.文件资料下载: window.location.href 文件路径; handleClick(item) {let…

【黑产攻防道04】利用pow工作量证明降低黑产的破解效率

上一期我们提到,黑产有三种常见的破解方式: 1.通过识别出验证码图片答案实现批量破解验证,即图片答案识别; 2.在了解通讯流程之后直接携带相关参数发请求,即协议破解; 3.使用各种客户端模拟器来模拟真人…

在Linux上搭建Maven仓库的实战教程

引言 在Java开发中,Maven作为项目构建和依赖管理的重要工具,其仓库的搭建至关重要。本文将手把手教你如何在Linux系统上安装并配置Nexus Repository Manager 3(简称Nexus 3),从而创建一个私有的Maven仓库。 步骤一&a…

Vue小练习--任务列表

这是一个非常实用的例子,主要实用的是v-model、v-on、v-for指令,javaScript的数组也会涉及一些,javaScript数组方法有很多,本文使用的添加元素和删除元素非常实用,可以记下来。 设计思路 很多例子看起来很难&#xf…