05STM32EXIT外部中断&中断系统


对射红外传感器计次 旋转编码器计次

中断系统

在这里插入图片描述

中断触发条件:

对外部中断来说,可以是引脚发生了电平跳变
对定时器来说,可以是定时的时间到了
对串口通信来说,可以是接收到了数据
当这些事件发生时,情况比较紧急,比如外部中断来了,如果不处理,下一个跳变信号就跟着过来了。
比如串口接收中断来了,如果不读取接收到的数据,那下一个数据再过来,就会把原来的数据覆盖掉。
所以希望当中断条件满足时,CPU能够立即停下当前执行的程序,转而去处理中断事件的程序。

中断处理流程和用途:

比如外部中断来了,需要计次,那就变量++;串口中断来了就把接收到的数据转存起来;处理完紧急事情后,CPU回到原来程序运行的位置。
使用中断系统,能极大地提高程序的效率,如果没有中断系统,为了防止外部中断被忽略或者串口数据被覆盖,那主程序就只能不断地查询是否有这些事件发生,不能在干其他的事情。
如果没有定时器中断,那主函数就只有靠Delay函数,才能实现定时的功能。有了中断系统之后,主程序就可以放心执行其他事情,有中断的时候再去处理。大大提升效率。

中断优先级是根据程序设计的需求,自己设置的。紧急的事情优先级要设置地高一点,这样可以更好地安排中断事件,防止紧急的事件被别的中断耽误。

中断嵌套也是为了照顾非常紧急的中断的,能否进行中断嵌套,由中断优先级来决定。

在这里插入图片描述
中断来了,主程序都得立即暂停,程序由硬件电路自动跳转到中断程序中。
中断执行前,进行现场保护
中断执行后,会再还原现场。保证主程序即使被中断了,回来后也能继续运行。
用C语言编程,保护现场和还原现场并不需要我们操作(操作系统里面有中断的概念),由编译器做好。

C语言程序中中断的执行流程:
一般中断程序都是在一个子函数里面,这个函数不需要我们调用,当中断来临时,由硬件自动调用这个函数。

STM32中断

在这里插入图片描述
中断通道就是中断源的意思,68个是F1系列最多的中断数量,对于一个具体的型号来说,可能没有这么多中断,所以这个数量看看就行,具体以对应型号的数据手册为准。
STM32的中断非常多,几乎所有模块都能申请中断,

NVIC就是STM32中用来管理中断,分配优先级的。

在这里插入图片描述
灰色的部分是内核的中断,
1.Reset复位中断 当产生复位事件时,程序就会自动执行复位中断函数,也就是复位后程序开始执行的位置
2.后面的各种灰色的中断都是内核里面的,一般比较高深,看上去也难理解,但是这些中断我们一般用不到,所以了解一下即可

不是灰色的部分的:就是STM32外设的中断了。
比如:
WWDG 窗口看门狗,用来监测程序运行状态的中断,比如程序卡死了,没有及时喂狗,窗口看门狗就会申请中断,程序就会调到窗口看门狗的中断程序里,在中断程序里就可以进行一些错误检查,看看出现什么问题了。
PVD 电源电压监测,如果供电电压不足,PVD电路就会申请中断,在中断里就知道,现在供电不足,是不是电池没电了,要赶紧保存一下重要数据。
TAMPER 外设电路检测到异常或者什么事件,需要提示CPU的时候,就可以申请中断,让程序调到对应的中断函数里运行,用来处理异常或事件
EXTI0-EXTI4,EXTI9_5-EXTI15_10就是本节外部中断对应的中断资源。

中断的地址的作用:因为程序中的中断函数,它的地址由编译器分配的,是不固定的。但是中断的跳转,由于硬件限制,只能跳转到固定的地址执行程序,所以为了能让硬件跳转到一个不固定的中断函数里面,就需要在内存中定义一个地址的列表。这个列表地址固定,中断发生后,就跳到这个固定位置。然后有编译器再加上一条跳转到中断函数的代码,这样中断函数就可以跳转到任意位置了。
中断地址的列表:叫做中断向量表,相当于中断跳转的一个跳板。(不过C语言编程不需要管这个中断向量表,因为编译器帮我们做好了)

