基于STM32CubeMX和keil采用STM32F407的基本定时器中断实现LED闪烁

news2024/12/26 22:26:43

文章目录

  • 前言
  • 1. 电路原理图理解
  • 2. 基本定时器
    • 2.1 STM32定时器中断的流程:
    • 2.2 部分参数详解
      • 2.2.1 时钟源
      • 2.2.2 预分频系数
      • 2.2.3 自动重装载值
  • 3. STM32CubeMX参数配置
    • 3.1GPIO配置
    • 3.2 时钟配置
    • 3.2 配置定时器相关参数
    • 3.3 Debug配置
    • 3.4 中断配置
    • 3.5 代码生成
  • 4. keil代码编写
  • 总结

前言

定时器有三种,基本定时器,通用定时器,以及高级定时器。
这篇博客以最简单的基本定时器为例,实现LED的闪烁。
后面两种定时器的用法后面再写。

实现功能:
TIM6控制LED每隔0.5s变一次状态。
TIM7控制LED1常量2s后熄灭。


1. 电路原理图理解

因为都是用到LED,所以和上一篇基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器类似。
这里就直接复制粘贴了。
在这里插入图片描述
在这里插入图片描述

LED部分:
3.3V电压经过一个电阻R12连到DS0发光二极管,如果VCC和LED0对应的引脚之间存在压降,则DS0导通,发光。
3.3V电压经过一个电阻R14连到DS1发光二极管,如果VCC和LED1对应的引脚之间存在压降,则DS1导通,发光。

因此我们要先让LED发光的话,要让LED0和LED1标号对应的引脚输出低电平,才能确保LED0和LED1发光,但由于我们默认状态是LED亮的,所以这里都先要制为高电平。

2. 基本定时器

STM32F407ZET6芯片中
TIM6,TIM7是基本定时器
TIM2-5,TIM9~14是通用定时器
TIM1,TIM8是高级定时器

2.1 STM32定时器中断的流程:

定时器配置:首先,您需要配置定时器的参数,例如时钟源、预分频系数和计数器的自动重装载值。这些参数决定了定时器的计数速度和定时间隔。

中断配置:接下来,您需要配置定时器中断。在STM32中,每个定时器都有一个中断使能位和一个中断标志位。通过设置中断使能位,您可以启用或禁用定时器中断。中断标志位用于指示中断事件是否已经发生。您可以在中断处理函数中清除中断标志位。

中断处理函数:当定时器达到设定的计数值时,将触发定时器中断,并跳转到相应的中断向量表入口处执行中断处理函数。您需要实现该中断处理函数来执行所需的操作。在中断处理函数中,可以进行一些定时相关的任务,例如更新变量、发送数据或触发其他事件。

中断优先级:在多个中断同时发生时,优先级决定了哪个中断先被处理。STM32提供了优先级组的设置,您可以根据需要配置不同的中断优先级。

定时器相关参数详解参考:

2.2 部分参数详解

2.2.1 时钟源

STM32微控制器系列提供了多种时钟源选项,以满足不同的应用需求。以下是一些常见的时钟源选项:

HSI(High-Speed Internal)内部高速时钟:HSI是STM32内部集成的高频振荡器,通常为16MHz。它是默认的系统时钟源,在芯片上电后自动启动。HSI适用于大多数应用场景,提供相对较高的精度和稳定性。
HSE(High-Speed External)外部高速时钟:HSE使用外部晶体振荡器或时钟源提供稳定的时钟信号。HSE的频率范围可以根据具体的芯片型号而变化,通常为4MHz到25MHz。外部时钟源相对于内部时钟提供更高的精确性和稳定性。
LSI(Low-Speed Internal)内部低速时钟:LSI是低频振荡器,通常为32kHz。它用于一些低功耗应用,例如RTC(实时时钟)或独立看门狗定时器(IWDG)。
LSE(Low-Speed External)外部低速时钟:LSE使用外部晶体振荡器或时钟源提供低速时钟信号。它通常为32.768kHz,用于RTC和低功耗模式。
PLL(Phase-Locked Loop)锁相环:PLL是一种用于产生高频时钟的电路。它可以通过将输入时钟信号(如HSI或HSE)经过倍频和分频来产生更高频率的时钟。PLL提供了灵活的时钟频率调整能力,适合高性能应用。

