当前位置:   article > 正文

STM32—按键中断_stm32按键中断

stm32按键中断

目录

中断简介

程序

 注:


中断简介

(1)        EXTI(外部中断):EXTI是ST公司在其STM32产品上扩展的外中断控制。它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断,以及软件中断。其输出最终被映射到NVIC的相应通道。因此,配置EXTI中断的过程必然包含对NVIC的配置。

(2)        NVIC(嵌套向量中断):嵌套向量中断控制器,属于内核外设, 管理着包括内核和片上所有外设的中断相关的 功能。嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地 处理晚到的中断。

         至于两者的作用,我们就举个例子来说一下。

        例如下面配置EXTI0的过程,就要首先配置EXTI控制器(使能相应的中断线,选择中断/事件模式,触发边沿极性),然后再配置NVIC控制器(EXTI0映射在NVIC上的通道号,中断优先级,中断屏蔽状态)。也就是EXTI类比成小门,而NVIC是大门,二者是相互联通的,我们使用EXTI来选择中断的中断源,NVIC判决中断源的执行顺序

 程序的编写就是按照这个流程来的,这里是有两条线路,一条事件中断,另一条为NVIC中断控制器,编写程序已NVIC中断为例!

程序

        为了大家更好的理解,我们就写一个按键中断来检验一下。

LED.c

  1. #include "bsp_led.h"
  2. /**
  3. * @brief 初始化控制LED的IO
  4. * @param 无
  5. * @retval 无
  6. */
  7. void LED_GPIO_Config(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStruct;
  10. RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
  11. GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP ;
  12. GPIO_InitStruct.GPIO_Pin=LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN;
  13. GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;
  14. GPIO_SetBits(LED_PORT,LED_RED_PIN|LED_GREEN_PIN|LED_YELLOW_PIN);
  15. GPIO_Init(LED_PORT,&GPIO_InitStruct);
  16. }

LED.h

  1. #ifndef __LED_H
  2. #define __LED_H
  3. #include "stm32f10x.h"
  4. //LED
  5. #define LED_GPIO_CLK RCC_APB2Periph_GPIOB
  6. #define LED_GREEN_PIN GPIO_Pin_0
  7. #define LED_PORT GPIOB
  8. #define LED_RED_PIN GPIO_Pin_5
  9. #define LED_YELLOW_PIN GPIO_Pin_1
  10. #define ON 1
  11. #define OFF 0
  12. #define LED_GREEN(a) if(a)\
  13. {GPIO_ResetBits(LED_PORT,LED_GREEN_PIN);}\
  14. else\
  15. {GPIO_SetBits(LED_PORT,LED_GREEN_PIN);}
  16. #define LED_RED(a) if(a)\
  17. {GPIO_ResetBits(LED_PORT,LED_RED_PIN);}\
  18. else\
  19. {GPIO_SetBits(LED_PORT,LED_RED_PIN);}
  20. #define LED_YELLOW(a) if(a)\
  21. {GPIO_ResetBits(LED_PORT,LED_YELLOW_PIN);}\
  22. else\
  23. {GPIO_SetBits(LED_PORT,LED_YELLOW_PIN);}
  24. //打开灯
  25. #define LED_G {LED_GREEN(ON);LED_RED(OFF);LED_YELLOW(OFF);}
  26. #define LED_R {LED_GREEN(OFF);LED_RED(ON);LED_YELLOW(OFF);}
  27. #define LED_B {LED_GREEN(OFF);LED_RED(OFF);LED_YELLOW(ON);}
  28. #define LED_G_TOGGLE {LED_PORT->ODR^=GPIO_Pin_0;}
  29. //BEEPER
  30. #define BEEP_GPIO_CLK RCC_APB2Periph_GPIOA
  31. #define BEEP_PIN GPIO_Pin_8
  32. #define BEEP_PORT GPIOA
  33. void LED_GPIO_Config(void);
  34. void BEEP_Config(void);
  35. #endif /* __LED_H */

