STM32外部中断

1.中断基本原理

  • 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

  • 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

  • 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

STM32中断

  • 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设

  • 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级

中断/异常向量表

程序中的中断地址是由编译器分配的,是不固定的

所以需要中断向量表的地址,中断产生后,跳到这个地址

这个地址中存放中断程序的地址,再跳过去

NVIC

  • NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级

  • 抢占优先级高的可以中断嵌套【即先送入CPU处理】

    响应优先级高的可以优先排队【即可以插队在靠前的位置,等待CPU处理】

    抢占优先级和响应优先级均相同的按中断号排队

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //放在main.c初始化函数中只调用一次就行

EXTI

  • EXTI(Extern Interrupt)外部中断

  • EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

  • 支持的触发方式:上升沿/下降沿/双边沿/软件触发

  • 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断【例如PA0 PB0不能一起用外部中断】

  • 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

  • 触发响应方式:中断响应/事件响应

AFIO

【Alternate Fuction复用功能】

  • AFIO主要用于引脚复用功能的选择和重定义

  • 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

外部中断/事件控制器框图

2.STM32 EXTI库函数

参考【STM32固件库使用手册】

所有相关函数

EXTI_Init

请结合

一、EXTI->外部中断/事件控制器框图

四、各寄存器

阅读以下代码

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
{uint32_t tmp = 0;/* Check the parameters */assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode));assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger));assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line));  assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd));tmp = (uint32_t)EXTI_BASE;if (EXTI_InitStruct->EXTI_LineCmd != DISABLE){/* Clear EXTI line configuration */EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;tmp += EXTI_InitStruct->EXTI_Mode;*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;/* Clear Rising Falling edge configuration */EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line;EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;/* Select the trigger for the selected external interrupts */if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling){/* Rising Falling edge */EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;}else{tmp = (uint32_t)EXTI_BASE;tmp += EXTI_InitStruct->EXTI_Trigger;*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;}}else{tmp += EXTI_InitStruct->EXTI_Mode;/* Disable the selected external lines */*(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;}
}

完整应用程序

有个分组信息,分一次就行,写在主函数里

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //放在main.c初始化函数中只调用一次就行
void EXTIX_Init(void)
{                                          GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);        //开启IO口复用时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3); //IO口与中断线映射关系GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3 ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line3;                  //GPIOx.3【中断屏蔽寄存器】EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //中断模式【中断屏蔽寄存器/事件屏蔽寄存器】EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //触发方式下降沿【上升/下降沿/软中断触发寄存器】EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //使能【中断屏蔽寄存器】EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void EXTI3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生 {EXTI_ClearITPendingBit(EXTI_Line3);   //清除 LINE 上的中断标志位}
}

3.STM32 EXTI CubeMX

4.STM32 EXTI 寄存器

参考【STM32F10XXX参考手册】

中断屏蔽寄存器(EXTI_IMR)

interrupt mask register

事件屏蔽寄存器(EXTI_EMR)

event mask register

上升沿触发选择寄存器(EXTI_RTSR)

Rising edge trigger select register

下降沿触发选择寄存器(EXTI_FTSR)

Falling edge trigger select register

软件中断事件寄存器(EXTI_SWIER)

Software Interrupt Event Register

挂起寄存器(EXTI_PR)

pending register

【嵌入式STM32-05】STM32 外部中断 EXTI 基本原理|库函数程序代码|寄存器相关推荐

  1. STM32F103标准库开发:外部中断(EXTI)实验

    STM32F103标准库开发----目录 STM32F103标准库开发----外部中断(EXTI)实验----程序源码 本文章技术信息均出自:STM32F103系列超详细参考手册-中文版 一.外部中断 ...

  2. 单片机中段程序_单片机外部中断详解及程序

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...

  3. 蓝桥杯嵌入式学习STM32之外部中断EXTI详解

    先说点题外话. !是取逻辑反的意思, ~是按位取反的意思 !0x01=0: ~0x01=1111 1110; 进入正题 基本概念 STM32的每个IO都可以作为外部中断输入. STM32的中断控制器支 ...

  4. STM32震动感应控制继电器(使用循环VS使用外部中断EXTI和中断控制器NVIC)

    参考:stm32的外部中断 震动感应 控制 继电器 作者:点灯小哥 发布时间: 2021-03-05 22:37:01 网址:https://blog.csdn.net/weixin_46016743 ...

  5. STM32学习:外部中断

    文章目录 一.STM32外部中断 1.基本知识 2.中断设计流程 二.硬件配置 1.proteus仿真电路搭建 2.CubeMX硬件配置 3.配置中断 1.寻找中断虚函数 2.中断回调函数编写 3.p ...

  6. STM32使能/屏蔽外部中断

    EXTI->IMR |= EXTI_Line14; //使能外部中断14 EXTI->IMR &= ~(EXTI_Line14); //屏蔽外部中断14 中断屏蔽寄存器EXTI-& ...

  7. STM32F1笔记(五)外部中断EXTI

    STM32的每个IO都可以作为外部中断的中断输入口. STM32F103的中断控制器支持19个外部中断/事件请求.每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置. STM32F103的19 ...

  8. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  9. 外部中断器1C语言程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 * 名称:外部中断 * 日期:2013-9-10 * 晶振:11.0592MHZ ************************************ ...

最新文章

  1. pandas使用pd.concat纵向合并多个dataframe实战:多个dataframe的纵向合并、为纵向合并的多个dataframe设置标识符指定数据来源
  2. Keepalived+lvs+httpd之负载均衡
  3. 一周图趣(2019.01.07-2019.01.13)
  4. 【聊透SpringMVC】自学java和三大框架要多久
  5. awk rand函数问题
  6. ansys怎么批量输入点坐标_当SpaceClaim 遇上ANSYS (二)
  7. Shell break和continue命令
  8. hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程
  9. 软件发布版本命名规则
  10. 冲上热搜!快手宣布取消大小周
  11. 金山云肖江:5G+AIoT为智慧社区建设插上翅膀
  12. java无框架开发,DON: java 小型web项目快速开发框架,实现无配置,直接关注业务开发.主要解决请求分发解析...
  13. 过去的一年,2013!
  14. 科学绘图与数据分析软件SigmaPlot
  15. [信息论与编码] 03. 离散信源、信源熵、联合熵、条件熵
  16. 山西最新五大姓氏排名发布,排名第一的是王,第二的竟是……
  17. 外汇兑换人民币业务的居民
  18. 喵 ~ 小程序搭建记录
  19. redis设置密码并修改查看的几种方式
  20. 会计学(非专业)第7章 固定资产

热门文章

  1. 机器人定位技术 激光SLAM与视觉SLAM谁更胜一筹?
  2. 数据治理与ETL流程关系
  3. python 集合的差集、并集、交集
  4. Linux磁盘管理、软件包管理、定时任务
  5. java资源池的实现
  6. lcm in qcom
  7. 山寨货把正品吊起来打,云霄假烟有多牛逼?
  8. 【Appium+Python】进行手机操作的方法+使用手机物理键
  9. vant输入表单右侧加单位
  10. STM32嵌入式开发常用词汇词组及缩写汇总