你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103:外部中断(EXTI)——原理和程序

[复制链接]
STMCU小助手 发布时间:2022-5-3 13:29
一、外部中断(EXTI)—简介
EXTI (External interrupt/event controller)——外部中断/事件控制器。
互联型STM32有20个能够产生事件/中断请求的边沿检测器,STM32F103系列有19个能够产生事件/中断请求的边沿检测器。
每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。
每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。

二、外部中断(EXTI)—框图

U7QW(4}J]5Q7A4SP`887_ZR.png

三、外部中断(EXTI)—线路映像
通用I/O端口以下图的方式连接到16个外部中断/事件线上:

X$_F]RV$_}B23`0WR)PBG.png

}23LB{Q_WTZ`MTCF)Q1C8Z8.png

四、外部中断(EXTI)—寄存器
从外部中断(EXTI)结构框图可以知道,外部中断功能由六个寄存器配置。

1. 中断屏蔽寄存器(EXTI_IMR)

2HWBB)MWI}Y2YHI57FC@AHP.png

2. 事件屏蔽寄存器(EXTI_EMR)

W$UVLY8X3JZH[N6P85HX7HU.png

3. 上升沿触发选择寄存器(EXTI_RTSR)

ZP)$VBV9@BX8XX6P1{JC.png

4. 下降沿触发选择寄存器(EXTI_FTSR)

C_A%){O`4[MH3AAXNCMO_(1.png

5. 软件中断事件寄存器(EXTI_SWIER)

C_(A`W%{93HSWC{`}J9XBIK.png

6. 挂起寄存器(EXTI_PR)


TI]KVG%TZGZ0}QJ(UJ27J93.png

五、外部中断(EXTI)—配置
1. 外部中断(EXTI)—映射关系


3E495[UXR2WRFZL6Z6%LUR6.png

2. 外部中断(EXTI)—GPIO引脚配置

OP2][U321@PV$C~2[ZQLB.png

由上图可知,外部中断的GPIO引脚可以配置一下三种:
  1. GPIO_Mode_IN_FLOATING        //浮空输入
  2. GPIO_Mode_IPU                        //上拉输入
  3. GPIO_Mode_IPD                        //下拉输入
复制代码

3. 外部中断(EXTI)—触发方式

外部中断(EXTI)有三种触发方式:
  1. EXTI_Trigger_Rising                        //上升沿触发
  2. EXTI_Trigger_Falling                 //下降沿触发
  3. EXTI_Trigger_Rising_Falling        //上升沿和下降沿都可以触发
复制代码

六、外部中断(EXTI)—程序
外部中断配置程序

  1. void EXTIX_Init(void)
  2. {
  3.         EXTI_InitTypeDef EXTI_InitStructure;
  4.         NVIC_InitTypeDef NVIC_InitStructure;
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6. //初始化时钟
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTB,PORTC时钟
  9.         //初始化GPIO端口
  10.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_4;        //PA0,PA4
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //PA0设置成浮空输入,默认下拉        
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //最高输出速率50MHz
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        //初始化GPIOA

  14.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6|GPIO_Pin_8;        //PB6,PB8
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                           //设置成上拉输入,默认下拉
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //最高输出速率50MHz
  17.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //初始化GPIOB
  18.         
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;        //PC12,PC14
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                         //设置成下拉输入,默认下拉
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //最高输出速率50MHz
  22.         GPIO_Init(GPIOC, &GPIO_InitStructure);                                        //初始化GPIOC
  23.         

  24. /*GPIOA0中断初始化配置*/  
  25.         EXTI_ClearITPendingBit(EXTI_Line0);                            //清除线0 IO口中断清除挂起位(清除中断标志位)
  26.           EXTI_InitStructure.EXTI_Line=EXTI_Line0;                              //中断线选择
  27.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                //EXTI为中断模式
  28.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //上升沿触发
  29.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                //使能中断
  30.           EXTI_Init(&EXTI_InitStructure);                                                         //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  31.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);        //将GPIOA0挂到中断上

  32. /*GPIOA4中断初始化配置*/  
  33.         EXTI_ClearITPendingBit(EXTI_Line4);                                    //清除线4 IO口中断清除挂起位(清除中断标志位)
  34.           EXTI_InitStructure.EXTI_Line=EXTI_Line4;                                      //中断线选择
  35.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //EXTI为中断模式
  36.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                //下降沿触发
  37.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //使能中断
  38.           EXTI_Init(&EXTI_InitStructure);                                                                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  39.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);        //将GPIOA4挂到中断上
  40.                
  41. /*GPIOB6中断初始化配置*/  
  42.         EXTI_ClearITPendingBit(EXTI_Line6);                                    //清除线6 IO口中断清除挂起位(清除中断标志位)
  43.           EXTI_InitStructure.EXTI_Line=EXTI_Line6;                                      //中断线选择
  44.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //EXTI为中断模式
  45.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿都可以触发
  46.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //使能中断
  47.           EXTI_Init(&EXTI_InitStructure);                                                                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  48.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);        //将GPIOB6挂到中断上

  49. /*GPIOB8中断初始化配置*/  
  50.         EXTI_ClearITPendingBit(EXTI_Line8);                                    //清除线8 IO口中断清除挂起位(清除中断标志位)
  51.           EXTI_InitStructure.EXTI_Line=EXTI_Line8;                                      //中断线选择
  52.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //EXTI为中断模式
  53.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                //下降沿触发
  54.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //使能中断
  55.           EXTI_Init(&EXTI_InitStructure);                                                                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  56.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);        //将GPIOB8挂到中断上
  57.                
  58. /*GPIOC12中断初始化配置*/  
  59.         EXTI_ClearITPendingBit(EXTI_Line12);                            //清除线12 IO口中断清除挂起位(清除中断标志位)
  60.           EXTI_InitStructure.EXTI_Line=EXTI_Line12;                                      //中断线选择
  61.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //EXTI为中断模式
  62.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                //上升沿触发
  63.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //使能中断
  64.           EXTI_Init(&EXTI_InitStructure);                                                                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  65.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource12);        //将GPIOC12挂到中断上

  66. /*GPIOC14中断初始化配置*/  
  67.         EXTI_ClearITPendingBit(EXTI_Line14);                            //清除线14 IO口中断清除挂起位(清除中断标志位)
  68.           EXTI_InitStructure.EXTI_Line=EXTI_Line14;                                      //中断线选择
  69.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //EXTI为中断模式
  70.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿都可以触发
  71.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //使能中断
  72.           EXTI_Init(&EXTI_InitStructure);                                                                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  73.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource14);        //将GPIOC14挂到中断上
  74.                
  75. /*NVIC初始化配置*/
  76.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                    //配置NVIC优先级分组为0

  77.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能线0所在的外部中断通道
  78.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
  79.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                        //子优先级3
  80.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
  81.           NVIC_Init(&NVIC_InitStructure);                                                            //初始化外设NVIC寄存器
  82.                
  83.         NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                        //使能线4所在的外部中断通道
  84.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
  85.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                        //子优先级2
  86.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
  87.           NVIC_Init(&NVIC_InitStructure);                                                            //初始化外设NVIC寄存器
  88.                
  89.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能线9到线5所在的外部中断通道
  90.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0,
  91.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //子优先级1
  92.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
  93.           NVIC_Init(&NVIC_InitStructure);

  94.            NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                //使能线15到线10所在的外部中断通道
  95.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
  96.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //子优先级0
  97.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
  98.           NVIC_Init(&NVIC_InitStructure);
  99. }
