版权声明:虽为原创,欢迎转载。 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、在中断函数中,处理完中断函数记得要及时清除中断标志。