STM32F4-普通计时器TIM9-回调函数执行过程详解

原创 云深之无迹 2025-02-05 14:03

这个定时器是倒数的,数字大的,功能少。

我找到了一段比我形象的解读。

定时器的基本功能是计时功能,如同闹铃一般,设定好对应的时间后,会在设定的时刻响起铃声。

不管多复杂,都是这三个寄存器

分频(PSC):时钟上不同的指针需要有不同的速度,也就是不同的频率,从而精确的表示时间,比如秒针,分针,时针,这三者相邻的频率之比都是 60:1,即秒针每转过 60 格分针转动 1 格,分针转动 60 格时针转动 1 格,所以分针对于秒针的分频为 60。
计数(CNT):时钟所对应的值都是与工作时间成正比的,比如秒针转动 10 格,意味着过了 10秒,同样定时器中的计数也是和计数时间成正比的值,频率越高增长速度越快。
重载(ARR):时、分、秒的刻度都是有上限的,一个表盘最多记 12 小时, 60 分钟, 60 秒,如果继续增加的话就会回到 0。同样的在定时器中也需要重载,当定时器中的计数值达到重载值时,计数值就会被清零。
时钟源处的时钟信号经过预分频寄存器,按照预分频寄存器内部的值进行分频。比如时钟源的频率为 16MHz,而预分频寄存器中设置的值为 16:1,那么通过预分频后进入定时器的时钟频率就下降到了 1MHz。
在已经分频后的定时器时钟驱使下, TIMx_CNT 根据该时钟的频率向上计数,直到TIMx_CNT 的值增长到与设定的自动重装载寄存器 TIMx_ARR 相等时, TIMx_CNT 被清空,并重新从 0 开始向上计数, TIMx_CNT 增长到 TIMx_ARR 中的值后被清空时产生一个定时中断触发信号。综上定时器触发中断的时间是由设定的 TIMx_PSC 中的分频比和TIMx_ARR 中的自动重装载值共同决的。

可以看到是和TIM1的中断重叠的,需要程序里面判断

在NVIC里面确实是这样的

这个是使能

Bit0就是管这个的

每一种中断都有对应的中断函数,当中断发生时,程序会自动跳转到处理函数处运行,而不需要人为进行调用。
如第一节中,当定时器的计数值增长到重载值时,在清空计数值的同时,会触发一次定时器中断,即定时器更新中断。只要设定好定时器的重载值,就可以保证定时器中断以固定的频率被触发。

输入模式是使用这个内置的这个时钟

参数没几个,下面是时钟进来太快,会分频一下

其实就是配置这个结构体

GUI选好的

就把这个htim9传给这个函数来启动

这些是TIM可以传入的定时器源,在这里

时钟也OK

有着丰富的中断事件

也就是这个图里面最小的定时器部分,进来以后到CK_PSC,往后:

就是要这些事件

注意,HAL库里面这个定时器的中断没有写,需要自己写上

开始运行以后,有事件产生,然后就可以编程控制了。

这些就是我们感兴趣的中断事件

在HAL库

所有的回调函数,在这里都是弱定义

需要复制一个函数头过来重新写

每个回调函数在特定的定时器事件发生时被调用。

HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
功能: 当定时器的计数器达到自动重装载值(即定时器溢出)时调用。
应用场景: 通常用于周期性任务,如定时器中断。

就是这里

HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef htim)
功能: 当定时器的计数器达到自动重装载值的一半时调用。
应用场景: 适用于需要在中途执行某些操作的场景。
HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef htim)
功能: 当输出比较(Output Compare)延迟时间到达时调用。
应用场景: 用于需要精确控制输出信号延迟的应用。
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef htim)
功能: 当输入捕获(Input Capture)事件发生时调用。
应用场景: 用于测量外部信号的频率或脉冲宽度。
HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef htim)
功能: 当输入捕获事件完成一半时调用。
应用场景: 适用于需要在中途处理捕获数据的场景。
HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef htim)
功能: 当PWM脉冲完成时调用。
应用场景: 用于PWM信号生成,处理脉冲结束后的操作。
HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef htim)
功能: 当PWM脉冲完成一半时调用。
应用场景: 适用于需要在中途处理PWM信号的场景。
HAL_TIM_TriggerCallback(TIM_HandleTypeDef htim)
功能: 当定时器触发事件发生时调用。
应用场景: 用于同步多个定时器或触发其他外设操作。
HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef htim)
功能: 当定时器触发事件完成一半时调用。
应用场景: 适用于需要在中途处理触发事件的场景。
HAL_TIM_ErrorCallback(TIM_HandleTypeDef htim)
功能: 当定时器发生错误时调用。
应用场景: 用于错误处理,如计数器溢出错误等。

