转载 :https://www.cnblogs.com/alvis-jing/p/3678285.html

互联网的广大网友,大家早上中午晚上好、EXTI、、、故名思义、、EX表外,出、、I表示Intrrupt、、所以合起来就是外部中断、、、说到这、、我觉得我最近的六级水平(背单词)又进了一步,稍微自夸了下下、、英语重要呀、、所以各位要多读英语呀、、、

之前的51单片机也有外部中断0和外部中断1、咦?强大的STM32怎么能输给51呢是吧、、根据“葵花宝典”第STM32篇参考手册中明文规定:112通用I/O端口以下图的方式连接到16个外部中断/事件线上:

有看出点什么猫腻来没??看出来的有赏喔、、世上最残酷的惩罚就是放一大堆美女和金钱在你面前却不是你的、、、好了、、这么久没人回答、我就当你们看不出了哈,我来说说:为什么是只有16个外部中断,但可以通杀112呢?你看----7进1出、、啊哈、、你懂了吧、、也就是EXTI0管PA0~PG0,以此类推、、

那好,要怎么使GPIO口跟外部中断扯上关系呢?、回想下51的外部中断、、51的外部中断是第二功能、属于IO口复用,同样,要使用STM32的外部中断,也就是IO口的复用功能,也必须开启IO口的复用功能是吧、、我的钱是我的,你的钱也是我的、、我想用的时候必须把你的钱拿来是吧、、这就是相当于复用,

这里又涉及到IO口了、、所以呢??第一步就要初始化IO口是吧、、没错、、因为我是用按键触发外部中断的、、所以、、、至于这段代码为啥?忘记的请看STM32之GPIO口操作

这里要提醒下、、因为外部中断、、知道为什么是外部吗??在我的理解:就是从外部引入触发,也就是人为的给触发、、所以IO口要设置为输入(仅代表本人观点,如有雷同,不胜荣幸)

 1 void KEY_Init(void)
 2 {
 3      GPIO_InitTypeDef GPIO_InitStructure;
 4
 5      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
 6
 7     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
 8     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 9      GPIO_Init(GPIOE, &GPIO_InitStructure);//GPIOE2,3,4
10
11     // WK_UP-->GPIOA.0
12     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
13     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
14     GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIOA.0
15
16 }

初始化了IO口,接下来我们要干嘛呢??“拿别人的钱”是吧、、对了、、就是我说的复用、、即打开IO口的复用,参照一下代码:

1  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 

好了、、拿了别人的钱我们总得做点事是吧、、接下来、、你要触发中断、、你总得把中断和IO口的关系给连接上是吧、、、看图:

点击Open document "stm32f10x_gpio.h"可以看到:

知道有什么用吗??淡定、、你来到这世上、、也有你的作用、、当然这个也不例外:看到STM32固件库里,配置GPIO与外部中断的函数:

这里的形参u8 GPIO_PinSource  就是上面的 "stm32f10x_gpio.h"里的宏定义。

以我的为例:

1  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//开启中断线
2  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
3  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
4  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

到了这一步,算是请了中断大神站出来了,但是也得给大神点东西是吧、、不然大神不干活呀、、所以接下来我们要初始化中断:翻开“葵花宝典”第STM32篇第固件库篇我们可以看到这样的一个函数:

