细说MCU定时器中断的实现方法

目录

一、硬件及工程 

二、STM32G4系列MCU的定时器

三、定时器中断的实现过程

1、配置新工程.ioc

2、代码修改

(1)时钟初始化函数MX_TIM3_Init()

(2)使能定时器中断

(3)定时器中断服务函数

(4)重定义定时器回调函数

3、下载并运行 

4、修改定时器参数


一、硬件及工程 

        文章依赖的硬件及工程配置同本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112

二、STM32G4系列MCU的定时器

         STM32G4系列MCU的定时器功能比较强大,有下面几种定时器:

  • 1个高精度定时器(high-resolution timer);
  • 3个高级控制定时器(advanced-control timer);
  • 7个通用定时器(general-purpose timer);
  • 2个基本定时器(basic timer);
  • 2个看门狗定时器(watch-dog timer);
  • 1个SysTick定时器。

  

定时器

计数器
精度

计数器类型

预分频因子

DMA
请求产生

捕捉/

比较通道

互补输出

高精度
定时器

HRTIM

16

Up

1/2/4(x2,x4,
x8,x16,x32,
DLL)

12

高级
控制

TIM1TIM8TIM20

16

UpDown
Up/Down

165536
之间的整数

4

4

通用

TIM2TIM5

32

UpDown
Up/Down

165536
之间的整数

4

通用

TIM3TIM4

16

UpDown
Up/Down

165536
之间的整数

4

通用

TIM15

16

Up

165536
之间的整数

2

1

通用

TIM16TIM17

16

Up

165536
之间的整数

1

1

基本

TIM6TIM7

16

Up

165536
之间的整数

0

        定时器最基本的功能是起到定时的作用,其中有一个关键模块:计数器(counter)。该计数器可以循环往复计数,计数的模式有三种类型:升、降和升/降。Up模式是从0到最大值递增计数,计到最大值后再从0重新开始计。

        除了TIM2和TIM5以外,其余的定时器中,计数器都是16位,相应的计数最大值为65535。除了计数器的参数以外,定时器中的另一个比较重要的参数是预分频因子(prescaler factor),这个参数关系到两次计数之间的计时间隔(具体数值,还要结合定时器的时钟频率来计算)。此外,定时器还可用于输入捕捉,以及产生PWM波形(互补)输出;当然对这两个功能,不同的定时器是有差别的。

三、定时器中断的实现过程

        本文利用 STM32G474RE上的通用定时器,以定时器中断的方式控制NUCLEO - G474RE板上的发光二极管LD2以不同的频率闪烁(该功能也可通过延时函数的方式实现)。

1、配置新工程.ioc

  • 配置GPIO:配置PA5为输出,用PA5控制开发板上的LD2。Level=High,mode=PP,Pull_up,speed=High,Label=LED;
  • 外部时钟,Serial Wire;
  • 配置定时器:打开TIM3的配置界面,在模式(Mode)区,将时钟源(Clock Source)选择为Internal Clock;然后,在配置区中,将参数设置(Parameter Settings)选项卡中的预分频因子(Prescaler)和计数器周期(Counter Period)分别设置为999和16999。这两个参数从0开始计数,分频因子为999,实际为分频999+1倍;计数器周期的计算与此相同。这里的计数周期实际就是计数器计数时的最大值,在时钟频率确定的情况下,预分频因子决定着两次计数之间的时间间隔。所以,根据这两个参数以及定时器的时钟频率,就可以计算出定时器计数的周期。此外,把计数模式(Counter Mode)设置为升模式(Up),并使能自动重载(auto-reload preload)。
  • 配置中断:使能TIM3的全局中断。将它的抢占式优先级设为1,响应优先级设为0。
  • 配置系统时钟:将系统时钟(SYSCLK)频率配置为170 MHz。定时器的时钟来自高级外设总线(APB,Advanced Peripheral Bus),APB的时钟也有自己的预分频因子,如果该因子为1,则定时器的时钟频率就与APB时钟相同,也与系统时钟相同,都是170 MHz。

2、代码修改

        至此,硬件配置便完成了。保存,启动代码生成过程,系统会将刚才配置硬件的信息自动转换成代码。

(1)时钟初始化函数MX_TIM3_Init()

         该函数自动生成。

