我使用STM32F4,我想生成一个软件中断。 问题是如何在中断处理程序中知道中断是由软件还是由连接到EXTI线路的引脚产生的?
答案 0 :(得分:1)
有两种方法可以在STM32F4上生成软件中断。
通用Cortex-M4方法或写入软件触发中断寄存器(STIR),或
写入 EXTI软件中断事件寄存器(EXTI_SWIER)的STM32 EXTI特定方法。
我认为在第一种方法中,中断是不可区分的,因为STIR是只写寄存器。但是,EXTI_SWIER是r / w,写入触发中断的位不会被清零,直到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
{
...
}
}
}
}