外部中断|学习笔记

开发者学堂课程【嵌入式之RFID开发与应用2020版外部中断】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/665/detail/11154

外部中断

内容介绍:

一·为什么要用中断?

二·进入同一个函数怎么办?

上节课我们通过GPIO口的输入实现按键时出现一些问题,有同学吐槽按键太落后,当然重点并不在此,重点是学习IO口的数据怎么读取、写入。想让程序变得更优秀最好用中断完成。

一·为什么要用中断?

首先,因为IO口何时变成低电频不能确定,在之前的电路里PA0输出一个0,要想按键让PA1也从1变成0。

外部中断|学习笔记

按键事件(鼠标)都是异步事件,你不知道它何时操作,所以要不停的判断它有没有等于低电频,通过外循环就可以完成这件事情。 

While(1){

If(GPIO_ReadInputDataNit(GPIOA,GPIO_Pin_1) == 0){

LED_XXX_ON();

BEEP_XXX_ON();

Delay_ms(300);

}else{

LED_XXX_OFF();

BEEP_XXX_OFF();

Delay_ms(300);

}

比如可以做别的事但不能低于100毫秒。因为低于100毫秒就会漏掉很多按键,所以才需要用中断。

中断的意义是不需要在这里不断的去提问,只要一产生中断就会有一个回调函数(把中断理解成回调),函数就会自动被执行,这样就不用时刻去判断IO口的状态。

*stm32最多有68个可屏蔽中断通道,16个外部中断线,7个外部中断入口地址

中断是处理异步事件非常有效的手段,对于stm32来说,它有非常多的中断(最多68个)说的并不完全,68个可屏蔽中断通道是从位置开始计算的。

外部中断|学习笔记

但这指的是互联型(其实就是互联增强型)芯片,就是所谓的F105、107,我们现在使用103基本型是中容量、小容量,实际终端的个数是有0到59(60)。

外部中断|学习笔记

那分别有哪些中断?有这些窗口、电源检测、入侵检测,RTC、 FIASH、RCC、外部中断、看总线等等,但在用户可操作中断入口之前还有一堆中断,学过嵌入式的了解过应该都清楚,在51单片机里统一把它叫中断,但在arm处理器里就把前面这一部分叫异常,后部分叫中断。

异常是所谓的非正常事件,比如复位、硬件失效、访问的某个存储器或某个代码段不存在、执行的SWI中断指令、监控调试等等都是异常是更大的范围,其实中断严格意义上讲是异常的一种情况,所以就不展开讨论异常了,只看中断,而且着重讨论外部中断EXTI0、1、2、3、4。

所以68个指的是互联互通型,它有16个外部中断线,7个外部中断入口地址。中断线其实就是外部中断线0到4,5到9,10到15外部中断线有16个。

外部中断|学习笔记

可以同时设置16个中断,但却只能对应7个函数,这就有中断的一些共用。比如0到4每一个中断就独享一个中断函数。但到后面,比如5到9进入的是同一个函数,10到15同理。

二·进入同一个函数怎么办?

要在同一个函数里通过判断中断标志位,具体去确定它到底是第几个,需要再一次判断,要提醒的是后面都会有一个表,

就是这16个终端线,每一组16个(GPIOA0到A15)刚好对应外部中断0到15。

外部中断还有另外一些特殊的中断线,因为讨论的是基本型,这个就暂时不去看了。刚好就对应着16个IO,但是每个终端线对应假设有多种,也是根据不同的芯片

比如对于103来说根本就没有到ABCDEFG这么多,它没有这么多管角,所以A0 、B0 、C0只能选一个,一定要注意,不能同时选,如果同时选最后就分不出是哪个主的哪个引脚被触发了。

Pin-0对应的是一个EXTI0,所有的端口的1就对应着中断线1,依此类推,到所有IO可能第15个对应中断线的第15个。

*所有端口的Pin O对应着EXTIO中断线,所有端口的Pin_1对应着EXTI1中断线,依次类推

*同一外部中断线同时只能映射一个IO,即PAO- PGO只能有一个引脚映射到EXTIO上面

在这个映射时,同一个外部中断线只映射一个IO,应该说是A到G的其中一个。而且每个终端线它们是相互独立的,可以对每个终端线所对应的外部中断单独设置它的触发方式,是上线触发,下线触发还是双线触发。

这就是刚刚讲的中断线又可以单独为A0配置为上升演出,为1终端线配置为下降演出,为2终端线配置为双演出,互相不影响。

*各个中断线之间相互独立,可以单独配置它的触发方式(上升沿、下降沿、双边沿)等

*优先级配置cortex-M提供了8位,但STM32只使用了4位,即最多16个可编程的中断优先级

除了外部中断的中断线,它对应的七个入口地址,默认情况下,其实就是中断函数的名称。

外部16个中断线对应的7个中断入口:

EXTI0_ IRQHandlek

EXTI1 _IRQHandler

EXTI2 _IRQHandler

EXTI3_ IRQHandler

EXTI4 _IRQHandler

EXTI5_ 9_ IRQHandler

EXTI10 _15_ IRQHandler

在这个代码里面,因为完整的中断服务函数不能修改,它放到了启动文件里面,可以去搜索一下。

这个中段就是属于异常的一种,当事件发生就会自动去调用函数。那用户要做的把函数复制到程序里,

比如把它放在这里,然后在这里写上程序,

一旦终端线0的终端被触发,函数自动被执行,

EXTIO_IRQHandler()

{

LED_XXX_OFF();

BEEP_XXX_OFF();

Delay_ms(300);

}

这里讲的外部中断就是一个填充的过程,把它的接口填好、申请好,就可以正常工作了。