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

news2024/10/25 1:33:26

实验目标:

通过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.coloradmin.cn/o/1497742.html

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

相关文章

聊一聊ThreadLocal的原理?

1.ThreadLocal创建方式 ThreadLocal<String> threadlocal1 new ThreadLocal(); ThreadLocal<String> threadlocal2 new ThreadLocal(); ThreadLocal<String> threadlocal3 new ThreadLocal(); 2.首先介绍一下&#xff0c;ThreadLocal的原理&#xff1a; 如…

Git你必须知道的知识

一&#xff1a;使用Git的原因 我们在写版本的时候&#xff0c;可能会谢谢改改&#xff0c;可能要回到之前的文件&#xff0c;修改之前的文件&#xff0c;因此总是要保持很多个文件&#xff0c;且书写文件名也很麻烦。git可以有一个仓库&#xff0c;版本库&#xff0c;可以保存这…

五、循环神经网络语言模型(RNN)

1 循环神经网络基础知识 循环核&#xff08;Recurrent Cell&#xff09;定义&#xff1a; 指在时刻 t 时的神经网络单元&#xff0c;用来处理当前时刻的输入和上一时刻的隐藏状态&#xff0c;并生成当前时刻的输出和下一时刻的隐藏状态。记忆体&#xff08;Memory&#xff09;定…

vue面试--9, 1 ObjectProperty与vue3Proxy区别。2 MVVM的理解 3 双向绑定原理?

1 ObjectProperty与vue3Proxy区别 2 MVVM的理解 3 双向绑定原理&#xff1f;

grid布局所有元素在同一行显示且等分列

目录 一、问题 二、实现方式 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.grid布局可以通过 grid-template-columns来指定列的宽度。且可以通过repeat来指定重复的次数。但是现在的需求是&#xff1a;grid布局中元素的数量不确定&#…

代码随想录算法训练营第24天|77. 组合

77.组合 思路:如果暴力解,需要几个数则需要相应的for循环个数。 回溯法:把数的组合抽象成一颗树,利用递归的思想进行回溯,递归必有回溯。每次遍历到叶子节点,则存入结果。 代码&#xff1a; vector<vector<int>> result;//存放结果vector<int> path;//存放…

vue3基础教程(3)——引入ui框架iview(viewui)

博主个人微信小程序已经上线&#xff1a;【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 下载iview2.更新资源3.引入插件4.运行项目 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。 零基础读者也能成功由本系列文章入门…

PyTorch搭建LeNet测试集实现

搭建神经网络请看PyTorch搭建LeNet神经网络-CSDN博客 实现训练集请看PyTorch搭建LeNet训练集详细实现-CSDN博客 测试集比较简单&#xff0c;直接上代码。 代码实现 # 导包 不必多说 import torch import torchvision.transforms as transforms from PIL import Image from …

AI 应用之路:质疑汤姆猫,成为汤姆猫,超越汤姆猫

过去一年&#xff0c;我对 AI 应用的看法经历了这样一个过程&#xff1a;质疑汤姆猫&#xff0c;理解汤姆猫&#xff0c;成为汤姆猫&#xff0c;超越汤姆猫。 什么是汤姆猫&#xff1f;汤姆猫是 2010 年移动互联网早期的一款应用&#xff0c;迅速走红&#xff0c;又淡出视野。…

[vue error] TypeError: Components is not a function

问题详情 问题描述: element plus按需导入后&#xff0c;启动项目报错&#xff1a; 问题原因 unplugin-vue-components插件版本问题 查看 unplugin-vue-components插件可以发现版本太高了 问题解决 unplugin-vue-components 版本高了&#xff0c;我用的0.26.0&#xff0c…

Qt 绘制中的视口(setViewport)和窗口(setWindow)

重点 &#xff1a; 1.绘制&#xff08;QPainter&#xff09;可以设置视口&#xff0c;视口下设置窗口&#xff0c;而绘制的构件是以窗口为坐标系进行绘画。 2.先根据绘图设备的物理坐标系的矩形位置&#xff0c;设置视图视口setViewport&#xff0c;然后在以视口为区域去设置…

@ResponseStatus

目录 概述&#xff1a; 用途&#xff1a; 参数&#xff1a; 注意事项&#xff1a; 自定义异常类&#xff1a; 底层原理&#xff1a; 概述&#xff1a; 在 Spring MVC 中&#xff0c;我们有很多方法来设置 HTTP 响应的状态码其中最直接的方法&#xff1a;使用 ResponseSt…

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…

记一次systemd服务启动找不到Java命令

首先systemd服务文件 /etc/systemd/system/test.service(文件简化处理了) [Unit] Descriptiontest Afternetwork.target [Service] ExecStart/opt/test/bin/test_start.sh [Install] WantedBymulti-user.target其中启动命令ExecStart指向的是一个sh启动脚本&#xff0c; 脚本内…

Win8.1 连接Wifi后开启热点

1 首先管理员运行 cmd, 输入命令&#xff0c;其中ssid无线名称&#xff0c;key密码&#xff0c;此时网络连接出现 本地连接 2. netsh wlan set hostednetwork modeallow ssidwahahaad key12345678 netsh wlan start hostednetwork 2 找到当前连接的 WLAN, 设置共享。 3 先停止…

第18课:让客户看了就满意的商业软文是如何练成的?

选品上的注意事项 结合影视热点 通过追影视热点&#xff0c;找出能够跟产品贴合的点。在前面先道出痛点&#xff0c;痛点越深刻&#xff0c;用户对产品的过度才会更自然。 用户体验 真实体验才能真正写得出来。 结合时事热点 用的少&#xff0c;赶上了用就会效果很好&#xf…

基于51单片机的万年历-心率脉搏计仿真及源程序-保存心率记录

基于51单片机的万年历-心率脉搏计仿真及源程序-保存心率记录 一、系统方案 1、本设计采用51单片机作为主控器。 2、液晶1602显示。 3、DS1302万年历&#xff0c;测心率&#xff0c;按键设置万年历、心率上下限&#xff0c;不在范围蜂鸣器报警。 4、心率测量值保存3组数据。 二、…

文件另存为保存:无法在未启用宏的工作簿中保存以下功能,

Wb.DoNotPromptForConvert true; Wb.Application.DisplayAlerts false;

Java中super关键字作用及解析

在 Java 中&#xff0c;super关键字主要有以下作用&#xff1a; 在子类构造方法中调用父类的构造方法&#xff1a;使用super关键字可以在子类的构造方法中显式调用父类的构造方法&#xff0c;以便继承父类的属性和行为。语法如下&#xff1a;这样可以确保父类的构造方法被正确…

【2】SLoRa: A Systematic Framework for Synergic Interference Resilience In LPWAN

这一篇基于上一篇文章,仅记录我遗忘的知识点&#xff1b; 以较低的成本提供可靠的符号恢复&#xff1b; 符号恢复【振幅和频率】 为了避免环境噪声并提高可靠性&#xff0c;我们采用信号预处理和窗口滑动算法来检测幅度变化点&#xff1b; 信号处理&#xff1a;归一化和指数化…