当前位置:   article > 正文

STM32按键外部中断控制LED流水灯-HAL库_stm32 hal库 外部中断 led

stm32 hal库 外部中断 led

续上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4

一、硬件选用上,我们增加一个四角按键

二、原理图设计,上也增加一个开关

LED0-LED2 --------> PA0-PA2引脚

KEY1 ---------> PA3引脚

 

 三、CubeMX的设置

 在上一篇《基于HAL库的32流水灯》http://t.csdn.cn/30QT4  的基础上,在GPIO设置里增加一个按键的设置

1、我们选择上升沿触发外部中断、没有上下拉

2、在NVIC中开启EXTI3外部中断,并设置中断的响应优先级。并生成工程文件

四、代码调试

生成Keil5工程文件后,先编译一下

打开stm32f1xx_it.h,找到void EXTI3_IRQHandler(void);这就是外部中断Line3的中断处理函数

我们右键Go To Denifition Of void EXTI3_IRQHandler,可以在stm32f1xx_it.c中看到如下代码

然后再右键HAL_GPIO_EXTI_IRQHandler;和前面一样GO To一下,就会到stm32f1xx_hal_gpio.c

然后我们需要调用的就是这个一行代码,在这个函数声明前有一个__weak声明

这个声明表示这个函数一旦被重新声明,那这里的函数就自动失效,其他函数调用的时候就会找到你新定义的同名函数

然后我们就在main.c中来调用这行代码

  1. /* USER CODE BEGIN 4 */
  2. // 中断触发后,进入此函数,此函数称为回调函数
  3. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 回调函数
  4. {
  5. if(GPIO_Pin == KEY1_Pin)//确定是否是KEY1键按下
  6. {
  7. for(long i =1; i<72000;i++)//消抖
  8. {}
  9. n=!n;//逻辑非 0或者1
  10. }
  11. }
  12. /* USER CODE END 4 */

main.c

我们需要在开头给它定义一个全局变量

  1. /* USER CODE BEGIN PM */
  2. uint8_t n; //定义全局变量
  3. /* USER CODE END PM */

在while循环中写入这串代码,最终我们就可以实现按键中断控制流水灯了~

  1. while (1)
  2. {
  3. /* USER CODE END WHILE */
  4. /* USER CODE BEGIN 3 */
  5. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 灯1亮
  6. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 灯2灭
  7. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 灯3灭
  8. // HAL_Delay(250); // 延时
  9. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
  10. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // 灯2灭
  11. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 灯3灭
  12. // HAL_Delay(250); // 延时
  13. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 灯1亮
  14. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 灯2灭
  15. // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 灯3灭
  16. // HAL_Delay(250); // 延时
  17. switch(n)
  18. {
  19. case 0:
  20. {
  21. //从左到右亮
  22. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,1);//写高电平,点亮第1个LED
  23. HAL_Delay(1000);//延时1000毫秒
  24. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,0);
  25. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,1);
  26. HAL_Delay(1000);//延时1000毫秒
  27. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,0);
  28. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,1);
  29. HAL_Delay(1000);//延时1000毫秒
  30. HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,0);
  31. break;
  32. }
  33. case 1:
  34. {
  35. //从右到左亮
  36. HAL_GPIO_WritePin(GPIOA,LED2_Pin,1);//写高电平,点亮第1个LED
  37. HAL_Delay(1000);//延时1000毫秒
  38. HAL_GPIO_WritePin(GPIOA,LED2_Pin,0);
  39. HAL_GPIO_WritePin(GPIOA,LED1_Pin,1);
  40. HAL_Delay(1000);//延时1000毫秒
  41. HAL_GPIO_WritePin(GPIOA,LED1_Pin,0);
  42. HAL_GPIO_WritePin(GPIOA,LED0_Pin,1);
  43. HAL_Delay(1000);//延时1000毫秒
  44. HAL_GPIO_WritePin(GPIOA,LED0_Pin,0);
  45. break;
  46. }
  47. default:
  48. {
  49. break;
  50. }
  51. }
  52. }
  53. /* USER CODE END 3 */

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/655661
推荐阅读
相关标签
  

闽ICP备14008679号