互联网的广大网友,大家早上中午晚上好、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. 2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
  3. NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
  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 = -, /*!< 2 Non Maskable Interrupt */
  5. MemoryManagement_IRQn = -, /*!< 4 Cortex-M3 Memory Management Interrupt */
  6. BusFault_IRQn = -, /*!< 5 Cortex-M3 Bus Fault Interrupt */
  7. UsageFault_IRQn = -, /*!< 6 Cortex-M3 Usage Fault Interrupt */
  8. SVCall_IRQn = -, /*!< 11 Cortex-M3 SV Call Interrupt */
  9. DebugMonitor_IRQn = -, /*!< 12 Cortex-M3 Debug Monitor Interrupt */
  10. PendSV_IRQn = -, /*!< 14 Cortex-M3 Pend SV Interrupt */
  11. SysTick_IRQn = -, /*!< 15 Cortex-M3 System Tick Interrupt */
  12.  
  13. /****** STM32 specific Interrupt Numbers *********************************************************/
  14. WWDG_IRQn = , /*!< Window WatchDog Interrupt */
  15. PVD_IRQn = , /*!< PVD through EXTI Line detection Interrupt */
  16. TAMPER_IRQn = , /*!< Tamper Interrupt */
  17. RTC_IRQn = , /*!< RTC global Interrupt */
  18. FLASH_IRQn = , /*!< FLASH global Interrupt */
  19. RCC_IRQn = , /*!< RCC global Interrupt */
  20. EXTI0_IRQn = , /*!< EXTI Line0 Interrupt */
  21. EXTI1_IRQn = , /*!< EXTI Line1 Interrupt */
  22. EXTI2_IRQn = , /*!< EXTI Line2 Interrupt */
  23. EXTI3_IRQn = , /*!< EXTI Line3 Interrupt */
  24. EXTI4_IRQn = , /*!< EXTI Line4 Interrupt */
  25. DMA1_Channel1_IRQn = , /*!< DMA1 Channel 1 global Interrupt */
  26. DMA1_Channel2_IRQn = , /*!< DMA1 Channel 2 global Interrupt */
  27. DMA1_Channel3_IRQn = , /*!< DMA1 Channel 3 global Interrupt */
  28. DMA1_Channel4_IRQn = , /*!< DMA1 Channel 4 global Interrupt */
  29. DMA1_Channel5_IRQn = , /*!< DMA1 Channel 5 global Interrupt */
  30. DMA1_Channel6_IRQn = , /*!< DMA1 Channel 6 global Interrupt */
  31. DMA1_Channel7_IRQn = , /*!< DMA1 Channel 7 global Interrupt

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

其用法为:

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

以我的例子为例:

  1. void EXTI4_IRQHandler(void)
  2. {
  3. delay_ms();
  4. if(KEY0 == )
  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学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  2. 第17章 EXTI—外部中断/事件控制器

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  3. 第17章 EXTI—外部中断/事件控制器—零死角玩转STM32-F429系列

    第17章     EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  4. EXTI—外部中断/事件控制器

    外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线.每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测. EXTI 可以实现对每个中断/事件线进行单独 ...

  5. 嵌入式02 STM32 实验08 外部中断

    一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家 ...

  6. STM32 EXTI(外部中断)

    一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...

  7. STM32之外部中断控制

    一.STM32外部中断 1.STM32外部中断结构图 如上图所示:主要包括四个环节,GPIO.AFIO.EXTI.NVIC.以STM32F103VE(100脚)为例说明硬件模块的数量: GPIO:   ...

  8. STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 文章目录 1 前言 2 STM32的外部中断 3 中断服务函数的映射关系 4 外部中断的配置 5 寄存器的 ...

  9. STM32中EXTI和NVIC的关系

    (1)NVIC(嵌套向量中断):NVIC是Cortex-M3核心的一部分,关于它的资料不在<STM32的技术参考手册>中,应查阅ARM公司的<Cortex-M3技术参考手册>C ...

随机推荐

  1. BASH_SUBSHELL 变量不生效的情况

    BASH_SUBSHELL 实现于 Bash 3.0,我一直想不到它在实际编码中有什么用,后来在 Bash 的 Change Log 里找到一句话,才知道它是作调试用的: New variables ...

  2. jsp动作元素之forward指令

    forward指令用于将页面响应转发到另外的页面.既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet. forward指令格式如下: <jsp:for ...

  3. 【相当实用】如何让TortoiseSVN导出新增或修改过的文件

    当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网站 ...

  4. 为Tcl编写C的扩展库

    Tcl是一个比较简洁的脚本语言,官方地址 http://www.tcl.tk. tcl脚本加载C实现的动态库非常方便. 1. 为Tcl编写一个用C实现的扩展函数. #include <stdio ...

  5. HK&&CC JS学习:第一周——NO.2this

    1)常用的命名规范:     aXXXX:aBtn 说明获取的是一组元素:--类数组     oXXX:oBtn 说明获取的是一个元素->对象         对象有两个重要的特点:属性 和 方 ...

  6. 号外!GNOME 3.22 正式发布喽!!!

    导读 经过半年的努力开发,别名为“卡尔斯鲁厄”的 GNOME 3.22 正式发布了!“GNOME Software 可以安装和更新 Flatpak 软件包,GNOME Builder 则可以创建它们, ...

  7. matlab GUI封装exe文件

    学习matlab过程中,有时有些程序处理数据时老是看着代码,也会觉得疲倦,那么要试一试matlab的GUI吗?我就是这么使用matlab的GUI制作一个小程序,并且使用matlab封装成了exe文件. ...

  8. robotframework----模板的使用

    模板只能放在测试用例里,可以测试大数据量,每一行模板的值,都做为用户关键字的输入参数,发下图: 删除特定证书2 的用户关键字如下:

  9. System Error Codes

    很明显,以下的文字来自微软MSDN 链接http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx M ...

  10. .NET LINQ标准查询运算符

    标准查询运算符概述      “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法. 大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了 IEnumerable<T> ...