【STM32】HAL库 CubeMX 教程 --- 通用定时器 TIM2 定时


实验目标:

通过CUbeMX+HAL,配置TIM2,1s中断一次,闪烁LED。


一、常用型号的TIM时钟频率

1. STM32F103系列:

  • 所有 TIM 的时钟频率都是72MHz;
  • F103C8不带基本定时器,F103RC及以上才带基本定时器。

2、STM32F407系列:

  • TIM1、8、9、10、11的时钟频率是168MHz;
  • 其它TIM的时钟频率是84MHz。    

二、CubeMX配置

        这里使用现有的CubeMX工程,略过工程配置部分。

        如果学习如何新建CubeMX工程, 可以参考下面文章:

        STM32CubeMX新建一个工程_STM32F103

        STM32CubeMX新建一个工程_STM32F407

        使用CubeMX对定时器进行定时配置,过程相当简单便捷。

        我们只需配置几个重要参数:时钟源、PSC、ARR、中断。

1、主要参数配置

主要参数讲解:

        ① Prescaler(预分频系数):即PSC寄存器值。简单地理解:内部时钟分频后再给CNT计数器使用,用于控制每一计数脉冲的时长。按上文内容得知,STM32F407的TIM2时钟是84M,在设置预分频为84后,计数脉冲频率:84MHz÷84=1MHz,即每秒产生1百万个计数信号,每个计数脉冲的时长:1秒/1M=1us。

        ② Counter Mode (计数方式):  向上计数

        ③ Counter Period (计数周期):  即ARR寄存器值,多少个脉冲作为1个波形周期。

        ④ auto-reload preload (自动重载值的预装载):  当改变周期值ARR时,是否等到下一个更新事件再写入数值,使得数值的更改不影响执行中的波形。

2、打开中断

        通用定时器,在只用定时功能的情况下,只有一种中断,如下图,  打勾即可。

        当计数器(CNT)的值,达到周期值(ARR)时,就会触发中断。

        注意:打勾中断后,生成的代码,只是帮我们添加了中断的配置; 而中断的开启,需要使用代码“手动”开启。


三、编写代码

        代码共为3部分:初始化配置、开启TIM、中断回调函数。

1、初始化配置

        CubeMX根据我们的配置,已生成好了初始化代码,我们不用管它。

        如果想查看它的初始化实现过程,可以双击 "tim.c"。

2、开启TIM、中断

        谨记一个,当我们使用CubeMX配置外设功能时,它只是根据参数的配置生成初始化代码(即上面的第1步),而不会主动开启外设功能,特别是中断的开启,如TIM、ADC、UART等。

        所以,我们需要在main.c中,“手动”开启TIM2。

        如下图,在while前,添加:

        HAL_TIM_Base_Start_IT(&htim2); 

        调用HAL_TIM_Base_Start_IT(&htim2)后,TIM2就会开始工作。

        下面是它的工作原理,硬件自动运行,不用干预,我们只需大概地知道工作过程、原理:

        ① TIM会自动检测脉冲信号,每来一个脉冲,计数器CNT就会硬件自动加1。

        ② 当寄存器CNT的计数值==设定的自动重装载值ARR,就会产生溢出中断。

        ③ 发生溢出中断时,CNT值被硬件置0,开始新一轮计数; 硬件自动找寻中断服务函数入口。

        使用CubeMX生成的HAL代码,我们不需要像使用标准库时那样自己编写中断函数,CubeMX已帮我们整理好中断函数的跳转,只需要重写中断回调函数。

3、重写TIM2的中断回调函数

        如上所述,通用定时器,只使用定时功能时,只有一种中断(CNT向上计数,达到ARR值)。

        所以也只有一个中断回调函数: HAL_TIM_PeriodElapsedCallback();

        当CNT值==周期值(ARR),即1周期结束,硬件自动调用中断服务函数,继而调用回调函数。

        我们可以在工程中任意一个c文件中编写它。

        习惯上,会在main.c的尾部编写这个函数。

        如下图,我们在main.c的  注释行 /* USER CODE BEGIN 4 */ 下面编写它。

        如果工程中已有这个函数,我们只需在函数内增加TIM2的判断部分;

        如果工程中没有这个函数,增加即可。

        注意:所有TIM的计数器溢出中断(即1周期结束),  都会统一调用它。

        在这个回调函数中,我们执行的动作是:每1000ms, 反转PB2电平(LED)。

        如果你的开发板上,PB2引脚接的是 LED, 而且也初始化成输出模式,它就会每1秒闪烁1次。