请注意,具体的时钟源选项和配置方法可能因芯片型号和系列而有所不同。在使用特定型号的STM32芯片时,您应查阅芯片的数据手册和参考手册,以获取详细的时钟源配置信息。

2.2.2 预分频系数

预分频系数用于设置定时器时钟频率的分频比。它确定了定时器计数器每个时钟周期递增的步长,从而影响定时器的计数速度和定时间隔。

具体的预分频系数选项和配置方法可能因芯片型号和系列而有所不同。以下是一些常见的预分频系数配置:

APB分频系数(PCLKx):APB(Advanced Peripheral Bus)是STM32中用于连接外设的总线。通过配置APB分频系数,可以将系统时钟(SYSCLK)分频得到适合外设工作的时钟频率。常见的预分频系数选项包括2、4、8和16。

TIMx预分频系数:定时器模块(TIM)有自己的预分频器,可以将时钟源的频率进一步分频。具体的预分频系数选项和配置方法因芯片型号和定时器模块而异。

PLL倍频系数(PLLM、PLLN、PLLP):如果使用PLL锁相环来产生高频时钟,可以通过设置不同的倍频系数来调整PLL输出时钟的频率。PLLM为输入分频器系数,PLLN为倍频器系数,PLLP为输出分频器系数。

2.2.3 自动重装载值

自动重装载值(Auto-reload value)是一个重要的参数,用于控制定时器计数器的溢出和重新加载。

定时器计数器在每个时钟周期递增,当达到自动重装载值时,计数器将重新加载为初始值,并触发中断(如果已启用)。这种重新加载的操作使定时器可以周期性地生成中断或触发其他事件。

自动重装载值的大小决定了定时器的定时间隔。通常,自动重装载值的设置可以通过以下公式计算:

自动重装载值 = (定时周期 / 时钟周期) - 1,这里减一是因为从0开始算,例如0~9实际上计数了10个.

其中,定时周期是所需的定时间隔,时钟周期是定时器的时钟频率。通过更改自动重装载值,可以调整定时器的定时间隔。

在STM32中,自动重装载值可以存储在定时器的自动重装载寄存器(ARR)中。通过将自动重装载寄存器设置为所需的值,可以实现定时器的周期性操作。

需要注意的是,自动重装载值应适当选择,以确保不会发生溢出。应根据所需的定时间隔和定时器的时钟频率来选择合适的值,避免溢出或过长的定时间隔。


3. STM32CubeMX参数配置

3.1GPIO配置

在这里插入图片描述

在这里插入图片描述

3.2 时钟配置

在这里插入图片描述

为了便于我们计算,我们这里最终的时钟设置为100MHz,前面的时钟源以及分频系数等都会自动设置好。
在这里插入图片描述给到定时器的时钟其实是APB1和APB2中获取的,因为我这篇博客写的是基本定时器的博客所以我们要找到的基本定时器TIM6,TIM7对应的时钟,这里是APB1。

在这里插入图片描述

STM32F407ZET3的其他的定时器所在总线等这里列个表

定时器类型定时器名称定时器所在总线
基本定时器TIM6、TIM7APB1
通用定时器TIM2~5,TIM12~14APB1
通用定时器TIM9~11APB2
高级定时器TIM1,TIM8APB2

3.2 配置定时器相关参数

在这里插入图片描述
在这里插入图片描述

这里分频系数是49999,即0~49999,长度为50000,我们APB1总线传过来的时钟是50MHz,所以说明每一个时钟周期都是1ms。

A P B 1 时钟 T I M 6 分频系数 = 50 ∗ 1 0 6 H z 5 ∗ 1 0 4 = 1 K H z = 1 T ( 时间 ) = > T = 1 m s \frac{APB1时钟}{TIM6分频系数}=\frac{50*10^6Hz}{5*10^4}=1KHz=\frac{1}{T(时间)}=>T=1ms TIM6分频系数APB1时钟=510450106Hz=1KHz=T(时间)1=>T=1ms
对于TIM6控制的LED,我们的目标是0.5s转换一次LED的状态,所以这里这里的计数重载是500-1,因为从0开始计数。