/*** @brief TIM3 Initialization Function* @param None* @retval None*/
static void MX_TIM3_Init(void)
{/* USER CODE BEGIN TIM3_Init 0 *//* USER CODE END TIM3_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM3_Init 1 *//* USER CODE END TIM3_Init 1 */htim3.Instance = TIM3;htim3.Init.Prescaler = 999;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 16999;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM3_Init 2 *//* USER CODE END TIM3_Init 2 */}

        MX_TIM3_Init()函数主要完成对TIM3的模式和参数配置,如预分频因子、计数模式、计数周期等参数。在MX_TIM3_Init()函数的定义中,用到了一个结构体变量htim3,该结构体变量也被称为定时器句柄。这个变量是在自动代码生成过程中自动生成的,位于main.c文件的最前面:

TIM_HandleTypeDef htim3;

        在MX_TIM3_Init()函数的定义中,把设置的参数赋给了结构体变量htim3。其中一条if语句,在其条件表达式中调用了一个函数:HAL_TIM_Base_Init(&htim3);结构体变量htim3通过调用HAL_ TIM_Base_Init(&htim3)实现与实际硬件关联的。该函数只有一个参数。调用时,把刚配置的结构体变量htim3传递了过来。实际上,真正与硬件关联的,还不是HAL_TIM_Base_Init()函数,而是在HAL_TIM_Base_Init()函数中调用的TIM_Base_SetConfig()函数。正是通过TIM_Base_SetConfig()函数,才真正地把设置的参数传递给了相关寄存器。在库函数文件stm32g4xx_hal_tim.c中有对TIM_Base_Set-Config()函数的定义。

(2)使能定时器中断

        虽然配置了TIM3的中断功能,但在默认情况下,中断不是开启的。所以,在使用时,还要开启该中断。开启定时器中断可以使用如下库函数:

HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

        该函数也只有一个参数,并且该参数也是一个结构体变量。对于TIM3来说,其实就可以用前面提到的htim3。开启定时器中断可以使用如下代码:

/*USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3);    //手动添加
/*USER CODE END 2*/

        上述代码位于while(1)循环前面的注释对中。不过,需要将它放到TIM3初始化函数MX_TIM3_ Init()的后面。

(3)定时器中断服务函数

        开启TIM3的中断后,当条件满足时,就会执行定时器中断服务函数TIM3_IRQHandler()。该函数是自动生成的,位置在stm32g4xx_it.c文件中有该函数的定义:

/*** @brief This function handles TIM3 global interrupt.*/
void TIM3_IRQHandler(void)
{/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&htim3);/* USER CODE BEGIN TIM3_IRQn 1 *//* USER CODE END TIM3_IRQn 1 */
}

        TIM3_IRQHandler()函数的定义中又调用了HAL_TIM_IRQHandler()函数,此函数的定义在stm32g4xxhal_tim.c中。实际上,在HAL_TIM_IRQHandler()函数中,还会调用TIM中断的回调函数HAL_TIM_PeriodElapsedCallback()。这个函数的定义也是在stm32g4xxhal_tim.c中,不过,被定义为一个弱函数。这种方式与串口中断接收过程是类似的。就像对串口接收中断回调函数的处理一样,在定时器中断的使用中,需要做的是在main.c中重新定义TIM中断的回调函数。

(4)重定义定时器回调函数

        在main.c中重新定义回调函数HAL_TIM_PeriodElapsedCallback()。在其中让PA5的输出状态翻转。具体实现如下:

/*USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
/*USER CODE END 4*/

        本例中,定时器的预分频因子(Prescaler)和计数器周期(Counter Period)分别置为999和16999,定时器的时钟频率为170 MHz,最终TIM3中断的周期为

(999+1)/(170×10⁶)×(16999+1)=0.1(s),即频率为10 Hz。

3、下载并运行 

        编译工程并下载到硬件中运行,会看到LD2灯以5 Hz的频率闪烁。为什么是5 Hz因为控制PA5用的是Toggle。

4、修改定时器参数

        修改定时器的预分频因子(Prescaler)和计数器周期(CounPeriod),改变LD2灯的闪烁频率为1 Hz、0.5 Hz等。

(19999+1)/(170×10⁶)×(16999+1)=2(s),即频率为2 Hz。
(9999+1)/(170×10⁶)×(16999+1)=1(s),即频率为1 Hz。

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

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

相关文章

从混乱到秩序:数据提取与治理的重要性

🔥从混乱到秩序:数据提取与治理的重要性🔥 📊 大家好,今天我们来聊聊一个在我们生活中无处不在,但又经常被忽视的话题——#数据提取与治理#。 💭 想象一下,你走进一个满是杂物的房…

Android Calculator2源码分析与修改

