【嵌入式STM32-05】STM32 外部中断 EXTI 基本原理|库函数程序代码|寄存器
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 基本原理|库函数程序代码|寄存器相关推荐
- STM32F103标准库开发:外部中断(EXTI)实验
STM32F103标准库开发----目录 STM32F103标准库开发----外部中断(EXTI)实验----程序源码 本文章技术信息均出自:STM32F103系列超详细参考手册-中文版 一.外部中断 ...
- 单片机中段程序_单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...
- 蓝桥杯嵌入式学习STM32之外部中断EXTI详解
先说点题外话. !是取逻辑反的意思, ~是按位取反的意思 !0x01=0: ~0x01=1111 1110; 进入正题 基本概念 STM32的每个IO都可以作为外部中断输入. STM32的中断控制器支 ...
- STM32震动感应控制继电器(使用循环VS使用外部中断EXTI和中断控制器NVIC)
参考:stm32的外部中断 震动感应 控制 继电器 作者:点灯小哥 发布时间: 2021-03-05 22:37:01 网址:https://blog.csdn.net/weixin_46016743 ...
- STM32学习:外部中断
文章目录 一.STM32外部中断 1.基本知识 2.中断设计流程 二.硬件配置 1.proteus仿真电路搭建 2.CubeMX硬件配置 3.配置中断 1.寻找中断虚函数 2.中断回调函数编写 3.p ...
- STM32使能/屏蔽外部中断
EXTI->IMR |= EXTI_Line14; //使能外部中断14 EXTI->IMR &= ~(EXTI_Line14); //屏蔽外部中断14 中断屏蔽寄存器EXTI-& ...
- STM32F1笔记(五)外部中断EXTI
STM32的每个IO都可以作为外部中断的中断输入口. STM32F103的中断控制器支持19个外部中断/事件请求.每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置. STM32F103的19 ...
- 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理
中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...
- 外部中断器1C语言程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 * 名称:外部中断 * 日期:2013-9-10 * 晶振:11.0592MHZ ************************************ ...
最新文章
- pandas使用pd.concat纵向合并多个dataframe实战:多个dataframe的纵向合并、为纵向合并的多个dataframe设置标识符指定数据来源
- Keepalived+lvs+httpd之负载均衡
- 一周图趣(2019.01.07-2019.01.13)
- 【聊透SpringMVC】自学java和三大框架要多久
- awk rand函数问题
- ansys怎么批量输入点坐标_当SpaceClaim 遇上ANSYS (二)
- Shell break和continue命令
- hadoop hive集群_基于伪分布式Hadoop搭建Hive平台详细教程
- 软件发布版本命名规则
- 冲上热搜!快手宣布取消大小周
- 金山云肖江:5G+AIoT为智慧社区建设插上翅膀
- java无框架开发,DON: java 小型web项目快速开发框架,实现无配置,直接关注业务开发.主要解决请求分发解析...
- 过去的一年,2013!
- 科学绘图与数据分析软件SigmaPlot
- [信息论与编码] 03. 离散信源、信源熵、联合熵、条件熵
- 山西最新五大姓氏排名发布,排名第一的是王,第二的竟是……
- 外汇兑换人民币业务的居民
- 喵 ~ 小程序搭建记录
- redis设置密码并修改查看的几种方式
- 会计学(非专业)第7章 固定资产