我正在使用STM32F4,希望生成一个软件中断。 问题是在中断处理程序中如何知道中断是由软件还是与EXTI线连接的引脚引起的?
我正在使用STM32F4,希望生成一个软件中断。 问题是在中断处理程序中如何知道中断是由软件还是与EXTI线连接的引脚引起的?
在STM32F4上,有两种生成软件中断的方法。
一种是通用的Cortex-M4方法,通过写入软件触发中断寄存器(STIR)
另一种是特定于STM32 EXTI的方法,通过写入外部中断软件触发事件寄存器(EXTI_SWIER)
我认为在第一种方法中,中断不可区分,因为STIR是一个只写寄存器。但是EXTI_SWIER是可读可写的,写入触发中断的位直到显式写入EXTI_PR中相应的位之前不会被清除。因此,仅通过读取EXTI_SWIER就可以确定中断是否为软件触发。
void EXTI0_IRQHandler(void)
{
// Detect SWI
bool is_swi = (EXTI->SWIER & 0x00000001u) != 0 ;
// Clear interrupt flag
EXTI_ClearITPendingBit(EXTI_Line0);
if ( is_swi )
{
...
}
else
{
...
}
}
对于共享单个中断的EXTI线路,您首先需要通过检查PR寄存器来确定活动线路:
void EXTI15_10_IRQn( void )
{
for( uint32_t exti = 10; exti < 15; exti++ )
{
bool is_swi = false ;
if( EXTI_GetFlagStatus( exti ) == SET )
{
is_swi = (EXTI->SWIER & (0x1u << exti)) != 0 ;
// Clear interrupt flag
EXTI_ClearITPendingBit( exti ) ;
if ( is_swi )
{
...
}
else
{
...
}
}
}
}
1
位不会一直保持为1
,直到通过写入EXTI_PR将其清零。 - John Burger