图1.0

图1.1

中断控制器支持23条中断线,其中16条是IO管脚中断线,分别是EXTI0~EXTI15:

 图 1.2

另外七根中断线如下图:

中断线和管脚的对应关系:EXTI0~EXTI15 和GPIOx0~15一一对应,x:A~G。

每条中断线控制着7个管脚的中断跳变沿的输入,通过寄存器SYSCFG_EXTICRx(x:1~4)来进行多选1。

  举例:中断线0,即EXTI0控制着7个管脚的中断源输入,分别是PA0,PB0,PC0,PD0,PE0,PF0,PG0。

外部中断寄存器配置SYSCFG共有四个寄存器,他们的作用是类似的,管理着某中断下某引脚的选择,下列只介绍第一个寄存器,其他类似:

  1. EXTI0[:] 用于选择中断线0的中断源管脚
  2. PA0 引脚
  3. PB0 引脚
  4. PC0 引脚
  5. PD0 引脚
  6. PE0 引脚
  7. PF0 引脚
  8. PG0 引脚
  9. PH0 引脚
  10. PI0 引脚
  11. 举例:中断线0的中断源管脚选择为PA0管脚,对应的代码如下:
  12. SYSCRF->EXTICR1 &=~(0xF<<);
  13. EXTI1[:] 用于选择中断线1的中断源管脚
  14. PA1 引脚
  15. PB1 引脚
  16. PC1 引脚
  17. PD1 引脚
  18. PE1 引脚
  19. PF1 引脚
  20. PG1 引脚
  21. PH1 引脚
  22. PI1 引脚
  23. 举例:中断线1的中断源管脚选择为PF1管脚,对应的代码如下:
  24. SYSCRF->EXTICR1 |=(<<);
  25. EXTI2[:] 用于选择中断线2的中断源管脚
  26. PA2 引脚
  27. PB2 引脚
  28. PC2 引脚
  29. PD2 引脚
  30. PE2 引脚
  31. PF2 引脚
  32. PG2 引脚
  33. PH2 引脚
  34. PI2 引脚
  35. CR1
  36. EXTI3[:] 用于选择中断线3的中断源管脚
  37. PA3 引脚
  38. PB3 引脚
  39. PC3 引脚
  40. PD3 引脚
  41. PE3 引脚
  42. PF3 引脚
  43. PG3 引脚
  44. PH3 引脚
  45. PI3 引脚
  46. CR1

四位为一小组,四位控制一条中断线,用于选择中断线的中断源管脚。中断线0~中断线15 分别于EXTI0[3:0]~EXTI15[3:0]一一对应。

  编程时,SYSCFG_EXTICR对应SYSCFG->EXTICR[0]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[]

  SYSCFG_EXTICR对应SYSCFG->EXTICR[3]

