【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次,能有效地节省运行资源。

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

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

相关文章

ClickHouse Grafana插件4.0版 - 升级SQL可观测性

本文字数:3396;估计阅读时间:9 分钟 作者:Clickhouse team 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 自2022年5月Grafana的ClickHouse插件首次发布以来,两种技术都有了…

AOP的常见使用方法

面向切面编程(AOP,Aspect-Oriented Programming) 面向切面编程是一种软件设计和编程范式,它旨在解决在传统面向对象编程(OOP)中难以模块化处理的“横切关注点”问题。横切关注点是指那些跨越多个对象、类或…

每日OJ题_牛客HJ74 参数解析(IO型OJ)

目录 牛客HJ74 参数解析 解析代码1 解析代码2 牛客HJ74 参数解析 参数解析_牛客题霸_牛客网 解析代码1 #include <iostream> #include <string> #include <vector> using namespace std; int main() {string str "";getline(cin, str);vecto…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能&#xff0c;可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 数据库 实验五

【实验名称】 实验5 数据库的数据更新与视图管理 【实验目的】 1. 熟悉数据更新操作的概念与操作类型&#xff1b; 2. 熟练掌握INSERT、UPDATE、DELETE语句的基本语法&#xff1b; 3. 熟练运用INSERT、UPDATE、DELETE语句实现数据的插入、修改与删除…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

获取bean的几种情况总结

1. 情景一 bean 对应的类没有实现任何接口 根据 bean 本身的类型获取 bean 测试&#xff1a;IOC容器中同类型的 bean 只有一个 正常获取到 IOC 容器中的那个 bean 对象 测试&#xff1a;IOC 容器中同类型的 bean 有多个 会抛出 NoUniqueBeanDefinitionException 异常&#xf…

STM32---ADC

ADC 概念 众所周知&#xff0c;GPIO只能读入高电平或者低电平&#xff0c;那如果现有一个模拟量&#xff0c;该如何读取呢&#xff0c;比如电压的范围是0~3.3v&#xff0c;如何获取电压的值。就需要ADC&#xff08;Analog-Digital Converter&#xff09;了。ADC可以将引脚上连…

自动从Android上拉取指定文件

需求场景 利用Mac中的脚本编辑器实现从连接的Android设备中获取指定的文件。 环境 macOS Monterey 版本 12.7.1脚本编辑器adb环境&#xff08;如果没有的话&#xff0c;可以网上搜下Mac配置adb&#xff09; 实现方案 1、打开脚本编辑器&#xff1b; 2、新建一个脚本文件&…

视频编解码技术介绍 - 基本概念篇

第一章 视频编解码技术介绍 - 基本概念篇 文章目录 前言1. 我的疑问1.1 什么是视频编解码技术1.2 为什么会有视频编解码技术1.3 视频编解码中有哪些核心技术1.4 作为开发者需要重点了解视频编解码中的哪些技术 2. 视频编解码的历史3. 基本概念3.1 像素3.2 分辨率3.3 ppi(像素密…

详细讲解Xilinx DDR3 的MIG IP生成步骤及参数含义

前几篇文章讲解了SDRAM到DDR3各自的变化&#xff0c;本文讲解如何使用DDR3&#xff0c;在Altera的Cyclone IV开发板上一般会使用SDRAM作为存储数据的芯片&#xff0c;而Xilinx的S6和7000系列一般使用DDR3作为存储数据的芯片。 从SDRAM芯片内部结构分析其原理&#xff0c;从内部…

腾讯云8核16g服务器性能好不好?亲测并发数支持人数

腾讯云8核16G轻量服务器CPU性能如何&#xff1f;18M带宽支持多少人在线&#xff1f;轻量应用服务器具有100%CPU性能&#xff0c;18M带宽下载速度2304KB/秒&#xff0c;折合2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;月流量3500GB&#xff0c;折合每天116.6GB流量&…

AHU 人工智能实验-CCA

神经网络覆盖算法——CCA&#xff08;基于Ling Zhang 和Bo Zhang论文) Abstract 在这篇文章中我将介绍基于张铃和张钹学者提出的CCA算法&#xff0c;并实现代码复现&#xff0c;给出使用的数据集&#xff0c;以及实验结果对比。 1. Introduction 1.1 Background 我们知道自…

外包干了6天后悔了,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

[虚拟机保护逆向] [HGAME 2023 week4]vm

[虚拟机保护逆向] [HGAME 2023 week4]vm 虚拟机逆向的注意点&#xff1a;具体每个函数的功能&#xff0c;和其对应的硬件编码的*长度* 和 *含义*&#xff0c;都分析出来后就可以编写脚本将题目的opcode转化位vm实际执行的指令 &#xff1a;分析完成函数功能后就可以编写脚本输出…

跑马灯样式

这里的公告是要做成&#xff0c;跑马灯的样式&#xff0c;文字是会移动并且隐藏掉的。 HTML&#xff1a; <div class"notice"><div class"yrr"><img src"./img/ia_100000018.png" alt"" /></div><div …

循序渐进丨MogDB 数据库特性之动态数据脱敏机制

数据脱敏是行之有效的数据库隐私保护方案之一&#xff0c;可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化脱敏策略来实现对隐私数据保护的技术&#xff0c;可以在保留原始数据的前提下有效地解决非授权用户对敏感信息访问的问题。当管理员…

Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

写在前面 CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞&#xff0c;fastjson 于 1.2.24 版本后增加了反序列化白名单&#xff1b; 而在 2019 年&#xff0c;fastjson 又被爆出在 fastjson< 1.2.47 的版本中&#xff0c;攻击者可以利用特殊构造的 …

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

xss.haozi.me靶机 通关

0x00 没有任何过滤可以直接注入<img srcx οnerrοralert(1)> 0x01 使用了testarea标签将我们的输入内容以普通的字符串进行展示 但是我们可以将标签进行闭合 </textarea><img srcx οnerrοralert(1)> 0x02 我们依然可以先闭合之后添加属性a" οncl…