STM32 TIM定时中断设计

单片机学习

目录

文章目录

一、定时器定时中断设计步骤

二、定时器配置

1.RCC开启时钟

2.选择时钟源

3.配置时基单元

4.配置输出中断控制

5.配置NVIC

6.运行控制

三、设计中断函数

总结


一、定时器定时中断设计步骤

定时中断基本框架结构图:

        根据结构图可按步骤配置定时器

第1步RCC开启时钟。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。

第2步选择时基单元的时钟源。对于定时中断可选择内部时钟源.

第3步配置时基单元,包括预分频器、自动重装器、计数模式等,这些参数可用结构体配置。

第4步配置输出中断控制,允许更新中断输出到NVIC。

第5步配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。

第6步:运行控制,整个模块配置完成后,还需要使能一下计数器,不使能计数器,计数器是不会运行的。当定时器使能后,计数器就会开始计数了;当定时器更新时,触发中断。

第7步设计一个中断函数,中断函数每隔一段时间就自动执行一次。

二、定时器配置

        文章举例初始化通用定时器中的TIM2定时器。

1.RCC开启时钟

        RCC开启时钟。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。因为TIM2是APB1总线外设,所以要使用APB1的开启时钟函数。开启时钟要注意总线的函数选择。

代码示例:

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//使用APB1的开启时钟函数,因为TIM2是APB1总线的外设。

2.选择时钟源

        选择时基单元的时钟源。对于定时中断可选择内部时钟源。

代码示例:

	TIM_InternalClockConfig(TIM2);
//定时器上电后默认使用内部时钟,若不调用这个函数,也是使用内部时钟,有时可省略

        定时器上电后默认使用内部时钟,若不调用这个函数,也是使用内部时钟,有时这个函数可省略。

3.配置时基单元

        配置时基单元,包括预分频器、自动重装器、计数模式等,这些参数可用结构体配置。

代码示例:

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//指定时钟分频TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;//计数器模式TIM_TimeBaseInitStructure.TIM_Period= 10000-1;//ARR自动重装器的值,决定定时时间TIM_TimeBaseInitStructure.TIM_Prescaler= 7200-1;//PSC预分频器的值,决定定时时间,TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0;//重复计数器的值。TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

结构体成员:

  • TIM_ClockDivision:指定时钟分频,用于信号经过滤波器时的滤波采样频率。
  • TIM_CounterMode:计数器模式,这里选择向上计数模式TIM_CounterMode_Up。
  • TIM_Period :ARR自动重装器的值。
  • TIM_Prescaler:PSC预分频器的值。
  • TIM_RepetitionCounter:重复计数器的值,只有高级定时器才有,本文初始化通用寄存器,所以值给0。

        时基单元中关键寄存器参数ARR、PSC都有设置,但是这里没有CNT计数器的参数,CNT参数的配置可更具需要在函数 TIM_SetCounter 和函数 TIM_GetCounter 中操作。

        决定定时时间的参数是 TIM_Period 和 TIM_Prescaler 。定时时间可用计数器溢出频率公式计算,定时频率=72M/(PSC+1)/(ARR+1)。定时1秒,也就是定时频率为1Hz。示例中预分频是对72M进行7200分频,得到的就是10K的计数频率。在10K的频率下,计10000个数,就是1s的时间。

         TIM_Period 和 TIM_Prescaler参数的取值不是唯一的,

  • 可以预分频器给少点,自动重装器给多点,这样就是以一个较高的频率计比较多的数。
  • 可以预分频器给多点,自动重装器给少点,这样就是以一个较低的频率计比较少的数。

这两种方法都可以达到目标的定时时间。因为预分频器和计数器都有1个数的偏差,所以PSC和ARR两个值都要再减1,PSC和ARR的取值都要在0~65535之间,不能超范围。

        TIM_TimeBaseInit函数调用,更新事件和更新中断是同时发生的,更新中断会置更新标志位。就导致TIM初始化完后更新中断就会立刻进入。

解决方案:在TIM_TimeBaseInit函数后,开启中断前添加TIM_ClearFlag函数。

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

4.配置输出中断控制

        配置输出中断控制,允许更新中断输出到NVIC。

代码示例:

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

        函数开启了更新中断到NVIC的通路。

