-
2021-11-27 08:24:01
STC15系列单片机最多有4个外部中断,有时还是觉得不够用, 如我们用它做自动机的限位保护时就需要多个中断.例如点胶机三轴限位就要6个中断.加上点胶阀操控,上料控制共十几个也不算多。外部中断扩展大致有以下几种方法:
1. 使用专用芯片,如8259A。
2. 将内部定时/计数器做计数器使用,设置使其当计数值为1时即触发中断,就可当外部中断用.
3. 用2的方法可将3路CCP/PCA当成外部中断使用。
4. 外部中断端口二极管并接输入再加软件查询定位输入源法。由于这种方法占用资源比较少,本人比较喜欢使用,下面用一个实例来简单介绍一下。
原理图如下:
4 个I/O口外加一片CD4051与8只1开关二极管将INT0由一个扩展为八个。
软件实现:首选使能中断及INT0中断,将INT0设置成下降沿触发中断,在中断函数中写出扫描触发中断源的代码,对不同的中断源,写出相应的响应代码。注意:方法4的实时性相对较差,因为输入源扫描,需要一些时间,要求高时,因谨慎选用。
更多相关内容 -
STM32F030 IO口外部中断应用
2020-07-26 00:42:12下面是一个STM32F030 IO口外部中断应用程序,感兴趣的朋友可以看看。 -
51单片机外部中断触发方式
2021-01-19 18:16:53也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要 -
第67节:利用外部中断实现模拟串口数据的收发
2020-07-27 18:24:03从业十年的工程师为大家总结了关于单片机入门的知识,这节主要介绍了利用外部中断实现模拟串口数据的收发。 -
51单片机外部中断编程实例
2020-07-18 15:41:4751单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;下面一起来学习一下 -
基于Proteus仿真51单片机外部中断实验
2020-06-23 20:13:05已知单片机的 P0 口接了一位七段数码管,当无外部中断(外部中断 0)时,数码 管按 a~g 段依次点亮,不断循环显示;当有外部中断(按钮被按下,P3.2 有下降沿电 压)时,数码管显示状态改为“8”亮灭闪烁显示,亮灭... -
STM32f10x 外部中断及中断分组
2021-01-20 11:04:39STM32 的每个 IO 都可以作为外部中断的中断输入口,STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的 19 个外部中断为: 线 0~15:对应... -
STM8S003单片机外部中断实验
2019-08-22 14:28:29STM8S003单片机上,用按键口做为外部中断触发,实现按键按下LED指示灯翻转效果。 -
实验二 外部中断 .pdf
2020-12-18 18:11:38中山大学_微机实验 -
Arduino笔记-外部中断实验(震动传感器实时亮灯)
2021-01-20 11:05:26外部中断:达到实时响应处理事件的效果。 目前Ardinuo UNO引脚只有2个,一个是2号口,一个是3号口 在Ardinuo中中断函数,返回值为空,不能有参数 程序运行截图如下: 当感应到震动后: 这里来看下震动传感器 这里... -
外部中断概述
2021-05-15 12:20:15STM32的每个IO都可以作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 每个外部...STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发)以及使能,触发/屏蔽,专用的状态位。
从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),STM32F103RCT6(51),那么中断线怎么跟io口对应呢?
以STM32F103ZET6(112)为例,它有七组端口,每组16个GPIO口,那么
GPIOx.0映射到EXTI0
GPIOx.1映射到EXTI1
…
GPIOx.15映射到EXTI15是不是16个中断线就可以分配16个中断服务函数呢?
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数
外部中断线10~15分配一个中断向量,共用一个中断服务函数。
中断服务函数“名”可在启动文件中查找外部中断常用库函数
①void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//设置IO口与中断线的映射关系exp: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线:触发方式等typedef struct { uint32_t EXTI_Line; //指定要配置的中断线 EXTIMode_TypeDef EXTI_Mode; //模式:事件 OR中断 EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发 FunctionalState EXTI_LineCmd; //使能 OR失能 }EXTI_InitTypeDef; EXTI_InitStructure.EXTI_Line=EXTI_Line2; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);
③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位外部中断的一般配置步骤:
1.初始化IO口为“输入”。
GPIO_Init();2.开启IO口复用时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);3.设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();4.初始化线上中断,设置触发条件等。
EXTI_Init();5.配置中断分组(NVIC)。
NVIC_Init();6.编写中断服务函数。
EXTIx_IRQHandler();7.清除中断标志位
EXTI_ClearITPendingBit();stm32按键硬件连接
PA0 下拉输入
PC5 上拉输入
PA15 上拉输入 -
STM32之外部中断[概念篇]
2021-04-17 20:00:08目录一、中断和异常二、NVIC和EXTI1、嵌套向量中断控制器(NVIC)2、外部中断/事件控制器(EXTI)3、区别三、NVIC寄存器和EXTI寄存器1、NVIC中的寄存器四、中断向量表 一、中断和异常 1、中断——当需要出现时,CPU暂时...中断是STM32中很重要的一个概念,如果想要单片机效率更高,就要摆脱查询式,用中断式来提高它的运行效率。今天讲的外部中断,就是GPIO口和4个特定中断/事件外设,由于中断比较复杂,就先讲概念,下一篇讲具体的实验代码。
一、中断和异常
1、中断——当需要出现时,CPU暂时停止当前程序的执行,转而执行处理新情况的程序和执行过程。
2、异常——处理器要复位,不可屏蔽中断,存储故障,这些由内核产生的就叫做异常,也就是硬件异常。- 注:两者区别就是,中断一般发生与外部,异常发生于内部。
- 中断源三个来源:1、IO口;2、片上外设;3、内核。
二、NVIC和EXTI
1、嵌套向量中断控制器(NVIC)
可以看到,NVIC是属于Cortex-M3的,不可屏蔽中断和外部中断都由它处理,它的作用如下:- 可嵌套中断支持
- 向量中断支持
- 动态优先级调整支持
- 中断延迟大大缩短
- 中断可屏蔽
NVIC可管理240个中断,15个异常
2、外部中断/事件控制器(EXTI)
EXTI是属于STM32的,功能如下:
- 每个中断/事件都有独立的触发和屏蔽
- 每个中断线都有专用的状态位
- 支持多达20个软件的中断/事件请求
- 检测脉冲宽度低于APB2时钟宽度的外部信号。
管理STM32的16个IO口(占用 EXTI0至 EXTI15),以及片上的4个外设PVD输出,RTC闹钟事件,USB唤醒事件、以太网唤醒事件(按顺序占用EXTI16,EXTI17,EXTI18,EXTI19)
注意:以太网唤醒事件只适用于互联型。(1)中断和事件的区别
- 中断:需要CPU参与,需要软件的中断服务函数才能完成中断后产生的结果
- 事件:靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果
(2)中断触发流程
1、输入线输入一个信号(中断)
2、进行边沿检测(上升沿或下降沿触发)
3、或门进入中断挂起请求寄存器
4、若打开了中断屏蔽寄存器,与门输出到NVIC中断检测电路(3)事件触发流程
1、输入线输入一个信号(事件)
2、进行边沿检测(上升沿或下降沿触发)
3、若打开了事件屏蔽寄存器,与门输出一个1到脉冲发生器,产生一个脉冲,供其他外设使用。3、中断/事件线的映像
通过相应寄存器,可以配置16个IO口具体哪一个为EXTI中断源,每一个中断线上只能映像一个IO口,比如,你映像了PA0,那PB0~PG0不能再作为中断源。4、向量表
ST公司以M3为内核,制造了STM32单片机,制造过程中对支持的中断进行了裁剪,所以STM32只能支持60个中断,15个异常,如下,就是STM32公司支持的中断和异常,叫中断向量表,灰色部分就是15个异常,剩下的就是60个中断。
三、中断的优先级及分组
1、中断优先级
中断很多,如果同时有多个中断发生,该怎么办?这里讲一下优先级。
- 优先级:一种约定,优先级高的先做,优先级低的后做
- 优先级分为主优先级和次优先级
- 数字越小优先级越高
- 由名字可以知道,两个中断先比较主优先级,再比较次优先级
我们通过不同优先级例子来掌握什么是优先级。
1、假如有两个中断A,B同时到达:
先比较主优先级:A的主优先级高于B的主优先级,那么先执行中断A。
先比较主优先级:A,B主优先级一样,再比较次优先级:A的次优先级高,先执行中断A
先比价主优先级:A,B主优先级一样,再比较次优先级:A,B次优先级一样,这时候,就根据向量表中的位置,谁的中断号小就先执行谁。2、假如有两个中断B先到,A后到:
B先来先执行B,执行到一半,A来了,A的主优先级比B的高,B暂时挂起,等待A执行完才能继续执行B,这就是主优先级的嵌套。
B先来先执行B,执行到一半,A来了,A,B的主优先级一样,这时候,尽管A的次优先级高,但此刻不能进行嵌套,只能等B执行完才能执行A。
总结:主优先级可以嵌套,次优先级不能嵌套。2、中断优先级分组
优先级分组就是最多能设置的优先级个数
- 组0:4位设置次优先级,能设置16种次优先级(0-15)
- 组1:1位设置主优先级,3位设置次优先级,能设置2种主优先级(0-1)8种次优先级(0~7)
- 组2:2位设置主优先级,2位设置次优先级,能设置4种主优先级(0-3)4种次优先级(0-3)
- 组3:3位设置主优先级,1位设置次优先级,能设置4种主优先级(0-7)4种次优先级(0-2)
- 组4:4位设置主优先级,能设置16种主优先级(0-15)
四、NVIC寄存器组和EXTI寄存器
这里只讲需要手动设置的寄存器,想了解更多,请在Cortex-M3权威指南第八章查看。
1、NVIC寄存器组
(1)NVIC_ISER(中断使能寄存器组)
这个寄存器组是中断使能寄存器组:
ISER0使能0~31号中断
ISER1使能32~63号中断
ISER2使能64~95号中断
ISER3使能96~127号中断
ISER4使能128~159号中断
ISER5使能160~191号中断
ISER6使能192~223号中断
ISER7使能224~239号中断
这个寄存器每一位管理一个中断,但是由于STM32是经过裁剪的,只有60个中断,所以这个寄存器组我们只用前两个 ISER0 和 ISER1。(2)NVIC_IP(中断优先级控制的寄存器组)
这个寄存器用来设置优先级,每个寄存器只有8位,管理一个中断的优先级,那么有240中断你,就有240个PRI寄存器。因为大多数芯片采用的是小端存储,为了不同芯片代码移植方便,所以规定这个8位寄存器高四位设置优先级,低四位保留不用。
因为一个寄存器只有8位,为了统一,四个8位PRI寄存器凑成一个32位寄存器IP,如下图:
我们可以知道:- NVIC_IP0设置0~3号中断优先级
- NVIC_IP1设置4~7号中断优先级
- …
- NVIC_IP59设置236~239号中断优先级
按这样,240个寄存器,4个4个组合起来,IP寄存器就变成了60个32位寄存器。
STM32只有60个中断,我们只使用IP0~IP14(3)NVIC_AIRCR(应用程序中断及复位控制寄存器)
这个寄存器就是用来设置分组的寄存器,8~10位用来设置分组。
设置分组时,必须把钥匙写进去,不然不能进行写操作。比如:NVIC_AIRCR|=0X05FA0500; //写入钥匙和分组2
2、EXTI寄存器
(1)EXTI_IMR(中断屏蔽寄存器)
这个寄存器就是用来开放来自线x的中断请求。(2)EXTI_RTSR(上升沿触发选择寄存器)
输入信号为上升沿时有效(3)EXTI_FTSR (下降沿触发选择寄存器)
输入信号为下降沿时有效(4)EXTI_PR(挂起寄存器)
挂起寄存器,对应位为1,说明有中断触发请求,对应位写1可以清除状态,否则会反复进入中断服务函数。五、外部中断配置寄存器 1~4
这些寄存器就是配置输入线映射的寄存器,总共有四个。
如上- 向[3:0]位写入0001,说明中断/事件线0上,选择PB0为外部中断输入源
- 向[7:4]位写入0001,说明中断/事件线1上,选择PB1为外部中断输入源
可以看到,选择几号引脚,就对应几号中断线。
AFIO_EXTICR1(外部中断配置寄存器1 ),管理0—3号中断线
AFIO_EXTICR2(外部中断配置寄存器2 ),管理4—7号中断线
AFIO_EXTICR3(外部中断配置寄存器3 ),管理8—11号中断线
AFIO_EXTICR4(外部中断配置寄存器4 ),管理12—15号中断线。
六、总结
1、关于外部中断配置步骤
- 1、开启复用时钟,设置映射关系(选择具体IO口引脚为中断输入源)
- 2、开放来自线x的中断请求
- 3、设置触发条件(上升沿、下降沿)
- 4、分配中断向量控制器(分组和设置优先级并使能)
- 5、编写中断服务函数(编写中断要处理的事情)
2、涉及寄存器总结
- 1、RCC_APB2ENR
开启复用时钟 - 2、AFIO_EXTICR1~4
选择中断输入源 - 3、EXTI_IMR
开放中断请求 - 4、EXTI_RTSR和EXTI_FTSR
选择触发条件 - 5、NVIC_AIRCR
设置分组 - 6、NVIC_ISER0~1
使能具体中断 - 7、NVIC_IP0~14
设置优先级 - 8、EXTI_PR
清除中断标志
-
AT89S51多外部中断源系统设计
2021-01-19 18:26:47把其中别的中断请求源IR0直接接到AT89S51的一个外部中断请求源IR0输入端INT0,其余的4个中断请求源IR1~IR4按下图所示的方法通过各自的OC门(集电极开路门)连到AT89S51的另一个外中断源输入端INT1,同时还连到P1口... -
外部中断----脉冲计数实验
2013-11-16 12:33:52每中断一次,发光二极管依次从左向右点亮,中断8次后,程序结束。 -
【STM32F103实验(五)】外部中断
2022-04-14 19:06:21STM32的每一个IO口都可以作为外部中断的中断输入口。STM32F103的中断控制器支持19个外部中断/事情请求。每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为: 线0~15 ...一、STM32外部中断介绍
STM32的每一个IO口都可以作为外部中断的中断输入口。STM32F103的中断控制器支持19个外部中断/事情请求。每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为:
线0~15 对应外部IO口的输入中断 线16 连接到PVD输出 线17 连接到RTC闹钟事件 线18 连接到USB唤醒事件 其中,STM32供IO口使用的中断线只有16个。STM32如何把16个中断线和IO口一一对应起来呢?STM32是这样设计的,GPIO的管脚GPIOx.0~GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0~15,如此一来,每个中断线对应了最多7个IO口。举个例子说明,GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0对应中断线0。每个中断线上每次只能连接在1个IO口上,这样就需要通过配置来决定对应中断线配置到哪个GPIO上了。如下是GPIO和中断线的映射关系图:
二、实验要求
按下按键KEY1,采用外部中断方式控制LED1状态的翻转。
三、程序
1. IO口外部中断初始化步骤
(1)初始化IO口为输入;
(2)开启AFIO时钟;
(3)设置IO口与中断线的映射关系;
(4)初始化线上中断,设置触发条件等;
(5)配置中断分组(NVIC),并使能中断;
(6)编写中断服务函数。
void exit_init(void) { EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; key_init(); //按键初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //复用AFIO时钟使能 /****************GPIOE.3与中断线3进行映射***************/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3); //KEY1-PE3,设置PE3和中断线3的映射 /*********************初始化中断线上中断**********************/ EXTI_InitStruct.EXTI_Line = EXTI_Line3; //中断线3 EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_Init(&EXTI_InitStruct); /*********************配置中断分组***********************/ NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY1外部中断通道3 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //子优先级2 NVIC_Init(&NVIC_InitStruct); } void EXTI3_IRQHandler(void) //外部中断3服务函数 { delay_ms(10); //消抖 if(KEY1 == 0) { LED1 = !LED1; } EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位 }
2. 主函数int main(void) { exit_init(); LED_init(); delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2 while(1); }
-
STM32 外部中断简介
2020-08-11 08:13:53STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。 -
8259外部中断(非级联方式).pdsprj
2020-07-11 15:59:50利用8086控制8259可编程中断控制器,实现对外部中断的响应和处理。要求程序中每次中断进行计数,并将技术结果用8255的PA口输出到发光二极管显示。 -
51外部中断1电平触发
2018-03-17 12:25:4851单片机实现外部中断1电平触发 /*----------------------------------------------- 名称:外部中断0电平触发 论坛:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:通过中断接口P3.2连接的独立... -
AT89C51单片机外部中断
2020-11-27 22:12:30C51单片机外部中断调用P3_2 ,P3_3口。 中断方式有两种,分别为电平方式和脉冲方式。 中断请求有0和1。中断总允许为EA=1, IE0:外部中断请求0标志位; IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平... -
51单片机外部中断的两种触发方式资料下载
2021-07-07 11:23:55也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平... -
基于STM32F13ZET6实现外部中断
2021-01-06 12:48:35和往常一样,我会提供完成项目同时,提供小编在实践时的情况以及自己认为更好的算法...STM32的开发板IO口都可以作为中断输入引脚,但是中断线只有16根,所以在选择时有一些局限:开发板的IO有GPIOA,B,C,D,E,F,G;每种IO -
外部中断测脉冲个数
2021-05-21 07:56:591.外部中断的常用功能外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。比如P2.3引脚产生这样的电平无规律... -
51单片机外部中断流水灯(汇编语言)
2018-06-13 20:07:16设计一个外部中断触发流水灯系统:当外部中断来临时,启动流水灯,即从P2口的LED循环点亮。可以从protues中看到结果 -
DSP2812 XINT外部中断完整工程代码
2018-10-16 16:29:53DSP2812 XINT外部中断完整工程代码 XINT外部中断 完美实现 -
stm8 外部中断 源代码
2020-03-20 22:09:23stm8 外部中断 程序源代码 只需要改一下对应的io口数字就可以使用,适合学习如何编写外部中断程序。 -
STM32_外部中断之按键控制点亮LED灯
2021-01-20 00:59:54初始化作为外部中断源的GPIO口。和普通的GPIO的设置类似,不过由于是使用GPIO引脚作为中断源,所以还需要开启复用时钟。 2..配置中断控制器 NVIC。由于有很多的中断,所以STM32用NVIC来控制操作各种中断。配置NVIC... -
实验4,外部中断与定时器综合实验
2018-05-17 10:23:0151单片机交通灯实验,救护车到来时由外部中断实现,下降沿触发, -
stc89c52的中断系统系列之——外部中断
2020-01-17 23:17:13使用外部中断实现使用独立按键控制led的亮灭 一、需求分析 1、三个关键词 外部中断 独立按键 led亮灭 2、要实现一个中断系统如何做? 初始化外部中断系统INT0/INT1 void init() { EA=1; IT0=1; EX0=1; ... -
嵌入式系统/ARM技术中的自学Cortex-M3(3):外部中断0
2020-10-22 21:52:00LPC1768微处理器包括4个外部中断,分别是EINT0、EINT1、EINT2、EINT3对应的引脚分别是P2.10~P2.13,这几个引脚也可以作为通用IO口使用。名个外部中断可以设置成低电平/高电平或上升沿/下降沿有效,它们还有一个功能... -
AT89C51单片机外部中断使用和使用74LS373控制I/O口
2020-05-05 17:08:22利用单片机 AT89C51 的外部中断 0 和中断 1, I/O 口,对 LED 和数码管分别进行控制。以实现按键 K0 时 LED 灯亮灭闪烁,按键 K1 时做 LED 左和右流水运动。无按键操作时偶数位数码管显示 0-F。 使用74LS373可以...