4、思路优化:

        上述操作,将会每1s进入1000次中断,当发现变量cnt累加到1000后,才反转LED。

        频繁地出入中断,大大地浪费着芯片运行资源。本篇如此设计,仅为了直观地展示和理解。

        我们在设计时,应该尽量地节省运行资源。

        上面的定时操作,有多种优化的方法,这里使用下面的操作:

        psc改为8400(计数脉冲0.0001s),ARR改为10000(1万个脉冲组成1周期);

        然后,修改回调函数,取消计数判断那部分。

        这样修改后,将会每1s进入1次中断,调用回调函数1次,能有效地节省运行资源。

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

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

相关文章

PostgreSQL中In, Exists在SQL查询中到底有无区别

前言 SQL查询当中,In和Exists子查询到底有无区别?记得很多年以前,确实是有相关的使用戒条的,或者说存在一些使用的惯用法。试图完全抹开两者的区别,就有点过了。 两者的主要区别: 从目的上讲&#xff0c…

【数据库-黑马笔记】基础-函数和约束

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看27~36集 MYSQL 的基础知识框架如下 目录 一、 函数 1、字符串函数 2、数值函数 3、日期函数 4、流程函数 5、小结: 二、约束 1、概述 2、 约束演示 3、外键约束 …

数据库-第十一章 并发控制【期末复习|考研复习】

前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下数据库系统概论中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 数据库系统概论系列文章传送门: 第一章 绪论 第二/…

微信私信短剧机器人源码

本源码仅提供参考,有能力的继续开发 接口为api调用 云端同步 https://ys.110t.cn/api/ajax.php?actyingshilist 影视搜索 https://ys.110t.cn/api/ajax.php?actsearch&name剧名 每日更新 https://ys.110t.cn/api/ajax.php?actDaily 反馈接口 https://ys.11…

在线部署ubuntu20.04服务器,安装jdk、mysql、redis、nginx、minio、开机自启微服务jar包

一、服务器 1、查看服务器版本 查看服务器版本为20.04 lsb_release -a2、服务器信息 服务器初始账号密码 sxd / 123456 首先,更改自身密码都输入123456 sudo passwd 创建最高权限root账号,密码为 123456 su root 3、更新服务器源 1、更新源列表 sudo apt-g…

【零基础学习01】嵌入式linux驱动中pinctrl和gpio子系统实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面pinctrl和gpio子系统控制实验,操作硬件为I.MX6ULL开发板。 第一:pinctrl和gpio子系统简介 Linux系统是一个庞大又完善的系统,如果采用…

Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

目录 各类红蓝队优秀工具项目集合 自动化-武器库部署-F8x 自动化-网络空间-AsamF 自动化-企查信息-ENScan 自动化-综合架构-ARL&Nemo 思维导图 章节知识点 Web:语言/CMS/中间件/数据库/系统/WAF等 系统:操作系统/端口服务/网络环境/防火墙等 应…

DataFunSummit 2023:洞察现代数据栈技术的创新与发展(附大会核心PPT下载)

随着数字化浪潮的推进,数据已成为企业竞争的核心要素。为了应对日益增长的数据挑战,现代数据栈技术日益受到业界的关注。DataFunSummit 2023年现代数据栈技术峰会正是在这样的背景下应运而生,汇聚了全球数据领域的精英,共同探讨现…

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测 目录 多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 …

JVM的工作流程

目录 1.JVM 简介 2.JVM 执行流程 3. JVM 运行时数据区 3.1 堆(线程共享) 3.3 本地方法栈(线程私有) 3.4 程序计数器(线程私有) 3.5 方法区(线程共享) 4.JVM 类加载 ① 类…

蓝桥杯大赛软件python赛道真题:蛇形填数

真题链接:https://www.lanqiao.cn/problems/594/learning/ 题目描述: 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 …

最简单的基于 FFmpeg 的内存读写的例子:内存转码器

最简单的基于 FFmpeg 的内存读写的例子:内存转码器 最简单的基于 FFmpeg 的内存读写的例子:内存转码器正文源程序结果工程文件下载参考链接 最简单的基于 FFmpeg 的内存读写的例子:内存转码器 参考雷霄骅博士的文章,链接&#xf…