Skip to main content
cmcquaid
Associate
March 29, 2012
Question

EXTIn: n > 4

  • March 29, 2012
  • 2 replies
  • 597 views
Posted on March 29, 2012 at 07:30

I have one external interrupt working fine, but I need to add a few more and I'm failing to understand how it all maps out.

The one I have implemented is on PA3 and the ISR is void EXTI3_IRQHandler(void). 

Although the UM says that almost all pins on all ports can be used as EXTIs, there are only 5 EXTI IRQs. There does not seem to be an explicit way to map a pin to an ISR,

 so is it the case that only pins 0..4 on a port can be used for EXTI?

If not, I would be grateful if someone could illustrate how to do so.

(Using STM32F4Discovery/Keil with peripheral library 1.1.0)

    This topic has been closed for replies.

    2 replies

    Tesla DeLorean
    Guru
    March 29, 2012
    Posted on March 29, 2012 at 15:11

    Although the UM says that almost all pins on all ports can be used as EXTIs, there are only 5 EXTI IRQs. There does not seem to be an explicit way to map a pin to an ISR,  so is it the case that only pins 0..4 on a port can be used for EXTI?

    No, it means that some of your EXTI interrupt handlers (5-9) and (10-15) will need to differentiate the source as the first step of processing/dispatching the request.

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    cmcquaid
    cmcquaidAuthor
    Associate
    March 30, 2012
    Posted on March 30, 2012 at 19:57

    Thanks for pointing me in the right direction, Clive.

    I had seen the first five handlers:

    EXTI0_IRQHandler ; EXTI
    Line0 
    EXTI1_IRQHandler ; EXTI Line1 
    EXTI2_IRQHandler ; EXTI Line2 
    EXTI3_IRQHandler ; EXTI Line3 
    EXTI4_IRQHandler ; EXTI Line4 

    ... but I missed the other two:

    EXTI9_5_IRQHandler ; External Line[9:5]s 
    EXTI15_10_IRQHandler ; External Line[15:10]s

    For the benefit of anyone else in the same situation, I've stripped the relevant code out of my app. I believe it is complete, but I have not tested the isolated fragment. Curiously, my EXTI3 interrupt worked fine without enabling the SYSCFG clock.

    void config(void){
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    /* SYSCFG clock enable */ 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    /* external int config register is in SYSCFG */
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource12);
    /* GPIOB clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    /* configure GPIO pin as input */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    /* configure PB12 as interrupt on falling edge */
    EXTI_InitStructure.EXTI_Line = EXTI_Line12; 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure); 
    /* Configure and enable EXTI interrupt on PB12 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    } 
    void EXTI15_10_IRQHandler(void){
    // did we get here due to falling edge on PB12
    if(EXTI_GetITStatus(EXTI_Line12)){
    EXTI_ClearITPendingBit(EXTI_Line12);
    }else if( /* test for another interrupt */){
    }
    }