KEY.h

  1. #ifndef ___bsp_key____H
  2. #define ___bsp_key____H
  3. #include "stm32f10x.h"
  4. //KEY1
  5. #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO
  6. #define KEY1_GPIO_PIN GPIO_Pin_0
  7. #define KEY1_PORT GPIOA
  8. #define KEY1_IRQn EXTI0_IRQn
  9. #define KEY1_PortSource GPIO_PortSourceGPIOA
  10. #define KEY1_PinSource GPIO_PinSource0
  11. #define KEY1_IRQHandler EXTI0_IRQHandler
  12. #define KEY1_Line EXTI_Line0
  13. //KEY2
  14. #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO
  15. #define KEY2_GPIO_PIN GPIO_Pin_13
  16. #define KEY2_PORT GPIOC
  17. #define KEY2_IRQn EXTI15_10_IRQn
  18. #define KEY2_PortSource GPIO_PortSourceGPIOC
  19. #define KEY2_PinSource GPIO_PinSource13
  20. #define KEY2_IRQHandler EXTI15_10_IRQHandler
  21. #define KEY2_Line EXTI_Line13
  22. void KEY_Config(void);
  23. #endif

KEY.c

  1. #include "bsp_key.h"
  2. static void NVIC_Config()
  3. {
  4. NVIC_InitTypeDef NVIC_Initstruct;
  5. //嵌套向量KEY1中断控制器
  6. //配置优先级组为1,级别越低,等级越高
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  8. //选择中断源——KEY1按键
  9. NVIC_Initstruct.NVIC_IRQChannel=KEY1_IRQn;
  10. //抢占优先级配置为1
  11. NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=1;
  12. //子优先级为1
  13. NVIC_Initstruct.NVIC_IRQChannelSubPriority=1;
  14. //使能中断通道
  15. NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;
  16. NVIC_Init(&NVIC_Initstruct);
  17. //KEY2按键和上面的都一样
  18. NVIC_Initstruct.NVIC_IRQChannel=KEY2_IRQn;
  19. NVIC_Init(&NVIC_Initstruct);
  20. }
  21. void KEY_Config(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStruct;
  24. EXTI_InitTypeDef EXTI_Initatruct;
  25. //KEY1/2时钟使能
  26. RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
  27. RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
  28. // 初始化中断控制器
  29. NVIC_Config();
  30. //按键属于输入,所以这里上拉输入
  31. GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
  32. GPIO_InitStruct.GPIO_Pin=KEY1_GPIO_PIN;
  33. //EXTI信号源的选择
  34. GPIO_EXTILineConfig(KEY1_PortSource,KEY1_PinSource);
  35. EXTI_Initatruct.EXTI_Line=EXTI_Line0;
  36. //配置为中断模式
  37. EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
  38. //上升沿检测,这里也可以是下降沿后上升下降沿
  39. EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Rising;
  40. //使能中断
  41. EXTI_Initatruct.EXTI_LineCmd=ENABLE;
  42. EXTI_Init(&EXTI_Initatruct);
  43. GPIO_Init(KEY1_PORT,&GPIO_InitStruct);
  44. //KEY2初始化
  45. RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
  46. GPIO_InitStruct.GPIO_Pin=KEY2_GPIO_PIN;
  47. GPIO_Init(KEY2_PORT,&GPIO_InitStruct);
  48. GPIO_EXTILineConfig(KEY2_PortSource,KEY2_PinSource);
  49. EXTI_Initatruct.EXTI_Line=EXTI_Line13;
  50. EXTI_Initatruct.EXTI_Mode=EXTI_Mode_Interrupt;
  51. EXTI_Initatruct.EXTI_Trigger=EXTI_Trigger_Falling;
  52. EXTI_Initatruct.EXTI_LineCmd=ENABLE;
  53. EXTI_Init(&EXTI_Initatruct);
  54. }

stm32f10x_it.c

  1. void KEY1_IRQHandler(void)
  2. {
  3. if(EXTI_GetITStatus(KEY1_Line)!=RESET)
  4. {
  5. LED_B;//这里是根据自己的要求实现不同的函数,这里以LED灯的亮灭为例
  6. }
  7. EXTI_ClearITPendingBit(KEY1_Line);
  8. }
  9. void KEY2_IRQHandler(void)
  10. {
  11. if(EXTI_GetITStatus(KEY2_Line)!=RESET)
  12. {
  13. LED_G_TOGGLE;
  14. }
  15. EXTI_ClearITPendingBit(KEY2_Line);
  16. }

 把这些放入程序里面就可以了,当然相应的头文件自己注意下,这里没有其他的头文件。

 注:

        中断函数里面的执行的函数依据自己的要求,这里以LED灯为例。

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

闽ICP备14008679号