首页 > 其他分享 >STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用 HAL_TIM_IRQHandler(&timer_handle)?

STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用 HAL_TIM_IRQHandler(&timer_handle)?

时间:2024-11-04 18:48:48浏览次数:3  
标签:TIM2 STM32 HAL 中断 ISR IRQHandler TIM handle

STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用 HAL_TIM_IRQHandler(&timer_handle); 而不是TIM2_IRQHandler(void)里直接写需要的程序呢? 而标准库只需要在TIM2_IRQHandle里写中断需要的代码即可?

        在STM32 HAL库中,中断服务函数(ISR)的设计思路与标准外设库(SPL)有所不同。这种差异主要体现在对硬件抽象层(HAL)的封装和易用性上。下面详细解释为什么HAL库中TIM2_IRQHandler(void)会调用HAL_TIM_IRQHandler(&timer_handle);而不是直接在ISR中编写中断处理代码。

STM32的HAL库的设计哲学

STM32 HAL库旨在提供一个更为高级和统一的API接口,使得开发者能够更容易地在不同的STM32系列之间迁移代码。HAL库通过对底层硬件操作的封装,提供了更加抽象和易于管理的函数接口。这种设计有助于减少直接操作寄存器的复杂性,提高代码的可读性和可维护性。

STM32的中断处理机制

  1. 中断服务函数(ISR)
    • 在STM32的HAL库中,每个外设(如定时器TIM)的中断服务函数(ISR)通常是由库自动生成的,或者是用户根据库文档创建的。这些ISR通常命名为XXX_IRQHandler,其中XXX是外设的名称(如TIM2)。
  2. HAL库的中断处理函数
    • HAL库为每个外设的中断提供了一个通用的处理函数,如HAL_TIM_IRQHandler()。这个函数负责检查中断的来源(例如更新事件、输入捕获事件等),并调用相应的回调函数(如果已配置)。

为什么在ISR中调用HAL_TIM_IRQHandler()

  1. 统一处理
    • 通过在ISR中调用HAL_TIM_IRQHandler(&timer_handle);,可以确保所有的中断处理逻辑(无论是更新事件、输入捕获、输出比较等)都通过同一个函数接口进行。这使得代码更加统一和易于管理。
  2. 回调函数机制
    • HAL库允许用户为每个中断源配置一个回调函数(如HAL_TIM_PeriodElapsedCallback())。当特定类型的中断发生时,HAL_TIM_IRQHandler()会检查中断标志,并调用相应的回调函数。这种机制允许开发者在不修改ISR的情况下,添加或修改中断处理逻辑。
  3. 可移植性和复用性
    • 通过使用HAL库提供的标准接口,开发者可以更容易地在不同的STM32系列之间迁移代码。此外,由于ISR的内容被封装在HAL库内部,开发者可以专注于实现具体的业务逻辑,而不需要关心底层的中断处理细节。

STM32的标准库与HAL库的比较

        在标准外设库(SPL)中,开发者需要在ISR中直接编写中断处理代码。这种方式虽然提供了更高的灵活性,但也增加了代码的复杂性和维护难度。相比之下,HAL库通过提供抽象层和回调函数机制,简化了中断处理流程,提高了代码的可读性和可维护性。

        HAL库中的ISR通过调用HAL_TIM_IRQHandler(&timer_handle);来处理中断,是出于统一处理、回调函数机制和代码可移植性等方面的考虑。这种设计使得开发者能够更专注于实现具体的业务逻辑,而不需要过多地关注底层硬件操作。

标签:TIM2,STM32,HAL,中断,ISR,IRQHandler,TIM,handle
From: https://blog.csdn.net/weixin_52307528/article/details/143469010