在这里插入图片描述
在这里插入图片描述

NVIC嵌套中断向量控制器基本结构

NVIC基本结构

在这里插入图片描述
在STM32中,NVIC用来统一分配中断优先级和管理中断的,NVIC是一个内核外设,是CPU的小助手。
STM32中断非常多,如果把中断都接到CPU上,那么CPU得引出很多线进行适配,设计上就很麻烦,并且很多中断同时申请,或者中断很多产生了拥堵,CPU就很难处理,毕竟CPU主要用来做运算的。所以中断分配的任务就放到别的地方。所以NVIC就出现了。
NVIC有很多输入口,有多少个中断线路,都可以接过来。(这里斜杠上写个n,意思是一个外设可能会同时占用多个中断通道,所以有n条线),NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,通过一个出口告诉CPU该处理哪个中断,对于中断先后顺序分配的任务,CPU不需要知道

NVIC优先级分组

在这里插入图片描述
所以STM32中不存在先来后到的排队规则,抢占优先级>相应优先级>中断号排队

分组方式在程序中是我们来自己选择的,选好分组方式后,配置优先级时,要注意抢占优先级和响应优先级的取值范围,不要超出表中规定的取值范围。

EXTI简介

在这里插入图片描述
简单来说就是引脚电平变化,申请中断
上升沿:电平从低电平变到高电平的瞬间触发中断
下降沿:电平从高电平变到低电平的瞬间触发中断
双边沿:上升沿和下降沿都可以触发中断
软件触发:引脚啥事没有,程序里执行依据代码,就能触发中断

任意的GPIO口都可以当做外部中断的引脚,相同PIN不能同时触发意味着PA0和PB0这种GPIO_Pin一样的不能同时用,只能选一个。如果有多个中断引脚,要选择不同的Pin的引脚。
通道数16个GPIO_Pin 对应着GPIO_Pin0-15,加上外加的总共20个中断线路,16个GPIO_Pin是外部中断的主要功能,跟着的4个是来蹭网的。
蹭网原因:外部中断有一个功能:从低功耗模式的停止模式下唤醒STM32。
对于PVD电源电压监测,当电源从过低恢复时,就需要PVD借助外部中断推出停止模式。
对于RTC闹钟来说,有时为了省电,RTC定一个闹钟之后,STM32会进入停止模式,等到闹钟响的时候再唤醒,这也需要借助外部中断。
USB唤醒和以太网唤醒也是类似作用。
但本节主要学习引脚的外部中断,这4个蹭网先了解一下即可。

中断响应:申请中断,让CPU执行中断函数
事件响应:其实是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但在STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设的操作,比如触发ADC转换,触发DMA等。
总结:中断响应是正常流程,引脚电平变化触发中断
事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作。

EXTI基本结构

在这里插入图片描述
每个GPIO外设有16个引脚,所以进来16根线,前面讲过EXTI只有16个GPIO的通道,如果每个外设的每个引脚都占用一个,那么EXTI的16个就不够用,所以有一个AFIO中断引脚选择的电路模块,AFIO就是一个数据选择器,它可以在前面3个GPIO外设的16个引脚里选择其中一个连接到后面的EXTI通道里,,所以前面说相同的Pin不能同时触发中断,因为对于PA0、PB0、PC0这些,同多AFIO选择之后,只有其中一个能接到EXTI的通道0上。
通过AFIO选择之后的16个通道,就接到了EXTI边沿检测及控制电路上了,同时4个蹭网的外设也并联进来了,加起来组成了EXTI的20个输入信号,经过EXTI电路后。
分为了两种输出:
上面的接到了NVIC,是用来触发中断的。本来20路输入应该有20路输出的,但可能ST公司觉得20个输出太多了,比较占用NVIC通道资源,所以把其中外部中断的9-5触发同一个中断函数,15-10给分到一个通道里触发同一个中断函数,在编程时,在这两个中断函数里,需要再根据标志位来区分到底是哪个中断进来的。
下面的20条接到其他外设使用来触发其他外设操作的,也就是事件响应