写到这,简单点理解就是,从时钟源分频时钟到总线,定时器从总线再分频,用来作为时间的分度值,这个说法可能不恰当,但意思就是一个时钟周期多少秒,接着用计数重载值 * 刚才的分度值就是我们想要的时间。即每隔多少时间,干什么。

TIM7的设置也同样,只不过计数重载值为1999,这里就不贴全图了。
在这里插入图片描述


3.3 Debug配置

在这里插入图片描述

3.4 中断配置

其实时钟配置里面的NVIC打开了之后,这里其实就自动勾选配好了。
在这里插入图片描述优先级抢占和响应:当两个中断发生且优先级不同时,优先级高的中断会抢占正在执行的低优先级中断。如果多个中断具有相同的优先级,则根据抢占式(Preemption)和响应式(Response)的设定来确定中断的顺序。先看抢占式优先级,前面数值越小,优先级越高,如果一样则看后面的优先级,数值也是越小越优先。

这篇博客其实对优先级要求不是那么高,不会怎么涉及抢占优先级等情况。所以这里默认0 , 0就行。

还有一个就是代码生成的时候是否生成对应的中断服务函数之类的,都默认勾选上。
在这里插入图片描述


3.5 代码生成

在这里插入图片描述

在这里插入图片描述


4. keil代码编写

打开生成的项目中的stm32f4xx_it.c文件
在这里插入图片描述
再最下面直接添加下列代码

在这里插入图片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
	{
		HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
	}
	if(htim->Instance==TIM7)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
	}
}

说明一下为什么重写这个函数,当定时器达到设定的计数值时,将触发定时器中断,并跳转到相应的中断向量表入口处执行中断处理函数。您需要实现该中断处理函数来执行所需的操作。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

计数值超过500就会触发中断,调用功能这个回调函数,这里我们看函数名就知道了。PeriodElapseCallback和我们设置的那个值对应。

在这里插入图片描述


最后就是烧录程序了,这个和我这个专栏第一篇都一样,具体参考这篇博客

总结

这篇博客详细记录了定时器的简单使用,从目标出发到原理阐释再到配置与代码编写,一步一步实现功能。难度不是很大,中断处理部分与上一篇有很多共性的地方,学习起来也比较快。就是记录的时候比较费时间。写这篇博客的部分内容用了下chatGPT工具,效果也挺好,确实提高了部分效率。

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

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

相关文章

【每日一题】—— B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

ftp传文件越来越慢的原因,以及解决方案

FTP 是一种常用的文件传输协议,它基于客户端-服务端模型工作,允许用户通过网络传输文件。但是,有时候在使用 FTP 的过程中,文件传输速度会逐渐变慢,这给用户带来了很多困扰。本文将分析 FTP 传文件变慢的原因&#xff…

Jwt(Json web token)——从Http协议到session+cookie到Token Jwt介绍 Jwt的应用:登陆验证的流程

目录 引出从Http协议到session&cookie到TokenHTTP协议session & cookiesessioncookie为什么需要session & cookie? JavaEE传统解决长连接方案问题:分布式不适用解决方案:令牌Token Jwt,Json web tokenjwt的结构Header加密算法Ba…

MySQL Workbench的使用

MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库。 MySQL Workbench 的初始界面如下图所示。 点击方框后会进入这个界面,这样就与数据库连接完毕了 使用 Wo…

Docker 全栈体系(四)

Docker 体系(高级篇) 一、Docker复杂安装 1. 安装mysql主从复制 主从搭建步骤 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysq…

SpringBoot-4

Spring Boot 使用 slf4j 日志 在开发中经常使用 System.out.println()来打印一些信息,但是这样不好,因为大量的使用 System.out 会增加资源的消耗。实际项目中使用的是 slf4j 的 logback 来输出日志,效率挺高的,Spring Boot 提供…

【go语言学习笔记】02 Go语言高效并发

