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

EXTI功能框图
EXTI 的功能框图包含了 EXTI 最核心内容,掌握了功能框图,对 EXTI 就有一个整体
的把握,在编程时就思路就非常清晰。 EXTI 功能框图见图 17-1。
在图 17-1 可以看到很多在信号线上打一个斜杠并标注“ 23”字样,这个表示在控制器
内部类似的信号线路有 23 个,这与 EXTI 总共有 23 个中断/事件线是吻合的。所以我们只
要明白其中一个的原理,那其他 22 个线路原理也就知道了。

EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件
上就有所不同。

产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功
能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且
是电路级别的信号传输,属于硬件级的。
另外, EXTI 是在 APB2 总线上的,在编程时候需要注意到这点。

EXTI 有 23 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至
EXTI15,还有另外七根用于特定的外设事件,见表 17-1。
七根特定外设中断/事件线由外设触发,具体用法参考《 STM32F4xx 中文参考手册》
中对外设的具体说明。

EXTI0 可以通过 SYSCFG 外部中断配置寄存器
1(SYSCFG_EXTICR1)的 EXTI0[3:0]位选择配置为 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、
PG0、 PH0 或者 PI0,

EXTI初始化结构体详解
标准库函数对每个外设都建立了一个初始化结构体,比如 EXTI_InitTypeDef,结构体
成员用于设置外设工作参数,并由外设初始化配置函数,比如 EXTI_Init()调用,这些设定
参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个
成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 stm32f4xx_exti.h 文件中,
初始化库函数定义在 stm32f4xx_exti.c 文件中,编程时我们可以结合这两个文件内注释使用。

下面说一下编程框架:

使用 GPIO 之前必须开启 GPIO 端口的时钟;用到 EXTI 必须开启 SYSCFG 时钟。

作为中断/时间输入线把 GPIO 配置为输入模式,这里不使用上拉或下拉,由外部电路
完全决定引脚的状态。

SYSCFG_EXTILineConfig 函数用来指定中断/事件线的输入源,它实际是设定
SYSCFG 外部中断配置寄存器的值,该函数接收两个参数,第一个参数指定 GPIO 端口源,
第二个参数为选择对应 GPIO 引脚源编号。

  1. int main(void)
  2. {
  3. /* LED 端口初始化 */
  4. LED_GPIO_Config();
  5.  
  6. /* 初始化EXTI中断,按下按键会触发中断,
  7. * 触发中断会进入stm32f4xx_it.c文件中的函数
  8. * KEY1_IRQHandler和KEY2_IRQHandler,处理中断,反转LED灯。
  9. */
  10. EXTI_Key_Config();
  11.  
  12. /* 等待中断,由于使用中断方式,CPU不用轮询按键 */
  13. while()
  14. {
  15. }
  16. }

主函数结构,先初始化硬件LED,用于按键中断控制的效果展示。

然后是 EXTI_Key_Config(); 需要留意一点的函数或者配置加以红色标注:

  1. /**
  2. * @brief 配置嵌套向量中断控制器NVIC
  3. * @param 无
  4. * @retval 无
  5. */
  6. static void NVIC_Configuration(void)
  7. {
  8. NVIC_InitTypeDef NVIC_InitStructure;
  9.  
  10. /* 配置NVIC为优先级组1 */
  11. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  12.  
  13. /* 配置中断源:按键1 */
  14. NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
  15. /* 配置抢占优先级:1 */
  16. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
  17. /* 配置子优先级:1 */
  18. NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
  19. /* 使能中断通道 */
  20. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21. NVIC_Init(&NVIC_InitStructure);
  22.  
  23. /* 配置中断源:按键2,其他使用上面相关配置 */
  24. NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
  25. NVIC_Init(&NVIC_InitStructure);
  26. }
  27.  
  28. /**
  29. * @brief 配置 PA0 为线中断口,并设置中断优先级
  30. * @param 无
  31. * @retval 无
  32. */
  33. void EXTI_Key_Config(void)
  34. {
  35. GPIO_InitTypeDef GPIO_InitStructure;
  36. EXTI_InitTypeDef EXTI_InitStructure;
  37.  
  38. /*开启按键GPIO口的时钟*/
  39. RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);
  40.  
  41. /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/
  42. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  43.  
  44. /* 配置 NVIC */
  45. NVIC_Configuration();
  46.  
  47. /* 选择按键1的引脚 */
  48. GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  49. /* 设置引脚为输入模式 */
  50. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  51. /* 设置引脚不上拉也不下拉 */
  52. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  53. /* 使用上面的结构体初始化按键 */
  54. GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
  55.  
  56. /* 连接 EXTI 中断源 到key1引脚 */
  57. SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);
  58.  
  59. /* 选择 EXTI 中断源 */
  60. EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
  61. /* 中断模式 */
  62. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  63. /* 下降沿触发 */
  64. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  65. /* 使能中断/事件线 */
  66. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  67. EXTI_Init(&EXTI_InitStructure);
  68.  
  69. /* 选择按键2的引脚 */
  70. GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;
  71. /* 其他配置与上面相同 */
  72. GPIO_Init(KEY2_INT_GPIO_PORT, &GPIO_InitStructure);
  73.  
  74. /* 连接 EXTI 中断源 到key2 引脚 */
  75. SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,KEY2_INT_EXTI_PINSOURCE);
  76.  
  77. /* 选择 EXTI 中断源 */
  78. EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;
  79. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  80. /* 上升沿触发 */
  81. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  82. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  83. EXTI_Init(&EXTI_InitStructure);
  84. }

