当前位置:   article > 正文

STM32-外部中断EXTI(标准库+代码)_stm32 interrupt exti line 16

stm32 interrupt exti line 16

一、外部中断简介

        中断即打断,当单片机在顺序执行当前程序时,由于系统出现了某种需要紧急处理的情况,单片机暂停正在执行的程序,转而去执行紧急事务,当处理结束后单片机自动返回到原先暂停的程序中继续执行,这种执行过程由于外界的原因被打断的情况叫做中断。

EXTI支持配置20个中断和事件屏蔽位;
GPIO端口连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;
EXTI_Line16 连接到PVD输出 ;
EXTI_Line17连接到RTC闹钟事件;
EXTI_Line18连接到USB唤醒事件;
EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

二、中断服务函数

三、配置流程

一般使用GPIO的外部中断功能,都需要有以下几个步骤:

  1. 开启时钟
  2. 配置GPIO模式
  3. 使能NVIC中断并且配置优先级
  4. 配置GPIO中断
  5. 使能中断和清楚中断标志位
  6. 编写中断服务函数

STM32单片机的任意引脚都可以配置为外部中断触发,我们对应的去使能引脚的外部中断功能即可。

四、代码实现 

KEY.c

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "KEY.h"
  4. uint8_t Key_Value;
  5. static void NVIC_Configuration(void)
  6. {
  7. NVIC_InitTypeDef NVIC_InitStructure;
  8. /* 配置NVIC为优先级组1 */
  9. /* 提示 NVIC_PriorityGroupConfig() 在整个工程只需要调用一次来配置优先级分组*/
  10. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  11. /* 配置中断源:KEY1 */
  12. NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
  13. /* 配置抢占优先级 */
  14. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  15. /* 配置自然优先级 */
  16. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  17. /* 使能中断通道 */
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  19. NVIC_Init(&NVIC_InitStructure);
  20. }
  21. /*
  22. * 函数内容:初始化按键GPIO
  23. * 函数参数:无
  24. * 返回值: 无
  25. */
  26. void KEY_Init()
  27. {
  28. GPIO_InitTypeDef GPIO_InitStructure;
  29. EXTI_InitTypeDef EXTI_InitStructure;
  30. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
  31. /* 配置 NVIC 中断 */
  32. NVIC_Configuration();
  33. /* 配置为上拉输入 */
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  35. GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  36. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37. GPIO_Init(GPIOB,&GPIO_InitStructure);
  38. /* 选择EXTI的信号源 */
  39. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,KEY1_INT_EXTI_PINSOURCE);
  40. EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
  41. /* EXTI为中断模式 */
  42. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  43. /* 下降沿中断 */
  44. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  45. /* 使能中断 */
  46. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  47. EXTI_Init(&EXTI_InitStructure);
  48. EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
  49. }
  50. //独立按键中断
  51. void EXTI15_10_IRQHandler(void)
  52. {
  53. if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)!=RESET)
  54. {
  55. Delay_ms(5);
  56. if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET)
  57. {
  58. Key_Value = 1;
  59. }
  60. //清除标志位
  61. EXTI_ClearFlag(KEY1_INT_EXTI_LINE);
  62. }
  63. }

KEY.h

  1. #ifndef __KEY_H_
  2. #define __KEY_H_
  3. #include "stm32f10x.h" // Device header
  4. #include "main.h"
  5. //按键引脚定义
  6. #define KEY1_INT_GPIO_PORT GPIOB
  7. #define KEY1_INT_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
  8. #define KEY1_INT_GPIO_PIN GPIO_Pin_13
  9. #define KEY1_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOB
  10. #define KEY1_INT_EXTI_PINSOURCE GPIO_PinSource13
  11. #define KEY1_INT_EXTI_LINE EXTI_Line13
  12. #define KEY1_INT_EXTI_IRQ EXTI15_10_IRQn
  13. #define KEY1_IRQHandler EXTI15_10_IRQHandler
  14. void KEY_Init();
  15. #endif

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

闽ICP备14008679号