复制代码

外部中断服务函数
  1. //外部中断0服务函数
  2. void EXTI0_IRQHandler(void)
  3. {
  4.         if(EXTI_GetITStatus(EXTI_Line0)!= RESET)//有中断申请
  5.         {
  6.                 /**
  7.                 其他功能程序
  8.                 **/
  9.                 EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
  10.         }
  11. }

  12. //外部中断4服务函数
  13. void EXTI4_IRQHandler(void)
  14. {
  15.         if(EXTI_GetITStatus(EXTI_Line4)!= RESET)//有中断申请
  16.         {
  17.                 /**
  18.                 其他功能程序
  19.                 **/
  20.                 EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位
  21.         }
  22. }


  23. //外部中断9_5服务函数
  24. void EXTI9_5_IRQHandler(void)
  25. {
  26.         if(EXTI_GetITStatus(EXTI_Line6)!= RESET)//有中断申请
  27.         {
  28.                 /**
  29.                 其他功能程序
  30.                 **/
  31.                 EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE6上的中断标志位
  32.         }
  33.         
  34.         if(EXTI_GetITStatus(EXTI_Line8)!= RESET)//有中断申请
  35.         {
  36.                 /**
  37.                 其他功能程序
  38.                 **/
  39.                 EXTI_ClearITPendingBit(EXTI_Line8); //清除LINE8上的中断标志位
  40.         }
  41. }


  42. //外部中断15_10服务函数
  43. void EXTI15_10_IRQHandler(void)
  44. {
  45.         if(EXTI_GetITStatus(EXTI_Line12)!= RESET)//有中断申请
  46.         {
  47.                 /**
  48.                 其他功能程序
  49.                 **/
  50.                 EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE12上的中断标志位
  51.         }
  52.         
  53.         if(EXTI_GetITStatus(EXTI_Line14)!= RESET)//有中断申请
  54.         {
  55.                 /**
  56.                 其他功能程序
  57.                 **/
  58.                 EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位
  59.         }
  60. }


复制代码

收藏 评论0 发布时间:2022-5-3 13:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版