5.配置NVIC

        配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级。

代码示例:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructure);

NVIC配置具体看之前博客STM32 外部中断配置与中断函数设计-CSDN博客

6.运行控制

        运行控制,整个模块配置完成后,还需要使能一下计数器,不使能计数器,计数器是不会运行的。当定时器使能后,计数器就会开始计数了;当定时器更新时,触发中断。

代码示例:

TIM_Cmd(TIM2,ENABLE); 

三、设计中断函数

        设计一个中断函数,中断函数每隔一段时间就自动执行一次。

代码示例:

void TIM2_IRQHandler(void)
{if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//中断执行代码TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了定时器中断配置和对应中断函数的设计。

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

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

相关文章

人工智能知识蒸馏:模型精简与迁移的奇妙之旅

导言 在人工智能领域,知识蒸馏作为一种模型精简和知识迁移的技术手段,逐渐成为提高模型效能和适应更广泛场景的关键工具。知识蒸馏是近年来在深度学习领域备受瞩目的技术,其通过将大模型的知识传递给小模型,旨在实现模型的轻量化与…

patchless amsi学习(中)

DR7 DR7被称为“调试控制寄存器”,允许对每个硬件断点进行精细控制。其中,前8位控制是否启用了特定的硬件断点。偶数位(0、2、4、6)称为L0-L3,在本地启用了断点,这意味着仅在当前任务中检测到断点异常时才…

基于Java SSM框架实现人事员工考勤签到请假管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现人事员工考勤签到请假管理系统演示 摘要 在高速发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,人们对人事管理系统越来越重视&#xff0…

高新技术企业工时管理的挑战与应对策略

随着科技的飞速发展,高新技术企业已成为推动社会进步的重要力量。而在这类企业中,工时管理作为企业管理的重要组成部分,其意义也日益凸显。有效的工时管理不仅关乎企业的项目进度、人力掌控和资源合理配置,还直接影响到企业的研发…

绝地求生:【PC】第27赛季第1轮更新公告

各位玩家大家好!欢迎收看本期更新公告。 正式服维护时间 ※ 下列时间可能会根据维护情况而发生变化。 12月6日上午8:00 – 下午4:30 地图轮换 开发者留言:在基于玩家们的反馈意见进行讨论后,我们决定从第27赛季第1轮更新开始引入新的地图轮…

智能物流解决方案:科聪料箱移动机器人助力高效运输

料箱机器人是一种智能化物流搬运设备,无需借助任何轨道,即可实现多个料箱的智能拣选、存取、搬运。以料箱为存储单元的存储形式,通过信息化系统的统一调度和管理,实现小批量、多批次、高周转率的出入库、拣选等。 ▲料箱机器人现场…

为什么要使用表单?

目录 1.与服务器端的数据交互 2. 表单验证 3. 无需JavaScript支持 4. 语义化 表单元素的局限性 1. 样式限制 2. 客户端验证的局限性 总结: HTML使用表单是为了在Web页面中收集和提交用户输入的数据。表单可以包含多个表单元素,如文本框、下拉列表、单选框和…

nodejs配置express服务器,运行自动打开浏览器

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 设置方法:1,安装nodej…

Endnote在线链接pubmed的时候报错12057:不能连接到吊销服务器,或者未能获得最终响应?

Endnote在线链接pubmed的时候报错12057:不能连接到吊销服务器,或者未能获得最终响应? 问题如下: 解决办法: 在任务栏搜索internet选项并打开 选高级,参照下图配置 完了之后再去EndNote就不会出现此问题了…

YOLOv5改进 | 卷积篇 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv(空间深度转换卷积)技术。SPD-Conv是一种创新的空间编码技术,它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念:它是一种将图像空间信息转换为深度信息…

什么是磁钢的工作点和Pc值?如何计算Pc值?

永磁体是在开路状态下工作的,由于开路状态的磁体是在退磁场的作用下,所以工作状态下的永磁体的磁感应强度不在闭路状态的Br点上,而是在比Br低的退磁曲线上的某一点,这一点称为永磁体的工作点,如下图D点。 工作点与退磁…

Python实验项目9 :网络爬虫与自动化

实验 1:爬取网页中的数据。 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…