打开"stm32f10x_exti.h"可以看到其形参所对应的实参:

 1 typedef enum
 2 {
 3   EXTI_Mode_Interrupt = 0x00,  //中断触发
 4   EXTI_Mode_Event = 0x04           //事件触发
 5 }EXTIMode_TypeDef;
 6
 7 typedef enum
 8 {
 9   EXTI_Trigger_Rising = 0x08,       //上升沿触发
10   EXTI_Trigger_Falling = 0x0C,        //下降沿触发
11   EXTI_Trigger_Rising_Falling = 0x10  //高低电平触发
12 }EXTITrigger_TypeDef;
13
14 #define EXTI_Line0       ((uint32_t)0x00001)  /*!< External interrupt line 0 */
15 #define EXTI_Line1       ((uint32_t)0x00002)  /*!< External interrupt line 1 */
16 #define EXTI_Line2       ((uint32_t)0x00004)  /*!< External interrupt line 2 */
17 #define EXTI_Line3       ((uint32_t)0x00008)  /*!< External interrupt line 3 */
18 #define EXTI_Line4       ((uint32_t)0x00010)  /*!< External interrupt line 4 */
19 #define EXTI_Line5       ((uint32_t)0x00020)  /*!< External interrupt line 5 */
20 #define EXTI_Line6       ((uint32_t)0x00040)  /*!< External interrupt line 6 */
21 #define EXTI_Line7       ((uint32_t)0x00080)  /*!< External interrupt line 7 */
22 #define EXTI_Line8       ((uint32_t)0x00100)  /*!< External interrupt line 8 */
23 #define EXTI_Line9       ((uint32_t)0x00200)  /*!< External interrupt line 9 */
24 #define EXTI_Line10      ((uint32_t)0x00400)  /*!< External interrupt line 10 */
25 #define EXTI_Line11      ((uint32_t)0x00800)  /*!< External interrupt line 11 */
26 #define EXTI_Line12      ((uint32_t)0x01000)  /*!< External interrupt line 12 */
27 #define EXTI_Line13      ((uint32_t)0x02000)  /*!< External interrupt line 13 */
28 #define EXTI_Line14      ((uint32_t)0x04000)  /*!< External interrupt line 14 */
29 #define EXTI_Line15      ((uint32_t)0x08000)  /*!< External interrupt line 15 */
30 #define EXTI_Line16      ((uint32_t)0x10000)  /*!< External interrupt line 16 Connected to the PVD Output */
31 #define EXTI_Line17      ((uint32_t)0x20000)  /*!< External interrupt line 17 Connected to the RTC Alarm event */
32 #define EXTI_Line18      ((uint32_t)0x40000)  /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS
33                                                    Wakeup from suspend event */
34 #define EXTI_Line19      ((uint32_t)0x80000)  /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */

举个例子(以我的为例):

1     EXTI_InitStructure.EXTI_Line = EXTI_Line2 ; //PE2
2     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
3     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
4     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
5     EXTI_Init(&EXTI_InitStructure);

初始完我们要干嘛了??吃饭??那你就错了、、当然、你去吃饭我也不知道是吧、、、比如你手里有一大推钱、、那你就会想到:钱有大钱和小钱、、这样、、钱也有高与低之分、、所以配置完中断、、谁是老大、谁是老二、、这个总要先规定好吧、、所以、、我们还要来配置下中断优先级别、也就是中断嵌套、、这步很重要、、因为谁最大、谁就可以拥有葵花宝典、、

注:中断嵌套优先级不是本节所重点讲的、、所以在这里就略过了、、直接给出代码、、如要观看中断优先级如何设置、、我在此由于还没学到家,不敢妄言、正所谓出家人不打诳语、阿弥陀佛、等仔细研究了再写一篇博客哈。

为了体现这篇博客的完整性: 部分代码如下:

1   NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;   // PE2
2   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
3   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
4   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5   NVIC_Init(&NVIC_InitStructure); 