private CalculatorDisplay mDisplay; private Symbols mSymbols new Symbols(); -41,6 44,7 class Logic { private int mLineLength 0; private static final String INFINITY_UNICODE “\u221e”; private static final String ZMS_NUMBER “55555”; public stat…

Linux构建本地时间同步ntp

环境介绍: 主机名 IP地址 系统发行版 环境 Node01 192.168.100.102 Centos 7.4 可联网、已关闭防火墙selinux Node02 192.168.100.103 Centos 7.4 已关闭防火墙selinux 1.主节点同步阿里云标准时间 在保证连接外网的情况下,同步阿里服务器的…

C#面:构造函数是否能被重写?

构造函数不能被重写。 构造函数是用于创建对象时初始化对象的特殊方法,它的名称与类名相同,并且没有返回类型。在派生类中,可以使用基类的构造函数来初始化继承的成员,但不能重写基类的构造函数。派生类可以定义自己的构造函数来…

安卓gradel下载失败解决方案

安卓gradel下载失败解决方案 直接下载下来放到指定目录下 直接下载下来放到指定目录下 目录:C:\Users\Administrator.gradle\wrapper\dists(可以直接在C盘搜索.gradle文件夹) 找到后,将gradle*.zip放到与.zip.lck和.zip.ok同级的…

nodejs日志:morgan和winston篇

文章目录 介绍一下morgan和winston的区别morgan功能优势: winston功能优势 选择 代码示例 介绍一下morgan和winston的区别 morgan 功能 morgan 是一个 HTTP 请求日志中间件,专门用于记录 Express 应用的 HTTP 请求日志。它简单易用,提供多…

Spring的SmartLifecycle可以没用过,但没听过就不好了! - 第517篇

历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

three.js开发3D地图记录(一)

关键代码部分&#xff1a; <template><div class"center-map-box" id"contant"></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/control…

springboot小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

EIQ-ABC 分析法在配送中心储位分配中的应用

配送中心运作效率的高低主要取决于仓储业务流程的作业效率&#xff0c;在配送作业流程中&#xff0c;储位分配的是否合理性成为影响配送运作效率的重要因素。为实现储位的合理分配&#xff0c;提出通过对订单信息的分析&#xff0c;并应用 EIQ-ABC 分析法&#xff0c;以此实现缩…

白酒:茅台镇白酒的品牌合作与跨界营销案例

云仓酒庄豪迈白酒&#xff0c;作为茅台镇的知名品牌&#xff0c;在品牌合作与跨界营销方面也有着杰出的表现。通过与不同领域品牌的合作&#xff0c;豪迈白酒进一步拓宽了市场渠道&#xff0c;提升了品牌曝光度和影响力。 首先&#xff0c;云仓酒庄豪迈白酒与品质餐产品牌的合作…

解析文字示例

import pandas as pdtext f""" “时筱怎么也没想到&#xff0c;一觉睡醒&#xff0c;她竟然回到末世前&#xff0c;回到一切都还没有发生的时候&#xff01;“上辈子&#xff0c;父母在末世一开始就没了&#xff0c;本以为相互扶持的未婚夫早就和表妹搞在一起&…

Linux 环境.Net程序堆栈查询

# 安装 dotnet tool install --global dotnet-dump# 收集信息, 产生 core_XXX 文件 dotnet-dump collect -p pid# 分析 core_XXX 文件 dotnet dump analyze core_XXX# 列出 大于 XXX 字节的 对象 dumpheap -stat -min XXX# 查看对象具体信息 dumpobj address_XXX# 查看对应引用…

量子革命 “不负众望“!即将见证首个商业量子应用案例?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨沛贤/浪味仙 排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅读 摘要&#xff1a;雀巢、联合利华和德国能源巨头 E.ON 表示&#xff0c;距离首个商用量子案例出现可能只需三年时间。 近…

tracetcp下载 安装 使用 网络工具 windows trace工具 tcp协议

省流 Tracetcp是一个类似于Tracert的工具&#xff0c;使用如下&#xff1a; 1. 安装winpcap &#xff0c; 下载链接&#xff1a;WinPcap Download 2.下载tracetcp软件&#xff0c;下载链接&#xff1a; https://github.com/0xcafed00d/tracetcp/releases 命令&#xff1a;…

期末考试老师怎样发成绩

期末成绩的公布&#xff0c;总是让老师感到焦虑。成绩&#xff0c;这一张张的数字&#xff0c;承载着学生一学期的努力&#xff0c;也牵动着家长们的心。 传统的成绩公布方式&#xff0c;写成绩条让学生带回家&#xff0c;或是通过私发家长的方式&#xff0c;都存在一定的弊端。…

六、Nginx-正向代理和反向代理

目录 一、正向代理 1、参数详解 2、常用变量详解 3、配置示例 二、反向代理 三、 Nginx的安全控制 1、如何使用SSL对流量进行加密 2、nginx添加SSL的支持 3、 Nginx的SSL相关指令 &#xff08;1&#xff09;ssl &#xff08;2&#xff09;ssl_certificate &#xff0…

【Kaggle量化比赛】Top讨论

问: 惊人的单模型得分,请问您使用了多少个特征来获得如此高的得分?我也在使用LGB模型。 答 235个特征(180个基本特征+滚动特征) 问: 您是在使用Polars进行特征工程还是仅依赖于Pandas+Numba/多进程?即使进行了Numba优化,我也发现当滚动特征过多时,推理速度会非常慢。在…

淘宝商品评论API接口测试实例(获取淘宝商品评论,翻页展示、支持并发)

item_review-获得淘宝商品评论 测试页 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop…

设计灵感源泉!7个令人赞叹的网页界面设计展示

网页的界面设计主要是指视觉设计和风格设计。高质量的界面更容易吸引用户的注意力&#xff0c;从而更准确地向用户传达信息。对于设计师来说&#xff0c;他们需要从高质量的作品中获得稳定的灵感&#xff0c;以帮助他们更高效地实现设计目标。在本文中&#xff0c;梳理了7个高质…