4

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

4

1 回答 1

5

在 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
            {
                ...
            }
        }
    }
}
于 2017-06-11T15:04:18.970 回答