STM32外部中断实验
1.通过按键实现高低电平切换,实现KEY0、KEY1、KEY2、KEY_UP控制LED0、LED1的不同亮暗情况
2.原理图如下:
STM32F4主控芯片原理图如图所示:
Key按键对应的原理图如下图所示:
3.功能对应引脚
KEY0----PE4(输入上拉,下降沿触发)
KEY1---PE3(输入上拉,下降沿触发)
KEY2---PE2(输入上拉,下降沿触发)
WK_UP---PA0(输入下拉,上升沿触发)
LED0--PF9
LED1--PF10
4.部分代码,exti.c如下
#include "./BSP/EXTI/exti.h" #include "./SYSTEM/sys/sys.h" #include "stm32f4xx_hal_gpio.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/KEY/key.h" #include "./BSP/BEEP/beep.h" #include "./BSP/LED/led.h" void KEY0_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY0所在中断线 的中断标志位 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } /** * @brief KEY1 外部中断服务程序 * @param 无 * @retval 无 */ void KEY1_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY1_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY1所在中断线 的中断标志位,中断下半部在HAL_GPIO_EXTI_Callback执行 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY1_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } /** * @brief KEY2 外部中断服务程序 * @param 无 * @retval 无 */ void KEY2_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(KEY2_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY2所在中断线 的中断标志位,中断下半部在HAL_GPIO_EXTI_Callback执行 */ __HAL_GPIO_EXTI_CLEAR_IT(KEY2_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } /** * @brief WK_UP 外部中断服务程序 * @param 无 * @retval 无 */ void WKUP_INT_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(WKUP_INT_GPIO_PIN); /* 调用中断处理公用函数 清除KEY_UP所在中断线 的中断标志位,中断下半部在HAL_GPIO_EXTI_Callback执行 */ __HAL_GPIO_EXTI_CLEAR_IT(WKUP_INT_GPIO_PIN); /* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */ } /** * @brief 中断服务程序中需要做的事情 * 在HAL库中所有的外部中断服务函数都会调用此函数 * @param GPIO_Pin:中断引脚号 * @retval 无 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { delay_ms(20); /* 消抖 */ switch(GPIO_Pin) { case KEY0_INT_GPIO_PIN: if (KEY0 == 0) { LED0_TOGGLE(); /* LED0 状态取反 */ } break; case KEY1_INT_GPIO_PIN: if (KEY1 == 0) { LED1_TOGGLE(); /* LED1 状态取反 */ } break; case KEY2_INT_GPIO_PIN: if (KEY2 == 0) { LED1_TOGGLE(); /* LED1 状态取反 */ LED0_TOGGLE(); /* LED0 状态取反 */ } break; case WKUP_INT_GPIO_PIN: if (WK_UP == 1) { BEEP_TOGGLE(); /* 蜂鸣器状态取反 */ } break; default : break; } } /** * @brief 外部中断初始化程序 * @param 无 * @retval 无 */ void exti_init(void) { GPIO_InitTypeDef gpio_init_struct; key_init(); gpio_init_struct.Pin = KEY0_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY0_INT_GPIO_PORT, &gpio_init_struct); /* KEY0配置为下降沿触发中断 */ gpio_init_struct.Pin = KEY1_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY1_INT_GPIO_PORT, &gpio_init_struct); /* KEY1配置为下降沿触发中断 */ gpio_init_struct.Pin = KEY2_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 下降沿触发 */ gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY2_INT_GPIO_PORT, &gpio_init_struct); /* KEY2配置为下降沿触发中断 */ gpio_init_struct.Pin = WKUP_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_RISING; /* 上升沿触发 */ gpio_init_struct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(WKUP_GPIO_PORT, &gpio_init_struct); /* WKUP配置为上升沿触发中断 */ HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2); /* 抢占0,子优先级2 */ HAL_NVIC_EnableIRQ(KEY0_INT_IRQn); /* 使能中断线4 */ HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2); /* 抢占1,子优先级2 */ HAL_NVIC_EnableIRQ(KEY1_INT_IRQn); /* 使能中断线3 */ HAL_NVIC_SetPriority(KEY2_INT_IRQn, 2, 2); /* 抢占2,子优先级2 */ HAL_NVIC_EnableIRQ(KEY2_INT_IRQn); /* 使能中断线2 */ HAL_NVIC_SetPriority(WKUP_INT_IRQn, 3, 2); /* 抢占3,子优先级2 */ HAL_NVIC_EnableIRQ(WKUP_INT_IRQn); /* 使能中断线0 */ }#嵌入式学习路线#
嵌入式入门 文章被收录于专栏
嵌入式入门合集