STM32_lib:是否有函数可以将IRQ_handler例程传递给?

问题描述 投票:0回答:2

我正在尝试添加一个 IRQ_handler 例程,以便在出现中断时使用,例如 CAN 或 USART。我希望避免直接写入内存地址,并想知道 CMSIS 或 STM32_lib 中是否有一个函数可以完成这项工作(我错过了或由于某种原因找不到)。初始化并启用 NVIC、创建 IRQ 例程后,我该从哪里开始?

总结一下: 我可以将指向该函数的指针作为参数传递到某个地方,还是必须将函数指针指向 NVIC_vtor 地址偏移量?

void USART1_IRQhandler(void)
{
/* handle IRQ routine*/
}

我尝试在所有包含文件中搜索 IRQ 关键字,但实际上找不到除了 IRQn 之外的任何内容,这只能帮助我启用中断,而不能处理它们。

注意:我不使用CubeIDE,只使用STM32F4xx_StdPeriph_Driver + CMSIS文件

c stm32 interrupt can-bus usart
2个回答
0
投票

至少如果STM32CubeIDE用于生成项目基线,那么定义像

USART1_IRQhandler()
这样的函数将自动启用它作为给定中断的中断处理程序(如果函数名称正确)。不过,命名时必须非常讲究。

启动汇编代码(Startup 文件夹中扩展名为

.s
的文件)包含虚拟中断处理程序的 weak 定义,如果项目中定义了具有完全相同名称的函数,则该定义将被覆盖。


0
投票

ARM 在谈到“IRQ”时使用了一些令人困惑的术语。 IRQ 简单来说就是中断请求。它通常用在正常的“可屏蔽”中断的上下文中。在中断时执行并由硬件调用的函数称为 中断服务例程 (ISR)。

所有中断服务程序都需要注册在中断向量表中。在 Cortex M 上,该表(与默认堆栈指针等一起)位于地址 0 及以上。收到硬件中断触发后,MCU 将调用向量表中注册的例程 - 因此,如果您没有注册,则不会发生任何情况。

CMSIS 为向量表中的所有默认中断服务例程提供“弱链接”名称。 “弱链接”意味着默认的 ISR 只会被链接,除非程序员没有编写具有完全相同名称的例程 - 在这种情况下,将被链接。

因此,在编写 ISR 并将其放入驱动程序中时,应该使用推荐的名称。根据编译器的不同,您可能必须使用非标准关键字将某些内容标记为 ISR。由于 ISR 由 MCU 而不是由程序调用,因此它们通常具有独特的“调用约定”,并且 MCU 内核负责在调用 ISR 时堆叠某些内容。此外,C 编译器可能会堆叠额外的寄存器。 出于同样的原因,您可以/不应该从您的应用程序中调用 ISR。 ISR 不带任何参数,也不返回任何值。与其进行的所有通信都是通过文件范围变量进行的。

因此,您只需要在驱动程序中定义一个函数

void USART1_IRQhandler (void)

,并根据最佳实践来实现它 - 这是另一个故事了。


    


© www.soinside.com 2019 - 2024. All rights reserved.