Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用
1、简述
开发板蓝色按键连接PC13管脚,且断开时为高电平,闭合时低电平。我们将pc13设置为中断模式,低电平触发,当按键按下时,触发中断处理函数,我们就可以捕获按键动作了。
2、设置PC13外部中断
pa0 pb0 pc0 — pH0 用的是0这条中断线
pa1 pb1 pc1 — pH1 用的是1这条中断线
…
pa13 pb13 pc13用的是13这条中断线,
0 1 2 3 4这五条中断线有自己单独的中断函数。
5-9这五条中断线,共用 EXTI9_5_IRQHandler中断函数
10-15这五条中断线,共用EXTI15_10_IRQHandler中断函数。
按键相关定义
/**
* @brief Key push-button
*/
#define USER_BUTTON_PIN LL_GPIO_PIN_13
#define USER_BUTTON_GPIO_PORT GPIOC
#define USER_BUTTON_GPIO_CLK_ENABLE() LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC)
#define USER_BUTTON_EXTI_LINE LL_EXTI_LINE_13
#define USER_BUTTON_EXTI_IRQn EXTI15_10_IRQn
#define USER_BUTTON_EXTI_LINE_ENABLE() LL_EXTI_EnableIT_0_31(USER_BUTTON_EXTI_LINE)
#define USER_BUTTON_EXTI_FALLING_TRIG_ENABLE() LL_EXTI_EnableFallingTrig_0_31(USER_BUTTON_EXTI_LINE)
#define USER_BUTTON_SYSCFG_SET_EXTI() do { \
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); \
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC, LL_SYSCFG_EXTI_LINE13); \
} while(0)
#define USER_BUTTON_IRQHANDLER EXTI15_10_IRQHandler
#define LED_TOGGLE() LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_5)
#define LED_ON() LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_5)
#define LED_OFF() LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_5)
外部中断初始化:
static void BOARD_UserButtonConfigureEXTI()
{
/* -1- GPIO Config */
/* Enable GPIO Clock (to be able to program the configuration registers) */
USER_BUTTON_GPIO_CLK_ENABLE();
/* Configure IO */
LL_GPIO_SetPinMode(USER_BUTTON_GPIO_PORT, USER_BUTTON_PIN, LL_GPIO_MODE_INPUT);
LL_GPIO_SetPinPull(USER_BUTTON_GPIO_PORT, USER_BUTTON_PIN, LL_GPIO_PULL_NO);
/* -2- Connect External Line to the GPIO*/
USER_BUTTON_SYSCFG_SET_EXTI();
/*-3- Enable a falling trigger EXTI line 13 Interrupt */
USER_BUTTON_EXTI_LINE_ENABLE();
USER_BUTTON_EXTI_FALLING_TRIG_ENABLE();
/*-4- Configure NVIC for EXTI15_10_IRQn */
NVIC_EnableIRQ(USER_BUTTON_EXTI_IRQn);
NVIC_SetPriority(USER_BUTTON_EXTI_IRQn,0);
}
中断回调函数:
/**
* @brief This function handles external line 13 interrupt request.
* @param None
* @retval None
*/
void USER_BUTTON_IRQHANDLER(void)
{
/* Manage Flags */
if(LL_EXTI_IsActiveFlag_0_31(USER_BUTTON_EXTI_LINE) != RESET)
{
LL_EXTI_ClearFlag_0_31(USER_BUTTON_EXTI_LINE);
}
if (LL_GPIO_IsInputPinSet(USER_BUTTON_GPIO_PORT,USER_BUTTON_PIN) == 0)
{
printf("key press\r\n");
}
}
3、现象
编译后烧录进板卡,当我们按下蓝色按键时,会打印key press字样。
代码
下载路径