文章目录 一、并发基础1. 协程(Goroutine)2. Channel2.1 声明2.2 无缓冲 channel2.3 有缓冲 channel2.4 关闭 channel2.5 单向 channel2.6 selectchannel 示例 二、同步原语1. 资源竞争2. 同步原语2.1 sync.Mutex2.2 sync.RWMutex2.3 sync.WaitGroup2.4 …

2023 NVIDIA 创乐博 CUDA 线上训练营笔记

一、学习ubuntu 2.1修改权限 linux指令学习 cd course //进入course目录 ls //列出文件夹 clean //清屏幕//---修改权限 chmod gow text //给text文件夹添加可写权限 chmod gw make.ip chmod 755 text 可读可写可执行(user goup o…

MySQL MHA高可用配置及故障切换

1.什么是 MHA MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的…

uni-app中uni-table的uni-tr无点击事件

uni-app中uni-table的uni-tr无点击事件 问题描述解决方法一解决方法二解决方法三 问题描述 本文记录用于记录使用uni-app开发过程遇到的bug。 在使用uni-table时,想给uni-table的行添加行点击事件;但发现官方并未给uni-tr增加点击行点击事件(…

gitee 配置ssh 公钥(私钥)

步骤1:添加/生成SSH公钥,码云提供了基于SSH协议的Git服务,在使用SSH协议访问项目仓库之前,需要先配置好账户/项目的SSH公钥。 绑定账户邮箱: git config --global user.name "Your Name" git config --glob…

Linux静态库+demo

1.什么是Linux静态库呢? Linux静态库(Static Library)是一种包含已编译的目标代码的文件集合,用于在链接时与其他目标代码一起组成可执行文件。与动态库(Dynamic Library)不同,静态库的代码在编…

集成学习Boosting - AdaBoost

目录 1. Boosting方法的基本思想 1.1 Bagging VS Boosting 1.2 Boosting算法的基本元素与基本流程 1.3 sklearn中的Boosting算法 2. AdaBoost 3 AdaBoost的基本参数与损失函数 3.1 参数 base_estimator,属性base_estimator_与estimators_ 3.1. 参数 learnin…

构建高效供应商管理体系,提升企业采购能力

随着企业采购规模的不断扩大和全球化竞争的加剧,供应商管理变得越来越重要。构建一个高效的供应商管理体系是企业提升采购能力、降低采购成本的关键一环。本文将重点探讨供应商管理体系的意义和作用,并介绍如何构建一个高效的供应商管理体系。 一、供应商…

Openlayers实战,Openlayers一个车辆转向运动轨迹动画,支持根据轨迹运动方向自动改变车头转向角度,无需定时器,丝滑小车转向运动效果

专栏目录: OpenLayers入门教程汇总目录 前言 本章作为OpenLayers入门文章《OpenLayers入门,OpenLayers动画效果实现,OpenLayers实现轨迹运动动画》的的增强进阶篇章,实现了入门教程中没有实现的小车车头方向根据运动方向自动转向的功能。 二、依赖和使用 "ol&quo…

四、运算符(1)

本章概要 开始使用优先级赋值 方法调用中的别名现象 算术运算符 一元加减运算符 递增和递减 Java 是从 C 的基础上做了一些改进和简化发展而成的。对于 C/C 程序员来说,Java 的运算符并不陌生。如果你已了解 C 或 C,大可以跳过本章和下一章&#xff0c…

微信小程序开店的步骤

越来越多实体店家在寻求入局电商的机会,随着微信推出了小程序,商家们看到了机会,微信小程序开发不仅成本较低,还能借助微信进行推广,帮助商家实现线上线下的对接,是商家实现开店的极佳选择。那么微信小程序…

Linux 网络收包流程

哈喽大家好,我是咸鱼 我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候,有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人聊天还是上网冲浪,其实…

伙伴云「页面」公测正式开启,建站、文档、数据分析,丰富的数据展现能力。

一年来,伙伴云收到了许多用户对于仪表盘升级的期待,以及对新功能规划的询问。经过千百次调研、开发、内测,我们开发了一款页面构建引擎,Ta既提供了灵活的可定制性,也不像网页设计器晦涩难懂,且具有丰富的数…