AFIO复用IO口

AFIO主要用于引脚复用功能的选择和重定义(数据选择器的作用)
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射(对应引脚定义表,当想把默认复用功能的引脚换到重定义的位置来,就用AFIO来完成,这也是一大主要功能)、中断引脚选择

AFIO选择中断引脚的结构图:
在这里插入图片描述
一系列的数据选择器,比如第一个输入PA0-PG0,尾号都为0,通过数据选择器,最终选择一个接到EXTI0上,在AFIO_EXTICR1配置这个寄存器的EXTI[3:0]位,就可以决定选择哪一输入。

EXTI内部框图

在这里插入图片描述
EXTI的右边是20根输入线,输入线首先进入边沿检测电路,在上升沿触发选择寄存器和下降沿触发选择寄存器可以选择触发方式,接着触发信号进入或门的输入端,(数据选择器的符号是梯形,有多个输入一个输出,侧面有选择控制端,根据控制端的数据,从输入选择一个接到输出)
硬件触发或者软件中断寄存器的值接到了或门上,也就是任意一个为1,或门就可以输出1,所以说支持的方式是上升沿、下降沿、双边沿和软件触发。
触发信号通过或门后,分为两路,上一路触发中断,下一路触发事件
触发中断首先会置一个请求1挂起寄存器,这相当于一个中断标志位,我们可以读取这个寄存器判断是哪个通道触发的中断,如果请求挂起寄存器置1,他就会继续往前走,和中断屏蔽寄存器共同进入一个与门,然后是NVIC中断控制器(这里的与门充当开关的作用哦,中断屏蔽寄存器给1就是允许输出,给0就是屏蔽中断)
下一路也是一个事件屏蔽寄存器进行开关控制,最后通过一个脉冲发生器到其他外设,脉冲发生器就是给一个电平脉冲,用来触发其他外设的动作。
上面就是外设接口和APB总线,可以通过总线访问这些寄存器,

使用外部中断模块的特性:
对于STM32来说,想要获取的信号时外部驱动的很快的突变信号,比如旋转编码器的输出信号,可能很久都不会拧它,这时不需要STM32做任何事情,但是一拧它就会有很多脉冲波形需要STM32接收,这个信号时突发的,STM32不知道什么时候会来。同时是外部驱动,STM32只能被动读取,同时信号很快,STM32稍微晚一点读取,就会错过很多波形,所以这种情况就可以考虑使用外部中断。有脉冲过来,STM32立即进入中断函数处理,没有脉冲的时候,STM32就专心做其他事情
红外遥控接收头的输出,接收到遥控数据后,会输出一段波形,需要立即处理,防止转瞬即逝,需要外部中断来读取
按键虽然它的动作是外部驱动的突发事件,但是不推荐外部中断来读取按键,因为外部中断不好处理按键抖动和松手检测的问题,对于按键来说它的输出波形也不是短暂的,所以要求不高时可以在主程序循环读取。如果不想用主函数读取,可以考虑用定时器中断读取的方式。这样就可以做到后台读取按键值,不阻塞主程序,也可以很好地处理按键抖动和松手检测的问题。

旋转编码器简介

在这里插入图片描述
第一个编码器:
在这里插入图片描述
是一种最简单的编码器样式,使用对射式红外传感器来测速,为了测速,需要配合一个光栅编码盘,当编码盘转动时,红外传感器的红外光就会出现遮挡、透过、遮挡、透过的现象,对应模块输出的电平就是高低电平交替的方波,方波个数代表转过的角度,方波频率代表转速。那就可以用外部中断来捕获这个方波的边沿,以此判断位置和速度,不过模块只有一路输出,正转反转没法区分,无法测量旋转方向

