CC3200——外部中断

版权声明:虽为原创,欢迎转载。 https://blog.csdn.net/m0_37655357/article/details/86488815

基本都和STM32的中断一样,主要注意以下几点

1、多个外设时钟的使能不能使用或关系,只能一个一个的调用函数进行使能,不然会导致程序卡死。

    MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK); //外设时钟不支持或
    MAP_PRCMPeripheralClkEnable(PRCM_GPIOA2, PRCM_RUN_MODE_CLK);

2、外部中断的引脚设置成输入模式。

3、使能中断的步骤

//Enable GPIO Interrupt
MAP_GPIOIntClear(GPIOA2_BASE,GPIO_PIN_6);//先清除中断标志
MAP_IntPendClear(INT_GPIOA2);  //清除之前已经触发但是没有处理的中断
MAP_IntEnable(INT_GPIOA2);    //使能中断源所在的分组
MAP_GPIOIntEnable(GPIOA2_BASE,GPIO_PIN_6);    //使能中断引脚

在4中的函数中,还包括使能中断的剩余步骤

MAP_GPIOIntTypeSet(GPIOA1_BASE,GPIO_PIN_5,GPIO_RISING_EDGE);//中断触发方式

MAP_IntPriorityGroupingSet(0);//中断分组,这一步可以另外单独写在主函数中。

MAP_IntPrioritySet(INT_GPIOA1, INT_PRIORITY_LVL_1);//中断优先级

MAP_GPIOIntRegister(GPIOA1_BASE, GPIOs3IntHandler);//注册中断处理函数

//最后,可以再清除一次中断标志,并使能中断。
MAP_GPIOIntClear(GPIOA2_BASE,GPIO_PIN_6);//先清除中断标志
MAP_GPIOIntEnable(GPIOA2_BASE,GPIO_PIN_6);    //使能中断引脚

4、在SDK的button_if.c文件中,提供了很好的按键外部中断的库函数,以后可以模仿这个文件写。他的外部中断处理函数设置了一个函数指针,我们只需要自己编写需要在中断中处理的函数,然后在使能中断时,将函数名作为参数传入即可。

//*****************************************************************************
//
//!  \brief Initialize Push Button GPIO
//!
//! \param[in] S2InterruptHdl          GPIO Interrupt Handler for  SW2 LP button
//! \param[in] S3InterruptHdl          GPIO Interrupt Handler for  SW3 LP button
//!
//! \return none
//!
//! \brief  Initializes Push Button Ports and Pins
//
//*****************************************************************************
void Button_IF_Init(P_INT_HANDLER S2InterruptHdl,P_INT_HANDLER  S3InterruptHdl )
{
    if(S3InterruptHdl != NULL)
    {
        //
        // Set Interrupt Type for GPIO
        //
         MAP_GPIOIntTypeSet(GPIOA1_BASE,GPIO_PIN_5,GPIO_RISING_EDGE);
        
        g_S3InterruptHdl = S3InterruptHdl;
        
        //
        // Register Interrupt handler
        //
#if defined(USE_TIRTOS) || defined(USE_FREERTOS) ||  defined(SL_PLATFORM_MULTI_THREADED)
    // USE_TIRTOS: if app uses TI-RTOS (either  networking/non-networking)
    // USE_FREERTOS: if app uses Free-RTOS (either  networking/non-networking)
    // SL_PLATFORM_MULTI_THREADED: if app uses any OS +  networking(simplelink)
         osi_InterruptRegister(INT_GPIOA1,(P_OSI_INTR_ENTRY)GPIOs3IntHandler, \
                                INT_PRIORITY_LVL_1);
#else                   
        MAP_IntPrioritySet(INT_GPIOA1, INT_PRIORITY_LVL_1);
        MAP_GPIOIntRegister(GPIOA1_BASE, GPIOs3IntHandler);
#endif    
        //
        // Enable Interrupt
        //
        MAP_GPIOIntClear(GPIOA1_BASE,GPIO_PIN_5);
        MAP_GPIOIntEnable(GPIOA1_BASE,GPIO_INT_PIN_5);
    }
    
    if(S2InterruptHdl != NULL)
    {
        //
        // Set Interrupt Type for GPIO
        //
         MAP_GPIOIntTypeSet(GPIOA2_BASE,GPIO_PIN_6,GPIO_RISING_EDGE);
        g_S2InterruptHdl = S2InterruptHdl;
        
        //
        // Register Interrupt handler
        //
#if defined(USE_TIRTOS) || defined(USE_FREERTOS) ||  defined(SL_PLATFORM_MULTI_THREADED)
    // USE_TIRTOS: if app uses TI-RTOS (either  networking/non-networking)
    // USE_FREERTOS: if app uses Free-RTOS (either  networking/non-networking)
    // SL_PLATFORM_MULTI_THREADED: if app uses any OS +  networking(simplelink)
         osi_InterruptRegister(INT_GPIOA2,(P_OSI_INTR_ENTRY)GPIOs2IntHandler, \
                                INT_PRIORITY_LVL_1);
#else                
           MAP_IntPrioritySet(INT_GPIOA2, INT_PRIORITY_LVL_2);
        MAP_GPIOIntRegister(GPIOA2_BASE, GPIOs2IntHandler);
#endif    
                            
        //
        // Enable Interrupt
        //
        MAP_GPIOIntClear(GPIOA2_BASE,GPIO_PIN_6);
        MAP_GPIOIntEnable(GPIOA2_BASE,GPIO_INT_PIN_6);
    }
}

5、在中断函数中,处理完中断函数记得要及时清除中断标志。

猜你喜欢

转载自blog.csdn.net/m0_37655357/article/details/86488815
今日推荐