因为我们上面写了,TIM1的中断和9的在一起,所以要判断

当定时器计数器溢出时,STM32 HAL 库会自动调用 HAL_TIM_PeriodElapsedCallback 函数。
在函数内部,代码会检查触发事件的定时器实例是否是 htim9(TIM9 定时器)。

有点像Python里面的self的感觉

使用一个静态变量 tim_delay 来计数定时器溢出的次数。
tim_delay 只在当前函数中使用,可以保持为静态变量。如果有其他函数需要访问它,可以考虑将其定义为全局变量。
每次定时器溢出时,tim_delay 的值会加 1。
条件判断:
当 tim_delay 的值达到 500 时,表示定时器已经溢出了 500 次。
此时,tim_delay 会被重置为 0,并执行 HAL_GPIO_TogglePin() 函数。

通过定时器 TIM9 的溢出事件,每 500ms 切换一次 GPIO 引脚的状态。

如果写程序的话,其实已经完美了。但是我们靠这个东西吃饭,那就需要继续挖。

寄存器这些都没有看见,怎么做到的?

这个函数

上面函数的返回值是这个的时候才证明可以继续执行

确定上面OK,就是用一个宏打开我们感兴趣的中断

正是我们感兴趣的

使用宏的效率更高

继续看看这个初始化的函数

如果定时器的状态是 HAL_TIM_STATE_RESET,即定时器还没有被初始化过,那么执行初始化过程:
初始化定时器的锁资源(htim->Lock = HAL_UNLOCKED;)。

如果启用了回调机制(USE_HAL_TIM_REGISTER_CALLBACKS == 1),则会使用回调函数来初始化硬件。

否则,直接调用 HAL_TIM_Base_MspInit 函数进行硬件初始化。

htim->State = HAL_TIM_STATE_BUSY;

在初始化过程中,定时器的状态设置为 BUSY,表示当前正在执行初始化操作。

这行代码是核心操作,它调用 TIM_Base_SetConfig 函数来配置定时器的基本设置,传入定时器实例和定时器初始化参数(包括计数模式、周期、时钟分频等)。

  1. 检查定时器句柄和配置参数的有效性。
  2. 如果定时器还未初始化,进行硬件和回调函数的初始化。
  3. 配置定时器的基本设置(如计数模式、时钟分频等)。
  4. 初始化 DMA 和通道状态。
  5. 设置定时器为就绪状态,表示定时器已经准备好进行工作。

以上就是初始化过程。

其实说了这么多,中断的寄存器这部分还是没有摸到。

在这里

TIM1_BRK_TIM9_IRQHandler 是定时器1的断路中断和定时器9的全局中断的统一处理函数。
函数的核心是调用 HAL_TIM_IRQHandler(&htim9) 来处理定时器9的中断事件。
在中断发生时,开发者可以通过 USER CODE 区域插入自定义代码,处理定时器1的断路中断或定时器9的中断逻辑。

函数核心在此

HAL_TIM_IRQHandler 是一个通用的中断处理函数,处理与定时器相关的所有中断事件。

它会根据不同的中断标志来调用对应的回调函数,从而完成特定的任务,例如捕获比较(input capture)、输出比较(output compare)、PWM脉冲完成等。

  1. itsource 表示定时器的中断使能寄存器(DIER),它包含了各个中断源的使能位。
  2. itflag 表示定时器的状态寄存器(SR),它包含了各个中断的标志位,指示哪种事件发生了。

如果定时器溢出或达到了自动重载值(即定时器周期),则会触发更新事件,调用 PeriodElapsedCallback

在代码中,回调函数的调用依赖于宏 USE_HAL_TIM_REGISTER_CALLBACKS 的值:
如果宏定义为 1,使用用户注册的回调函数(例如 htim->IC_CaptureCallback(htim))。
否则,调用库函数提供的默认回调(如 HAL_TIM_IC_CaptureCallback(htim))

上面是回调,下面是非常细节的细节。

用于处理中断标志 TIM_FLAG_UPDATE,它检查是否发生了定时器的 更新事件(比如定时器溢出或者达到自动重载值)。当这种事件发生时,代码会清除该中断标志,并调用一个回调函数 PeriodElapsedCallback

检查定时器是否发生了 更新事件(如溢出或计数器到达自动重载值)。

确保 更新中断 被使能(即相关的中断被允许触发)。

清除中断标志,防止中断重复触发。

STM32 的定时器有一个状态寄存器,存储了每个中断源的标志位。为了避免重复触发中断,必须在中断处理程序中手动清除该标志。
__HAL_TIM_CLEAR_FLAG 宏会清除定时器中指定的标志位,确保该事件只处理一次。

调用用户定义的回调函数 PeriodElapsedCallback,用于处理定时器周期结束后的任务(例如,周期性的任务或超时操作)。