第二个编码器:
左边是外观,右边是拆解结构
在这里插入图片描述
内部用金属触点来进行通断,所以是一种机械触点式编码器
左右是两部分开关触点,内侧两根细的触点,都是和中间的引脚连接,外侧的触点,左边接在左边引脚,右边接在右边引脚,中间圆的金属片是一个按键,旋转编码器的轴是可以按下去的,按键的两根线在上面引出来了,按键的轴按下,上面的两根线短路,松手上面的两根线断开就是个普通按键。编码盘也是一系列像光栅一样的东西,只不过是金属触点,旋转时,依次接通和断开两边的触点,并且还有一个关键部分是:金属盘的位置经过了设计,能让两侧触点的通断产生一个90°的相位差,最终配合外部电路,编码器的两个输出就会输出这样的波形。相位相差90°的波形,叫正交波形,带正交波形信号输出的编码器是可以测方向的。单相输出和两相正交输出的区别。还有的编码器不是输出正交波形,而是一个输出方波信号代表转速,一个输出高低电平代表旋转方向

第三个编码器:
在这里插入图片描述

直接附在电极后面的编码器,霍尔传感器形式的编码器,中间是一个圆形磁铁,边上有两个位置错开的霍尔传感器,当磁铁旋转时,通过霍尔传感器就可以输出正交的方波信号,

第四个编码器:
在这里插入图片描述
独立的编码器器件元件了,输入轴转动时,输出就会有波形,也可以测速和测方向,具体用法再看相应的手册。

第二种是(一般用来调节,比如音响调节音量,因为是触点接触的形式,所以不适合电极这种高速旋转的地方)
另外几种都是非接触的形式,可以用于电机测速,电机测速在电机驱动的应用中还是比较常见。

先学外部中断读取编码器计次数据的用法,学习定时器之后,再看一下编码器测速的用途。

硬件电路

在这里插入图片描述
中间的框是旋转编码器,上面按键的两根线,模块并没有使用,是悬空的
下面是编码器内部的两个触点,旋转轴旋转时,这两个触点以相位相差90°的方式交替导通,因为这还只是开关信号,要配合外围电路才能输出高低电平,
R3位输出限流电阻,防止模块引脚电流过大的。

右边是使用这个模块的接线图:VCC和GND接电源,A相输出和B相输出接到STM32的两个引脚上(比如Pin0口和Pin1口,但是别相同),C引脚GND暂时用不到

外设手册里的介绍

NVIC

因为是内核外设,所以的得在Cortex-M3编程手册里找,Cortex-M3编程手册是内核和内核外设的详细介绍,研究内核的转运细节,可以研究这个手册,中文版本会更加友好
在这里插入图片描述
有NVIC的说明

NVIC的一些寄存器,包括:

中断使能寄存器,

在这里插入图片描述

中断清除使能寄存器

在这里插入图片描述

中断设置挂起寄存器

在这里插入图片描述

中断清除挂起寄存器

在这里插入图片描述

中断活动位寄存器

在这里插入图片描述

中断优先级寄存器

(用来设置中断的优先级的)
如果直接配置寄存器设置优先级的话,那还是比较复杂的。不过直接用库函数的话,就直接给结构体赋值就可以了,所以此处寄存器大致看一下就OK了。
在这里插入图片描述

软件触发中断寄存器

在这里插入图片描述

之后还有中断执行细节的描述

中断分组的配置

此手册中NVIC还少了一个东西,就是中断分组的配置。
中断分组的配置在SCB_AIRCR里,同时寄存器的Prigoup的这三位就是用来配置中断分组的
在这里插入图片描述
中断分组的描述:
在这里插入图片描述
等后期学习差不多了,需要再详细了解内核是怎么运转的,先学会怎么用。

参考手册和数据手册

STM32的参考手册和数据手册同样也很重要

中断的这个部分实际上是AFIO里面的
在这里插入图片描述
对AFIO的描述只有这一句话,就是复用功能引脚重映射的意思,下面全是重映射的表,通过配置寄存器就可以在映射关系表里面切换了
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值