我在 STM32F4 上的项目中使用 libopenCM3。我以前使用过 ST 开发的标准外设库和更新的硬件抽象层。
在这些库中,您有包含向量表定义的程序集文件(启动文件)。
这就是我为 libopenCM3 所缺少的。你能告诉我在哪里可以找到这张桌子吗?还是以其他方式完成?
我真的需要在我的项目中使用中断。
谢谢。
我在 STM32F4 上的项目中使用 libopenCM3。我以前使用过 ST 开发的标准外设库和更新的硬件抽象层。
在这些库中,您有包含向量表定义的程序集文件(启动文件)。
这就是我为 libopenCM3 所缺少的。你能告诉我在哪里可以找到这张桌子吗?还是以其他方式完成?
我真的需要在我的项目中使用中断。
谢谢。
你能告诉我在哪里可以找到这张桌子吗?
中断向量表位于lib/cm3/vector.c:
__attribute__ ((section(".vectors")))
vector_table_t vector_table = {
...
.irq = {
IRQ_HANDLERS
}
};
而IRQ_HANDLERS
对于 STM32F4 则在lib/stm32/f4/vector_nvic.c
文件中定义。该文件将在构建库后可用(它是使用irq2nvic_h脚本生成的)。在此文件中,您可以看到如下内容:
#define IRQ_HANDLERS \
[NVIC_DMA1_STREAM0_IRQ] = dma1_stream0_isr, \
[NVIC_ADC_IRQ] = adc_isr, \
...
类似dma1_stream0_isr()
和adc_isr()
的函数定义如下:
#pragma weak adc_isr = blocking_handler
所以这些函数默认只是阻塞处理程序。但是它们被定义为weak,因此您可以在代码中轻松地重新定义它们。
还是以其他方式完成?
如上所述,归结为下一个:您只需要在代码中定义正确名称的中断处理函数(ISR),您的函数将自动放置到中断向量表中。
例如,如果您想处理 UART2 中断,只需usart2_isr()
在代码中的某处实现函数即可。有关 ISR 函数名称的完整列表,请参阅include/libopencm3/stm32/f4/nvic.h
。但这些名字通常很简单。
另外,请查看libopencm3-examples项目。您很可能会在那里找到您需要的东西。