文章目录
- 前言
- 示例工程
- 个人理解
前言
最近在学习STM32,采用HAL库开发方式。记录一下同名外设中断及回调。
这里提及的同名外设指USART1/2之类的相同外设,但不是同一个instance。
示例工程
以使用cubemx配置两个同名外设EXTI0/EXT4为例。
在NVIC配置界面,勾选EXTI line0/4.
在Code Generation栏,勾选以下三项:
- Generate Enable in Init
- Generate IRQ handler
- call HAL handler
随后生成工程。
Cubemx生成的GPIO初始化函数中,有EXTI0/4的NVIC配置代码
在stm32f1xx_it.c文件中有EXTI0/4的IRQ handler。
并且这两个外设的中断处理函数中均调用了函数HAL_Handler。
其源码如下。
个人理解
当CPU接受到中断请求IRQ后,会进入中断服务函数IRQ Handler。
因此在IRQ Handler函数中可以写上对应的功能。
而勾选Call HAL Handler之后在相应的IRQ Handler中生成了HAL_GPIO_EXTI_IRQHandler();
相当于回调函数是两个同名中断公有的服务函数,而IRQ Handler就是针对每个独立的IRQ的服务函数。
因此回到最初的问题。如果我想要EXTI0翻转PB5电平,EXTI4翻转PE5电平。函数如下:
而如果我想要两个EXTI0/4都有同一个功能,通过uart发送字符串。可以在各自的IRQ Handler中都加上该功能。或者改写他们公共的回调函数。这里以改写回调函数做示例。