【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时


实验目标:

通过CUbeMX+HAL,配置TIM1,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的TIM1时钟是168M,在设置预分频为168后,计数脉冲频率:168MHz÷168=1MHz,即每秒产生1百万个计数信号,每个计数脉冲的时长:1秒/1M=1us。

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

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

        ④ Repetition Counter(重复计数器):   简单地理解,多少个周期才触发1次中断;

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

2、打开中断

        高级定时器,和通用定时器不同,即使没有使能通道,也有多种中断。

        本篇只使用了周期更新中断,如下图,  打勾: update interrupt (更新中断) 。

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

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


三、编写代码

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

1、初始化配置

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

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

2、开启TIM、中断

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

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

        如下图,在while前,添加:

        HAL_TIM_Base_Start_IT(&htim1); 

        调用HAL_TIM_Base_Start_IT(&htim1)后,TIM1就会开始工作。

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

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

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

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

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

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

        按上面CubeMX的配置,我们使用了周期中断(计数器CNT溢出),当中断触发时,硬件会自动调用相关的中断服务函数,而中断服务函数里,CubeMX的工程会调用回调函数: 

        HAL_TIM_PeriodElapsedCallback();

        即:即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。

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

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

        上面的定时操作,有多种优化的方法:

        方法1:原参数不改,重复计数器Repetition Counter改为1000, 即1000个周期才产生1次中断;

        方法2:psc改为16800(脉冲0.0001s),ARR改为10000(1万个脉冲组成1周期)

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

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

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

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

相关文章

C++11——智能指针

本文将解决一下几个问题 1.什么是智能指针 2.为什么需要之智能指针 3.智能指针的使用场景 智能指针 RAII:是一种利用对象声明周期来控制的程序资源(如内存、文件句柄、网络连接、互斥量等)的技术 在对象构造的时候获取资源,接…

Navicat、phpMyAdmin本地安装

一、Navicat安装 注:本次关于Navicat的安装版本为Navicat160的windows版本 1、从官方下载安装包并安装 官方下载链接为 ​​https://download.navicat.com.cn/download/navicat160_premium_cs_x64.exe​​ 下载完成后,直接进行安装即可(…

Unity 整体界面淡入淡出效果

在Unity中,如果我们要实现控制多个组件同时淡出,同时淡入的效果,可以使用DOTween插件实现。 如图,一个页面中带有背景,一张图片,一个文本,一个滑动条。 要实现以上界面的整体淡入淡出&#xff…

C语言连接【MySQL】

稍等更新图片。。。。 文章目录 安装 MySQL 库连接 MySQLMYSQL 类创建 MySQL 对象连接数据库关闭数据库连接示例 发送命令设置编码格式插入、删除或修改记录查询记录示例 参考资料 安装 MySQL 库 在 CentOS7 下,使用命令安装 MySQL: yum install mysq…

R语言:多值提取到点

ArcGIS中有相关工具实现多值提取到点的功能&#xff0c;在这里&#xff0c;我将使用R语言进行操作&#xff1a; library(dplyr) library(readxl) library(sf) library(raster)setwd("D:/Datasets") Bio <- stack(paste0("D:/Datasets/Data/worldclim2_1km/…

【C++】了解一下STL

个人主页 &#xff1a; zxctscl 如有转载请先通知 STL 1. 什么是STL2. STL的版本3. STL的六大组件4. STL的重要性5. 如何学习STL6. STL的缺陷 1. 什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件…

SkyEye:助力飞行器状态控制系统仿真

飞行器与常见的航天器一样&#xff0c;属于安全关键领域的大型复杂设备&#xff0c;对安全性、可靠性有着极高的要求。为保证稳定飞行&#xff0c;需要对目标对象进行实时跟踪&#xff0c;通过发出正确的修正偏差指令来操纵飞行器改变飞行姿态&#xff0c;因此对飞行器状态控制…

SSM框架,MyBatis-Plus的学习(下)

条件构造器 使用MyBatis-Plus的条件构造器&#xff0c;可以构建灵活高效的查询条件&#xff0c;可以通过链式调用来组合多个条件。 条件构造器的继承结构 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xf…

堆宝塔(Python)

作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于…

python INI文件操作与configparser内置库

目录 INI文件 configparser内置库 类与方法 操作实例 导入INI文件 查询所有节的列表 判断某个节是否存在 查询某个节的所有键的列表 判断节下是否存在某个键 增加节点 删除节点 增加节点的键 修改键值 保存修改结果 获取键值 获取节点所有键值 其他读取方式 …

Python SSH协议库之paramiko使用详解

概要 在网络编程中,远程操作是一项非常常见的需求,特别是在服务器管理和自动化任务执行方面。Python提供了许多库来实现远程操作,其中Paramiko是一个备受欢迎的选择。Paramiko是一个纯Python编写的SSH协议库,它提供了一种简单而强大的方式来执行远程命令、上传和下载文件等…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本&#xff0c;以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

【Spring Boot 3】获取已注入的Bean

【Spring Boot 3】获取已注入的Bean 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历…

深入理解Servlet

目录&#xff1a; ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与…

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思&#xff1f;——跟老吕学Python编程 面向对象是什么意思&#xff1f;面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…

RocketMQ存储设计深度解析

引言 在分布式系统中&#xff0c;消息中间件扮演着至关重要的角色&#xff0c;它负责系统间异步消息的传递&#xff0c;确保信息可靠传输。Apache RocketMQ&#xff08;以下简称RocketMQ&#xff09;是这一领域中的一个优秀代表。RocketMQ以其高性能、高可靠性和高扩展性赢得了…

未来城市:探索数字孪生在智慧城市中的实际应用与价值

目录 一、引言 二、数字孪生与智慧城市的融合 三、数字孪生在智慧城市中的实际应用 1、智慧交通管理 2、智慧能源管理 3、智慧建筑管理 4、智慧城市管理 四、数字孪生在智慧城市中的价值 五、挑战与展望 六、结论 一、引言 随着科技的飞速发展&#xff0c;智慧城市已…

AI论文速读 | 【综述】城市计算中跨域数据融合的深度学习:分类、进展和展望

题目&#xff1a;Deep Learning for Cross-Domain Data Fusion in Urban Computing: Taxonomy, Advances, and Outlook 作者&#xff1a;Xingchen Zou, Yibo Yan, Xixuan Hao, Yuehong Hu, Haomin Wen&#xff08;温皓珉&#xff09;, Erdong Liu, Junbo Zhang&#xff08;张钧…

GitHub Desktop的常用操作【图形化】

文章目录 【1】仓库的创建和删除【2】文件操作【3】分支原理与分支操作1.分支创建2.分支合并 【4】标签 【1】仓库的创建和删除 在本地创建一个新的仓库&#xff1a; 然后输入仓库的名称&#xff0c;描述&#xff0c;并选择路径&#xff1a; 点击完后就发现我们的仓库创建好…

线性代数(一)——向量基础

向量基础 1、向量和线性组合2、向量的模和点乘3、矩阵4、参考 线性代数的核心是向量的加和乘两种运算的组合&#xff0c;本篇博客为线性代数的一个引子&#xff0c;主要从向量、线性组合和矩阵逐步引出线性代数的相关知识。 1、向量和线性组合 首先介绍的是向量相关&#xff0…