htim 是定时器句柄,包含定时器的配置和状态。回调函数通过句柄传递,以便访问和操作相关的定时器信息。

void (*PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim);

在这里

大概就是这样了。

评论
  •  探针台是半导体测试领域的重要设备,用于支撑和固定待测芯片,以便进行jing确的电气测试。在使用过程中,探针台可能会出现位置偏移,这时就需要进行复位操作。下面,我们将详细介绍探针台复位的zui简单三个步骤。  一、确定复位基准点复位操作的di一步是确定复位基准点。通常,探针台会配备有明确的复位标记或感应点。用户需要仔细查找并确认这些标记,确保复位操作的准确性。找到基准点后,将探针台移动到该位置附近,准备进行下一步操作。二、执行复位动作在确认基准点后,接下来需要执行复
    锦正茂科技 2025-02-15 09:36 93浏览
  • 2025,新一轮汽车行业“战争”开始,但这一次不是过往的“价格战”,而是新一轮的“智驾战”。近期,比亚迪董事长兼总裁王传福在比亚迪智能化战略发布会上表示:“比亚迪将全系搭载“天神之眼”高阶智驾系统,其中首批21款车型将陆续上市,包括秦家族、元家族、宋家族、海豹家族等。”具体来看,20万元以上、15万元至20万元、10万元至15万元级别的车型将全系标配“天神之眼”。10万元以下的车型多数将搭载“天神之眼”,包括海鸥、海豹05DM-i和第二代秦PLUS DM-i。智驾不是什么新鲜技术,但是在比亚迪之
    刘旷 2025-02-18 10:19 25浏览
  •                           春天来了,我们中国的传统节日--春节到了,随着国家富强,人们民族文化自信心的增强,这个中国年过的还挺热闹,挺红火。一段山村过新年的快乐时光,即兴而发赋了两首新诗。《渔家乐·山村新春》白发垂髫同喜乐,新春佳节意情奢。烟花璀璨腾空起,山村美景醉心涯。晓雾轻笼林野静,晚云淡抹岫峰斜。自然恩赐千般好,福满人间岁月嘉
    广州铁金刚 2025-02-17 15:59 97浏览
  •         电磁铁作为一种能够利用电流产生磁性的装置,在现代社会的生产和生活中发挥着越来越重要的作用。其应用范围广泛,不仅局限于工业制造领域,还深入到交通运输、医疗健康以及我们的日常生活之中。一、电磁铁在工业制造中的应用       在工业制造领域,电磁铁的应用可谓是举足轻重。它们被广泛应用于各种机械设备和生产线中,起着自动化控制、物料搬运等关键作用。例如,在重型机械中,电磁铁用于吸附和移动大型金属构件
    锦正茂科技 2025-02-18 10:05 22浏览
  • 导读:2025年1月6日,在 ChatGPT 诞生两周年之际,OpenAI 的核心人物 Sam Altman 回顾了一段波澜壮阔且充满挑战的历程。九年前,怀揣着对通用人工智能(AGI)的坚定信念,OpenAI 踏上征程。彼时,质疑声不绝于耳,多数人认为这毫无成功的可能。但他们未曾动摇,毅然投身这一充满未知的领域。直至 2022 年 ChatGPT 的推出,如同在科技领域投入巨石,引发轩然大波,开启了前所未有的发展态势。然而,荣耀背后是难以想象的艰难。围绕新技术构建公司,犹如在黑暗中摸索前行,每一
    用户1739588245528 2025-02-15 11:03 145浏览
  • 嘿,大家好!在高压电子世界里摸爬滚打的朋友们,你们有没有遇到过这样的难题?那就是,如何选择适合高压环境的光颉精密电阻? 这可不是一个简单的问题,毕竟在高压环境下,电阻不仅要顶得住电压的“压力”,还得保证精度和稳定性,这要求可真不低。想想看,如果选错了电阻,就像给跑车装了个自行车轮,那能行吗?肯定不行!轻则电路性能大打折扣,重则电阻直接“罢工”,甚至引发更严重的后果。所以说,在高压应用中,选择一款靠谱的光颉精密电阻,那可是至关重要的。别担心,今天咱们就来好好聊聊,如何选择适合高压环境的光
    贞光科技 2025-02-18 17:28 32浏览
  • 概述        TC10 为OPEN Alliance 中的一个技术委员会小组,专注于研究基于车载以太网的休眠唤醒机制,旨在为汽车应用场景提供灵活的休眠唤醒解决方案。该小组提出的休眠唤醒规范(《TC10 Sleep/Wake-up Specification》,以下简称TC10规范)作为对IEEE 802.3系列规范的补充,详细定义了以太网PHY的休眠唤醒过程、新增服务原语和接口、时间参数、指令描述等内容。目前,TC10已经发布了适配10Ba
    经纬恒润 2025-02-18 14:30 30浏览
  • 随着国内市场的逐渐稳固,华为将目光投向了广阔的海外市场,开启了一段充满挑战与机遇的国际化征程。然而,华为在拓展海外市场时,遭遇了重重困难。文化差异带来的挑战不同国家和地区有着不同的文化背景、商业习惯和价值观,这使得华为在与当地客户、合作伙伴沟通和合作时面临诸多障碍。在欧洲,一些客户对产品的认证标准和售后服务有着非常严格的要求,并且注重商务活动中的礼仪和沟通方式。在机上欧洲通信市场竞争激烈,爱立信、诺基亚等本土企业在技术、品牌和市场份额上具有优势。而且欧洲各国的通信标准和监管政策不同,华为需要满足
    韭菜财经 2025-02-18 14:11 45浏览
  • 《哪吒2》票房破百亿背后的科技密码:解码中国动画产业的技术跃迁与制造底气2024年夏季,国产动画电影《哪吒2》以雷霆之势席卷全球院线,不仅成为中国影史第二部票房突破百亿的现象级作品,更以多项技术突破刷新行业纪录。这些成就背后,不仅是中国动画工业的崛起,更是中国科技创新与高端制造业协同突破的缩影。作为深耕PCB行业多年的捷多邦小编,今天带您从技术视角,解读这场银幕奇迹背后的制造密码。一、从“数字造神”到“算力革命”:动画技术背后的硬核突破《哪吒2》的视觉革命始于AI工业化管道的深度应用。影片中大量
    捷多邦 2025-02-15 17:57 428浏览
  • 清晨,闹钟准时响起,窗帘自动拉开,床灯随之亮起,音箱中则自动传出每日的早间新闻,从而唤醒熟睡中的你,而这只是智能家居中的冰山一角。作为人类群体追求更高生活品质的居住空间,智能家居正飞速普及至我们的日常生活之中,极大地提升了生活的便利性与舒适度。然而,随着单品智能向全屋智能的快速发展,不同智能家居设备的工作电压与通信频率等运行参数存在差异,它们共同运行在一个智能家居系统之中,其所产生的电气噪声与电磁干扰会互相影响,并形成潜在的安全隐患。例如,电气噪声可能导致线路过热,增加电气火灾的发生风险;电磁干
    华普微HOPERF 2025-02-18 10:48 22浏览
  • 近日,紫光展锐蜂窝物联网芯片V8850荣获国密一级认证,标志着展锐V8850在安全能力方面获得权威认可,位居行业领先水平。这是紫光展锐继短距物联网芯片V5663在2020获得ARM PSA Level 2认证,蜂窝物联网芯片V8811在2021年获得ARM PSA Level 1 认证后,第三次荣获安全行业权威认证。荣获国密一级安全认证,意味着紫光展锐V8850能支持智能支付、共享经济、定位追踪、安防监控、智能表计、工业DTU、公网对讲,以及车载通信终端设备上的国密升级改造,可为移动支付、短信
    紫光展锐 2025-02-14 19:26 75浏览
  •  电磁铁的磁芯材质:软铁还是硬铁电磁铁的磁芯通常采用软铁材质,因其具有高磁导率和低矫顽力,使得电磁铁能够在通电时迅速产生强磁场,断电后磁场又能迅速消失。一、电磁铁与磁芯材质电磁铁是一种利用电流产生磁场的装置。其核心部件——磁芯,对电磁铁的性能有着至关重要的影响。在选择磁芯材质时,需要考虑多种因素,如磁导率、矫顽力、饱和磁化强度等。这些因素直接关系到电磁铁的工作效率、响应速度和能耗等方面。二、软铁与硬铁的特性软铁和硬铁是两种常见的磁性材料。软铁具有高磁导率和低矫顽力的特点,这意味着它容易
    锦正茂科技 2025-02-18 10:32 20浏览
  • 电磁铁通电时会产生磁场,磁力随电流增强而增强,表现出吸引铁磁性物质的特性。电磁铁是一种能够产生磁场的装置,其特性在于可以通过通电来控制磁场的产生和消失。那么,当电磁铁通电时,它具体会表现出哪些特性和现象呢?一、产生磁场通电是电磁铁产生磁场的关键。当电流通过电磁铁的线圈时,线圈周围就会产生磁场。这个磁场与电流的大小和方向密切相关,电流越大,产生的磁场也越强。同时,磁场的方向可以通过改变电流的方向来改变,这是电磁铁灵活性的重要体现。二、磁力变化随着电流的增强,电磁铁产生的磁力也会相应增强。这种磁力的
    锦正茂科技 2025-02-15 09:59 108浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