下面工程文件是用外部中断检测四个按键:

  1. #include "stm32f4xx.h"
  2. #include "delay.h"
  3. void Key_Init(void)
  4. {
  5. RCC->AHB1ENR |= <<;//使能GPIOA的时钟
  6. GPIOA->MODER &=~(<<);//PA0配置为输入模式
  7. GPIOA->PUPDR &=~(<<);//PA0配置为浮空模式
  8. //GPIOA->PUPDR |=2<<0;//下拉 也可以配置
  9.  
  10. RCC->AHB1ENR |= <<;//使能GPIOE时钟
  11. GPIOE->MODER &=~(<<);//PE2配置为输入模式
  12. GPIOE->PUPDR &=~(<<);//PE2配置为浮空模式
  13. //GPIOA->PUPDR |=1<<4;//初始为上拉
  14.  
  15. GPIOE->MODER &=~(<<);//PE3配置为输入模式
  16. GPIOE->PUPDR &=~(<<);//PE3配置为浮空模式
  17. //GPIOA->PUPDR |=1<<6;
  18.  
  19. GPIOE->MODER &=~(<<);//PE4配置为输入模式
  20. GPIOE->PUPDR &=~(<<);//PE4配置为浮空模式
  21. //GPIOA->PUPDR |=1<<8;
  22. }
  23.  
  24. void EXIT_Init(void)
  25. {
  26. RCC->APB2ENR |= <<;//使能系统配置控制器时钟
  27.  
  28. /*******初始化KEY1<-->PA0的中断线0**********/
  29. SYSCFG->EXTICR[] &=~(0XF<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
  30. EXTI->RTSR |= <<;//选择中断线0触发边沿为上升沿
  31. EXTI->IMR |= <<;//开放中断线0的中断请求
  32. NVIC_EnableIRQ(EXTI0_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn)
  33.  
  34. /*******初始化KEY2<-->PE2的中断线2**********/
  35. SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
  36. //中断线2,一条中断线位为4,第二位就是8了
  37.  
  38. EXTI->FTSR |= <<;//选择中断2触发边沿为下降沿
  39. EXTI->IMR |= <<;//开放中断线2的中断请求
  40. NVIC_EnableIRQ(EXTI2_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn)
  41.  
  42. /*******初始化KEY3<-->PE3的中断线3**********/
  43. SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
  44. EXTI->FTSR |= <<;//选择中断线3触发边沿为下降沿
  45. EXTI->IMR |= <<;//开放中断线3的中断请求
  46. NVIC_EnableIRQ(EXTI3_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn)
  47.  
  48. /*******初始化KEY4<-->PE4的中断线4**********/
  49. SYSCFG->EXTICR[] |= (<<);//配置SYSCFG 外部中断配置寄存器,选择中断源管脚
  50. EXTI->FTSR |= <<;//选择中断线0触发边沿为下降沿
  51. EXTI->IMR |= <<;//开放中断线4的中断请求
  52. NVIC_EnableIRQ(EXTI4_IRQn);//使能中断通道,NVIC_EnableIRQ(IRQn)
  53. }
  54.  
  55. void EXTI0_IRQHandler(void)
  56. {
  57. //k1 PA0 led1 pf6
  58. if(EXTI->PR &(<<)) //判断中断线0是否触发了中断
  59. {
  60. EXTI->PR |= <<;//置一清零
  61. Delay_ms();//延时10ms消抖
  62. if(GPIOA->IDR &(<<))//判断KEY1是不稳定的按下了
  63. {
  64. GPIOF->ODR ^= <<;//取反LED1灯的状态
  65. }
  66. }
  67. }
  68.  
  69. void EXTI2_IRQHandler(void)
  70. {
  71. //k2 PE2 led3 pf9
  72. if(EXTI->PR &(<<)) //判断中断线2是否触发了中断
  73. {
  74. EXTI->PR |= <<;//置一清零
  75. Delay_ms();//延时10ms消抖
  76. if(!(GPIOE->IDR &(<<)))//判断KEY2是不稳定的按下了
  77. {
  78. GPIOF->ODR ^= <<;//取反LED2灯的状态;
  79. }
  80. }
  81. }
  82.  
  83. void EXTI3_IRQHandler(void)
  84. {
  85. //k3 PE3 led3 pf10
  86. if(EXTI->PR &(<<)) //判断中断线3是否触发了中断
  87. {
  88. EXTI->PR |= <<;//置一清零
  89. Delay_ms();//延时10ms消抖
  90. if(!(GPIOE->IDR &(<<)))//判断KEY3是不稳定的按下了
  91. {
  92. GPIOF->ODR ^= <<;//取反LED3灯的状态
  93. }
  94. }
  95. }
  96.  
  97. void EXTI4_IRQHandler(void)
  98. {
  99. //k4 PE4 led4 pc0
  100. if(EXTI->PR &(<<)) //判断中断线4是否触发了中断
  101. {
  102. EXTI->PR |= <<;//置一清零
  103. Delay_ms();//延时10ms消抖
  104. if(!(GPIOE->IDR &(<<)))//判断KEY4是不稳定的按下了
  105. {
  106. GPIOC->ODR ^= <<;//取反LED4灯的状态
  107. }
  108. }
  109. }

STM32之外部中断的更多相关文章

  1. STM32的外部中断配置及使用

    STM32的外部中断配置及使用 配置1:GPIO: 配置外部中断为输入模式: 配置2:EXTI: 配置外部中断线和触发模式: 配置3:NVIC: 配置外部中断源和中断优先级: 需要注意的是:RCC_A ...

  2. STM32 GPIO外部中断总结

    一.STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处.STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB ...

  3. STM32之外部中断控制

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

  4. 浅谈stm32的外部中断

    简述 本文简单介绍stm32外部中断的一般操作步骤,后续会补充外部中断的相关内容 stm32的中断控制器支持19个外部中断/事件请求: line0~line15:这16条line分别对应不同GPIO口 ...

  5. STM32之EXTI——外部中断

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

  6. 转别人的 STM32外部中断使用注意事项

    前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...

  7. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  8. stm32 外部中断学习

    今天我们看看STM32的外部中断实验. STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一 ...

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

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

随机推荐

  1. ubuntu18.04 首次登录mysql未设置密码或忘记密码解决方法

    1.首先输入以下指令: sudo cat /etc/mysql/debian.cnf运行截图如下: 2. 再输入以下指令: mysql -u debian-sys-maint -p//注意! //这条 ...

  2. 小福bbs-冲刺总结

    [小福bbs-冲刺总结] 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 冲刺总结 作业的正文 小福bbs-冲刺总结 其他参考文献 面向百度和 ...

  3. JVM 类加载器ClassLoader源码学习笔记

    类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机 ...

  4. Java性能分析神器-JProfiler详解(转)

    前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了 ...

  5. 快速识别Hash加密方式hashid

    快速识别Hash加密方式hashid hashid工具是用来识别不同类型的散列加密,进而判断哈希算法的类型.该工具的而语法格式如下所示: hashid [option] INPUT 其中,option ...

  6. 转「服务器运维」如何解决服务器I/O过高的问题

    问题缘起: 当我习惯性地用top查看任务运行状态时,发现我运行的100个任务,只有3个在运行,其他都在摸鱼状态.同时发现我的任务进程都是"D"状态(未截图),而不是R(运行)状态. ...

  7. Qt tableView设置不可编辑

    main_ui.tableView_record->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToConten ...

  8. visual studio code跳转到定义处插件

    visual studio code 中使用跳转到定义处的插件 https://marketplace.visualstudio.com/items?itemName=Shan.code-settin ...

  9. ES6深入浅出-4 迭代器与生成器-3.生成器 & for...of

    迭代器平时用的很少.但是如果你是写框架的,你会经常用到迭代器. 生成器是专门用来做迭代器的东西 发布器是要产生一个叫做next的对象,如果你要产生这种对象.就可以使用ES6新出的语法. ES6的新语法 ...

  10. Windows下MariaDB数据库安装图文教程

    MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQL数据库可以迁移到MariaDB中使用   说明: MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQ ...