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输出启动函数,除了函数名和一些注释外其函数体内的代码一模一样;

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java集合/泛型篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、说说List,Set,Map三者的区别二、Array与ArrayList有什么不一样?三、Map有什么特点四、集合类存放于 Java.util 包中, 主要有几 种接口前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

两种汇编的实验

week04 一、汇编-1二、汇编-2 一、汇编-1 1 通过输入gcc -S -o main.s main.c -m32 将下面c程序”week0401学号.c“编译成汇编代码 int g(int x){ return x3; } int f(int x){ int i 学号后两位; return g(x)i; } int main(void){ return f(8)1; } 2. 删除汇编代码…

做数据关键步骤:怎么写好prompt?

前言 不论是批量构建sft数据来训练通用模型,还是最近大火的Agent,其实一个核心工作就是做好prompt engineering,因为只有写好了prompt(gpt模型回复满足当前需求),才意味着我们可以批量拉数据了或者整个Age…

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!TodoList小案例 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 HarmonyOS自学笔记,此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

Java设计模式-外观模式

目录 一、影院管理项目 二、外观模式 (一)基本介绍 (二)原理类图 (三)解决影院管理 (四)注意事项和细节 (五)外观模式在MyBatis框架应用的源码分析 一…

基于ssm的教师上课系统+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…

二、KMDF开发之HelloWord

目录 第一步、创建KMDF项目 第二步、代码里增加打印信息 最终我们是要自己开发PCIE驱动,这里使用HelloWord工程把整个环境打通,下一篇将讲KMDF双机调试环境的搭建,开发环境的搭建见上一篇博文《一、KMDF开发之环境搭建-CSDN博客》。 第一步…

SpringBoot 3.2.0 基于SpringDoc接入OpenAPI实现接口文档

依赖版本 JDK 17 Spring Boot 3.2.0 SpringDoc 2.3.0 工程源码&#xff1a;Gitee 导入依赖 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEnco…

分布式系统架构设计之分布式系统实践案例和未来展望

分布式系统在过去的几十年里经历了长足的发展&#xff0c;从最初的简单分布式架构到今天的微服务、云原生等先进架构&#xff0c;取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践&#xff0c;并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …

在STM32中集成TSL2561光强传感器的开发和调试

在STM32中集成TSL2561光强传感器的开发和调试是一个常见的应用场景。TSL2561是一款数字光传感器&#xff0c;能够测量可见光和红外光的光强&#xff0c;并通过I2C接口将数据传输给微控制器。下面将为您介绍在STM32中集成TSL2561传感器的开发步骤&#xff0c;并附上相应的代码示…

【JavaEE进阶】 初识Spring Web MVC

文章目录 &#x1f334;什么是Spring Web MVC&#xff1f;&#x1f6a9;什么是Servlet呢? &#x1f38b;MVC 定义&#x1f6a9;再理解Spring MVC &#x1f340;如何学习Spring MVC呢&#xff1f;⭕总结 &#x1f334;什么是Spring Web MVC&#xff1f; Spring Web MVC 是基于…

Scrapy使用案例——爬取豆瓣Top 250电影数据

文章目录 什么是Scrapy&#xff1f;创建Scrapy项目编写Scrapy Spider创建Item类配置数据存储运行Scrapy爬虫处理常见问题结论Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全…

nginx日志常见报错解决

目录 一&#xff1a;报错 二&#xff1a;php查看后台内容有的栏目出现502&#xff1f; 三&#xff1a;413 Request Entity Too Large? 四&#xff1a;Request Header Or Cookie Too Large 400 一&#xff1a;报错 upstream prematurely closed connection while reading r…

UI演示双视图立体匹配与重建

相关文章&#xff1a; PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501Qt designer界面和所有组件功能的详细介绍&#xff1a;https://blog.csdn.net/qq_43811536/article/details/1351868…

初识智慧城市

文章目录 智慧家居 智慧社区 智慧交通 智慧医疗 智慧教育 智慧旅游 智慧农业 智慧安防 智慧家居 利用智能语音、智能交互等技术,实现用户对家居系统各设备的远程操控和能控制如开关窗帘(窗户)、操控家用电器和照明系统、打扫卫生等操作。利用计算机视觉等技术,对被照看…

【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南

欢迎来到人工智能的迷人世界&#xff0c;在那里&#xff0c;人与机器之间的通信越来越模糊。在这篇博客文章中&#xff0c;我们将探索人工智能驱动交互的一个令人兴奋的新前沿&#xff1a;与您的文本文档聊天&#xff01;借助OpenAI模型和创新的LangChain框架的强大组合&#x…

如何让python在手机上运行,python程序在手机上运行

大家好&#xff0c;给大家分享一下python怎么在手机上运行爱心代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1. 写在前面的话 天天都在PC端运行Python代码的我&#xff0c;今天突然灵光一现&#xff0c;想着是不是能够在移动端运行P…

大语言模型(LLM)框架及微调 (Fine Tuning)

大语言模型&#xff08;LLM&#xff09; 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统&#xff0c;专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法&#xff0c;…

音频、视频插座

音频、视频插座 常用电子元器件类型 DC电源插座 文章目录 音频、视频插座前言一、音频、视频插座二、DC电源插座1. 镀铜锡DC插座2. 镀镍DC插座总结前言 音频和视频插座在设计上具有特定的接口类型和标准,以确保兼容性和信号传输的质量。在选择插座时,需要根据设备的接口类…

Linux内核并发与同步机制解读(arm64)上

关键词 原子操作、自旋锁、信号量、mutex、读写锁、percpu-rwsem 概述 从浅到深&#xff0c;逐步分析各种同步机制的功能。 1、原子操作 解决“读-修改-回写”的完整性&#xff0c;一般用于静态全局变量的保护&#xff0c;静态全局变量的操作过程. 例如&#xff0c;我们写一…