使用EXTI Line进行软件中断

时间:2017-06-11 10:49:31

标签: embedded interrupt stm32f4

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

1 个答案:

答案 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
            {
                ...
            }
        }
    }
}