Embedded 使用EXTI行进行软件中断

Embedded 使用EXTI行进行软件中断,embedded,interrupt,stm32f4,Embedded,Interrupt,Stm32f4,我正在使用STM32F4,我想生成一个软件中断。 问题是我如何在中断处理程序中知道中断是由软件还是由连接到EXTI线的引脚生成的?在STM32F4上有两种生成软件中断的方法 通用Cortex-M4方法或写入软件触发中断寄存器(STIR),或 写入EXTI软件中断事件寄存器(EXTI_SWIER)的STM32 EXTI特定方法 我认为在第一种方法中,中断是不可区分的,因为STIR是一个只写寄存器。然而,EXTI_SWIER是r/w,在显式写入EXTI_PR中的相应位之前,为触发中断而写入的位不

我正在使用STM32F4,我想生成一个软件中断。
问题是我如何在中断处理程序中知道中断是由软件还是由连接到EXTI线的引脚生成的?

在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
            {
                ...
            }
        }
    }
}
void EXTI15\u 10\u IRQn(void)
{
对于(uint32_t exti=10;exti<15;exti++)
{
bool是_swi=false;
if(EXTI_GetFlagStatus(EXTI)==SET)
{

is_swi=(EXTI->SWIER&(0x1u不清楚您在问什么。您是否触发了此处所述的EXTI中断:?这里有一个很好的问题,但对于任何不熟悉STM32的人来说,有必要进行一点研究,以了解您在问什么。您不应该期望任何人去做这项工作,也许应该包括代码来说明您所做的工作We don’我们正在做。从目前的情况来看,这个问题吸引了很多人的投票,但可能是一个有用而有趣的问题,需要一些澄清。这里的问题似乎很明显。我投票决定保持开放。非常感谢你的详细回答。很抱歉,这个问题不是很清楚。@Samer.M:不客气,你仍然应该编辑这个问题遗憾的是,您的语句“EXTI_SWIER是r/w,在EXTI_PR中相应的位被显式写入之前,用于触发中断的位不会被清除“不正确。任何对EXTI_SWIER的写入都将设置或清除写入的每一位:
1
位不会保持为
1
,直到通过写入EXTI将其归零_PR@JohnBurger:如文件所示“如果在EXTI_IMR寄存器的x行上启用了中断,则当设置为“0”时,将“1”写入SWIERx位将设置EXTI_PR寄存器中相应的挂起位,从而产生中断请求。通过清除EXTI_PR中的相应位(通过将1写入位)来清除该位。”。“我建议不要相信任何“未记录”的行为,或以记录之外的任何方式使用它。我不确定你的观点在实践中是否有任何相关性。当SWIER设置为1时,中断发生-无论它如何重置。我说“悲伤”以上是因为我被这种未记录的行为所咬。如果你有/two/swi,并且你设置了一个,那么(仅仅)设置另一个就会取消第一个!当然,设置第一个通常会立即中断-但是如果设置代码是在禁用中断期间,或者在更高优先级的中断内,那么它/确实/重要