先说点题外话。


!是取逻辑反的意思,
~是按位取反的意思

!0x01=0;
~0x01=1111 1110;


进入正题

基本概念

STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。

每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。


相同的Pin脚公用一条线。
每条触发线都可以配置属于自己的中断条件。
但是我们只有七个中断向量,也就是说只有7个中断服务函数。

纠错:上图还有一行EXIT0
(麻蛋,5到15不是亲儿子,是垃圾桶里捡的啊

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

以上中断服务函数再启动文件里可以找到。

外部中断常用函数

GPIO.H


void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//设置IO口与中断线的映射关系exp:  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

EXTI.H


void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//初始化中断线:触发方式等
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位

配置流程

  1. 初始化IO口
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStruct);
  1. 使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

为什么要使能这个时钟呢?
有以下三种情况要使能这个时钟。
见复用和重映射

这个属于映射到外部中断线。

  1. 设置中断口和外部中断线关系
    实际上就是设置是哪条外部中断线
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
  1. 设置外部中断线的中断条件
    上升沿,下降沿什么的
 EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line=EXTI_Line4;EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStruct);
  1. 中断优先级分组并初始化
    分组应该很早就去做了
 NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStruct);
  1. 书写中断函数,注意最后要清除中断标志位,不如不会再次进入中断
void EXTI4_IRQHandler()
{delay_ms(10);if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
//      GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//  GPIO_WriteBit(GPIOB,GPIO_Pin_5,!GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5));
//  if(EXTI_GetITStatus(EXTI_Line4)==SET)flg++;EXTI_ClearITPendingBit(EXTI_Line4);
}

中断函数心得

因为一线多用,一般来说都要用if语句判断一下具体是什么引起的中断。
这个不建议用甚至是不能用

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);exp:if(EXTI_GetITStatus(EXTI_Line4)==SET)

来判断,因为你能进中断这个肯定是SET的状态,一般是读取端口的电平情况来判断的。
**注:**USART为什么会用到GetITStatus呢?因为一个USART口会有很多情况(比如说接受位满了,发送位空了等等)触发中断,而EXIT外部中断触发中断的情况是唯一的 ”SET"。

蓝桥杯嵌入式学习STM32之外部中断EXTI详解相关推荐

  1. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  2. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  3. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  4. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  6. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  7. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

最新文章

  1. 你还在认为 count(1) 比 count(*) 效率高?
  2. 【推荐】Redhat 5配置YUM服务器【利用DVD盘做yum源】
  3. (0068)iOS开发之AutoLayout框架Masonry使用心得
  4. 【Linux】15.mdc启动网卡并设置其ip和子网掩码
  5. python3(十)pickle库
  6. ParameterizedTypeImpl
  7. 统计文件中有多少个单词amp;c语言实现
  8. ELF格式解析库之基本数据类型
  9. PowerPC E500 MMU详解
  10. js中定义用字符串拼接起来的变量名的变量
  11. 常见的使用ICMP协议的命令
  12. matlab广州等温线地形图,MATLAB 画等温线.doc
  13. SVN创建分支/合并分支/切换分支
  14. 干货,分享!后台信息管理HTML静态网页模版
  15. 认识MyBatis、Mybatis笔记.MyBatis的核心配置,动态Mapper,动态SQL,表的关联及分页操作和缓存理解
  16. jul177链接_「jul177小早川中文」无删减版高清天天影音第89集
  17. 【编译原理】【实验】THOMPSON 算法的实现
  18. 将数据库连接地址由localhost改为IP地址后无法访问的解决方法
  19. 《动手学深度学习》(PyTorch版)代码注释 - 3 【Softmaxs_regression_with_zero】
  20. 中台战略-第五章、中台建设方法论

热门文章

  1. (附源码)springboot证书管理系统的设计与实现 毕业设计162317
  2. pytorch中tensor.mean(axis, keepdim)参数理解小实验
  3. 评分高的前端书籍推荐(上)—好书知时节
  4. 数据开发 的 代码规范 以及 代码评审脚本
  5. 感谢csdn发“笔耕不辍”勋章
  6. 【小超_U3D】Unity3D对陀螺仪的使用
  7. Vectorworks 2021 for mac(3D建筑设计软件)
  8. 信息流造就阿里 物流造就京东
  9. 服装连锁店铺管理软件大盘点!秦丝、日进斗金、商陆花谁更强?
  10. Photoshop文字特效——栅格层叠效果文字