设置完中断优先级、、最后一步就是要编写中断服务函数啦、、首先、、中断服务函数名很有讲究、、这“姑娘” 长得很规范、、为什么讲究呢?因为已经定义好了、、你只要知道怎么用就行了、、请看

 1 typedef enum IRQn             //由于空间有限、、只贴出一部分
 2 {
 3 /******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
 4   NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
 5   MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
 6   BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
 7   UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
 8   SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
 9   DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
10   PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
11   SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */
12
13 /******  STM32 specific Interrupt Numbers *********************************************************/
14   WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
15   PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
16   TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
17   RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
18   FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
19   RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
20   EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
21   EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
22   EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
23   EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
24   EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
25   DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
26   DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
27   DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
28   DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
29   DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
30   DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
31   DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt       

知道为啥了吧、、、那我们怎么看它已经发生中断了呢??同样、、我们翻开“葵花宝典”第STM32篇第固件库篇可以看到

其用法为:

1 ITStatus EXTIStatus;
2 EXTIStatus = EXTI_GetITStatus(EXTI_Line8);
3
4
5
6 EXTI_ClearITpendingBit(EXTI_Line2);

以我的例子为例:

 1 void EXTI4_IRQHandler(void)
 2 {
 3     delay_ms(10);
 4   if(KEY0 == 0)
 5     {
 6      LED1=!LED1;
 7      LED0=!LED0;
 8     }
 9     EXTI_ClearITPendingBit(EXTI_Line4);
10 }

STM32之所以强大、、因为其复杂、、但是因固件库而变得不可思议、、、所以总结下开启外部中断的五个步骤:

1、初始化IO为输入,并打开复用的功能

2、设置IO口与中断线的对应关系

3、初始化外部中断

4、设置中断优先级

5、编写中断服务函数

在这里要提醒大家:有些程序一定要严格按步骤执行、、不然吃亏的就是你哈、、、

好了、、、到此、、算是结束了、、放弃午睡的时间、、冒着待会上课打瞌睡的风险写了这篇博客、、人嘛、、总会有范一些错误的时候、、看到前面那句话如果有发现我写了一个错别字的人也算是很认真的人了、、犯错误嘛、、所以这篇博客有写错的地方敬请见谅、、虚心向您请教、、金钱、美女、知识、、如果能像16个通杀112那样通杀那该多好、、、想吧、、那就努力吧、、、

STM32 EXTI外部中断相关推荐

  1. STM32 EXTI外部中断/事件

    一.EXTI外部中断/事件功能框图 1.中断线路:①-②-③-④-⑤ ①输入线:有19个中断/事件输入线(联网型有20个),通过寄存器将这些输入线设置为任意一个GPIO. ②边沿检测电路:选择上升沿触 ...

  2. STM32 EXTI外部中断及NVIC的抢占优先级和响应优先级解释

    1.中断类型 从之前的串口实验可以看出,STM32总共分为内部中断和外部中断,内部和外部的配置差别不是很大,外部中断只是多了一步,需要通过 GPIO_EXTILineConfig(uint8_t GP ...

  3. STM32 EXTI外部中断的使用

    简介: 1.中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个 ...

  4. STM32—EXTI外部中断

    文章目录 一.思路步骤(看懂这张图) 1. 打开RCC时钟树 2.配置GPIO(三种模式) 3.配置AFIO中断引脚选择 4.打开EXTI 5.配置NVIC(先选择组在初始化NVIC) 6.自己书写中 ...

  5. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  6. STM32学习笔记——EXTI外部中断,光敏传感器控制LED灯

    中断系统 中断:在主程序运行过程中,当出现了特定的中断触发条件,CPU就可以暂停当前正在运行的程序去处理中断程序,并把当前程序的地址压入堆栈,中断程序处理完成后把地址弹出堆栈,回到刚刚暂停的位置继续执 ...

  7. STM32中断—EXTI外部中断

    5. 中断 本文来自于<STM32--江科大>的笔记整理. 中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处 ...

  8. STM32(五)——EXTI外部中断

    文章笔记源于--江科大自化协的视频 一. 中断系统 中断 : 在主程序运行过程中,出现特定的中断触发条件,使得CPU暂停当前正在运行的程序,而去处理中断程序,完成后,又返回原来被暂停的位置继续工作 中 ...

  9. STM32笔记——EXTI外部中断

    目录 一.概述 二.主要外设介绍 2.1 AFIO复用IO口 2.2 EXTI简介 EXTI框图: 2.3 NVIC中断优先级分组 三.EXTI外部中断整体结构 四.实验程序 4.1 对射式红外传感器 ...

  10. 28.EXTI外部中断原理与配置

    EXTI外部中断原理与配置 参考资料 开发板配套资料 <STM32Fx开发指南-HAL库版本>-第x章 外部中断实验 STM32Fxxx官方资料: <STM32Fxx中文参考手册&g ...

最新文章

  1. 集成、知识蒸馏和自蒸馏有区别?
  2. [NC16591]关押罪犯 并查集
  3. JDBC连接执行MySQL存储过程报空指针或权限错误
  4. javascript时间格式format函数,js日期格式化函数
  5. c# 在DataTable的第一列(指定列)的前面添加一列
  6. 1053 住房空置率 (20 分)
  7. 【POJ】2387 Til the Cows Come Home
  8. [Leedcode][JAVA][第460题][LFU]
  9. php伪静态不支持中文,wordpress伪静态如何支持中文(目前不支持分类目录中文)...
  10. 为项目选择合适的语言
  11. C4d的oc渲染器报错 There is no CUDA device which is selectedThere is no CUDA devic
  12. 博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
  13. Sonic一站式开源分布式集群云真机测试平台阶段性使用总结
  14. 甲骨文大裁员,竟是因为它?
  15. poj 1900 Game
  16. 使用Kieker(AspectJ)监控控制台程序
  17. logback无忧配置文件
  18. 武汉:“大象转身”,“中国车都”变“中国车谷”的二段跨越
  19. SpringBoot2.x 监听器详解
  20. 智能家居CCC认证办理流程

热门文章

  1. ORA-20001: Invalid or inconsistent input values
  2. matlab解方java_Java:调用window的matlab遇到的问题和解决方案
  3. 六爪机器人_六爪机器人
  4. 测试工具Monitor入门
  5. 解决Namecheap域名转入确认邮件重发及邮件收不到
  6. 国内外 48 个最常用学术网站汇总,这可能是史上最全的!
  7. 机器学习之线性回归缩减维度
  8. (CVPR-2021)动态区域感知卷积
  9. SPSS数据分析-交叉表分析
  10. 经典的面板数据集(R语言包plm)