使用 EXTI 线进行软件中断

using EXTI Line for software interrupt

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

STM32F4有两种产生软件中断的方法。

  • 通用 Cortex-M4 方法或写入软件触发中断寄存器 (STIR),或

  • STM32 EXTI具体写入EXTI软件中断事件寄存器的方法(EXTI_SWIER).

我不认为在第一种方法中可以区分中断,因为 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
            {
                ...
            }
        }
    }
}