Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用

Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用

1、简述

开发板蓝色按键连接PC13管脚,且断开时为高电平,闭合时低电平。我们将pc13设置为中断模式,低电平触发,当按键按下时,触发中断处理函数,我们就可以捕获按键动作了。
Nucleo-F411RE (STM32F411)LL库体验 6 - EXTI外部中断的使用_第1张图片

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字样。
在这里插入图片描述

代码

下载路径

你可能感兴趣的:(Nucleo-F411RE,stm32,单片机,嵌入式硬件)