相关文章

  • Python(logging.StreamHandler())
    目录1.示例代码2.参数和方法3.注意事项logging.StreamHandler()是Python的logging模块中的一个类,用于将日志消息输出到流(如控制台或标准输出)。它是日志处理程序的一种,可以配合其他日志记录器使用。1.示例代码以下是一个完整的示例,演示如何使用logging.StreamHand......
  • Python(logging.getLogger().addHandler())
    目录1.函数定义2.示例代码3.常见用途4.重要特性5.使用removeHandler()清理处理器6.常用处理器类型logging.getLogger().addHandler()是Pythonlogging模块中的一个方法,用于将日志处理器(handler)添加到日志记录器(logger)上。addHandler()使得一个日志记录器可以输出日......
  • 关于安卓Handler之延时我不准时
    背景最近在做一个小功能,其中涉及到一个延时处理逻辑,如果是通过定时去轮询并且执行,那么就会导致一个耗电问题,所以定时轮询是不实际的,所以暂停的思路,就是通过延时实现。思考安卓延时,好家伙,一看还能有几个能实现,第一个handler,第二个AlarmManager,还有一些什么threadpoolint......
  • 无法在<fastCGI>应用程序中找到<handler>scriptProcessor
    解决方案总结更换操作系统原因:当前使用的Windows操作系统不支持PHP程序。操作步骤:备份站点数据和数据库数据。更改主机操作系统为Linux。参考文档:更改主机操作系统和备份和恢复数据。升级云虚拟主机原因:当前云虚拟主机配置不支持PHP框架。操作步骤:将云虚拟主......
  • Vue项目在安装依赖时报错:this[kHandle] = new _Hash(algorithm, xofLen)
    原因:这个错误通常是由于Node.js版本更新导致的。新版本的Node.js包含了OpenSSL3.0,它对加密算法和密钥大小有更严格的限制,可能会影响一些旧项目。解决方案:临时解决(需要每次启动时设置):在VSCode终端中:$env:NODE_OPTIONS="--openssl-legacy-provider"在WindowsCMD......
  • Vue项目在安装依赖时报错:“this[kHandle] = new _Hash(algorithm, xofLen);“
    问题:Vue项目在安装依赖时报错:"this[kHandle]=new_Hash(algorithm,xofLen);"原因:这个错误通常是由于Node.js版本更新导致的。新版本的Node.js包含了OpenSSL3.0,它对加密算法和密钥大小有更严格的限制,可能会影响一些旧项目。解决方案:1.临时解决(需要每次启动时设置):......
  • Nuxt.js 应用中的 server:devHandler 事件钩子详解
    title:Nuxt.js应用中的server:devHandler事件钩子详解date:2024/10/26updated:2024/10/26author:cmdragonexcerpt:server:devHandler是Nuxt.js中的一个生命周期钩子,它在Nitro开发服务器注册开发中间件时被调用。使用这个钩子,开发者可以为开发服务器添加......
  • Nuxt.js 应用中的 server:devHandler 事件钩子详解
    title:Nuxt.js应用中的server:devHandler事件钩子详解date:2024/10/26updated:2024/10/26author:cmdragonexcerpt:server:devHandler是Nuxt.js中的一个生命周期钩子,它在Nitro开发服务器注册开发中间件时被调用。使用这个钩子,开发者可以为开发服务器添加自定义......
  • 【C#】委托与事件与EventHandler
    委托C#中的委托(Delegate)是一种类型安全的函数指针,它允许你将方法作为参数传递给其他方法。委托可以引用一个或多个方法,并且可以在运行时调用这些方法。它们是实现事件和回调的基础。 委托的基本概念定义委托:首先需要定义一个委托类型,这指定了可被委托调用的方法签名。实例......
  • MyBatis 如何映射 Enum(使用 EnumTypeHandler、自定义 TypeHandler)
    文章目录1.MyBatis中的Enum映射概述2.使用EnumTypeHandler2.1代码示例:将Enum映射为字符串2.2代码示例:将Enum映射为整数2.3如何配置EnumTypeHandler3.自定义TypeHandler3.1为什么需要自定义TypeHandler3.2自定义TypeHandler的实现3.3如何注册自定......