中断系统
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
中断执行流程
STM32中断
68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设
使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级
特性
● 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);
● 16个可编程的优先等级(使用了4位中断优先级);
● 低延迟的异常和中断处理;
● 电源管理控制;
● 系统控制寄存器的实现;
外部中断/事件控制器(EXTI)
对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它产品STM32F10xxx,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
STM32F10xxx内核中断:
STM32外设中断:(红框内为外部中断)
NVIC基本结构
NVIC的名字叫做嵌套中断向量控制器,在STM32中,它是用来统一分配中断优先级和管理中断的。
NVIC是一个内核外设,是CPU的小助手,STM32的中断很多,如果把这些中断全都接到CPU上,那CPU还得引出很多线进行适配,设计上就很麻烦,而且如果很多中断同时申请,或者中断很多就会产生了拥堵,CPU也很难处理,而且CPU主要是用来运算的,中断分配的任务就得放到别的地方,那这地方就是NVIC。
NVIC有很多输入口,有多少个中断线路,都可以接过来,比如下图所示可以接到EXTI、TIM、ADC、USART等等,这里线上画了个斜杠,上面写个n,意思就是一个外设可能会同时占用多个中断通道,所以这里有n条线,然后NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,然后,通过右边这一个输出口就告诉CPU该处理哪个中断。对于中断先后顺序分配的任务,CPU就不需要知道了。
NVIC优先级分组
NVIC的中断优先级由优先级寄存器的4位(0~15)决定(这个优先级的数是值越小,优先级越高,0就是最高优先级),这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队 。
EXTI简介
EXTI(Extern Interrupt)外部中断
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
支持的触发方式:上升沿/下降沿/双边沿/软件触发
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
比如PA0、PB0不能同时用,或者PA1、PB1、PC1不能同时用,要选择不同Pin的引脚,比如PA6、PA7或者PA9、PB10或者PB0、PB1就可以
通道数:16个GPIO_Pin(0~15主要功能),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒(后面四个是蹭网的)
触发响应方式:中断响应/事件响应
中断响应:就是申请中断,让CPU执行中断函数
事件响应:是STM32对外部中断增加的一种额外的功能
当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但是在STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU了,而是通向其它外设,用来触发其它外设的操作,比如触发ADC转换、触发DMA等等。
总结:中断响应是正常的流程,引脚电平变化触发中断;事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作。
EXTI基本结构 (整体结构图)
AFIO:数据选择器 (中断引脚选择)
GPIOA,GPIOB,GPIOC,每个GPIO都有16个引脚,所以进来有16跟线 ,而EXTI模块只有16个GPIO通道,但是这里每个GPIO都有16个引脚,如果每个引脚都占用一个通道,那EXTI通道明显不够用,所以这里会有一个AFIO引脚选择的模块,它可以在前面3个GPIO外设的16个引脚里面选择其中一个连接到后面的EXTI通道里,所以前面说,相同的Pin不能同时触发中断,因为对于PA0,PB0,PC0这些,通过AFIO选择之后只有一个能接到EXTI0通道上。同理,PA1,PB1,PC1这些也只能有一个连接到EXTI1通道上。
注意:本来20路输入,应该有20路中断的输出,但可能ST公司觉得这20个输出太多了,比较占用NVIC的通道资源,所以就把其中外部中断的 9~5 和15 ~ 10给分到一个通道里。也就是说,外部中断的9~5会触发同一个中断函数,15~10也会触发同一个中断函数。在编程的时候,我们在这两个中断函数里,需要再根据标志位来区分到底是哪个中断进来的。
AFIO复用IO口
AFIO主要用于引脚复用功能的选择和重定义
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
EXTI框图
旋转编码器简介
旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。
类型:机械触点式/霍尔传感器式/光栅式
正转时:
反转时:
相位相差90°的波形叫做正交波形。带正交波形输出的旋转编码器是可以用来测方向的。
硬件电路