在stm32f4xx_it.c中编写中断服务函数,其中中断服务函数名要对应启动文件的中断向量表,为了可读性可以用宏给中断向量表取一个适合中断目的的名字。

还有一个需要注意的:需要使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟。

上面是固件库的函数定义内部,这个是固件库编程的套路,都是这样定义某个功能的结构体,然后初始化这个结果体,最后调用一个init函数完成。

固件库这样的套路明白之后,编写应用程序会轻松愉快地多。至于固件库内部到底是如何实现的,在达到高手水平了再去,毕竟做项目是以速度和质量说话的,固件库肯定快于寄存器版的,但是想自己写出库函数,又不得不去学习寄存器编程,所以都是相辅相成的,先学好固件库,然后学寄存器版,然后达到自己可以编写库,就达到学习目的了。

EXTI—外部中断/事件控制器的更多相关文章

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

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

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

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

  3. STM32之EXTI——外部中断

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

  4. STM32本学习笔记EXTI(外部中断)

    参考资料:STM32数据表.网络信息 =========================================切割线===================================== ...

  5. STM32学习笔记之EXTI(外部中断)

    參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...

  6. STM32 EXTI(外部中断)

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

  7. STM32基本GPIO操作:按键输入(扫描+外部中断)

    (涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...

  8. STM32F103ZET6外部中断

    1.EXTI功能 外部中断/事件控制器EXTI管理了STM32的20个中断/事件线. EXTI的功能框图如下: 在功能框图中,可以看到很多在信号线上打了一个斜杠并标注“20”的字样,这是表示在STM3 ...

  9. (stm32f103学习总结)—stm32外部中断

    一.外部中断介绍 1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器.EXTI的每根输入线都可单独进行配置,以 ...

随机推荐

  1. uva 10994 - Simple Addition(规律)

    题目链接:uva 10994 - Simple Addition 题目大意:给出l和r,求∑(l≤i≤r)F(i), F(i)函数题目中有. 解题思路:由两边向中间缩进,然后l和r之间的数可以按照1~ ...

  2. 刚子扯谈:网站运营在左 技术在右 真TM扯

    朋友的书 鄙人的书 2013年8月5日,雨未下,天猴焖 开片语:今天的扯谈内容是我转载我Java学习交流群里面一个哥们,当然我推荐他加入了朋友的网络分析师这个群,我认为那样对他有更大帮助.现在他是XX ...

  3. docker基本元素和底层实现

    docker是轻量级的操作系统虚拟化解决方案 优点 1.基于操作系统层面 2.启动速度快(秒级) 3.资源利用率高 4.性能高.易管理 docker有3大基本要素 分别是 1.镜像:只读模板,用来创建 ...

  4. 服务器主机上RAID Card的Write Caching Policy

    在Cisco Server的DRAC中, 创建virtual drive时, 会看到下面的选项.   那么Write back, write through, write back bad BBU之间 ...

  5. ViewPager Fragment PagerAdapter MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 【SSH 基础】SSH框架--struts深入具体解释(一)

    学习了struts,可是对于它的由来,以及为什么使用action和struts.xml的方式而不採用曾经的servlet方式.有些疑问,究竟之前的方式有什么弊端,struts又给我们带来了什么便利? ...

  7. 成都PHP开发project师薪资信息

    这是成都的PHPproject开发师招聘.如图所见,最低的月薪是4K,最高的是35W,PHP开发工程师正处于炙手可热的发展趋势,还愁拿不到高薪,找不到工作的你,还犹豫什么,机会就在眼前,成都传智播客P ...

  8. token 机制

  9. Linux中基于hadoop安装hive(CentOS7+hadoop2.8.0+hive2.1.1)

    http://blog.csdn.net/pucao_cug/article/details/71773665

  10. HTTP请求头 If-Modified-Since

    来自:http://www.jm47.com/g/91174.htm 一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签. 最近在分析Squid的access.log日 ...