前注:本文章主要讲解【原理】
内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!
实验
A.硬件原理
Cortex-M3的中断和优先级 |
STM32的中断和优先级 |
EXTI外部中断 |
一、Cortex-M3 的中断和优先级
正常情况下,微处理器根据代码内容,按顺序执行指令。执行过程中,如果遇到其它紧急的事件需要处理,则先暂停当前任务,执行紧急事件,待紧急事件处理完后,再恢复到刚才暂停的地方继续执行。这个产生的紧急事件就叫做中断或异常。
通常,把
CPU
内部产生的紧急事件叫做
异常
,比如非法指令(除零)、地址访问越界等;
把来自
CPU
外部的片上外设产生的紧急事件叫做
中断
,比如GPIO
引脚电平变化、定时器溢出等。异常和中断的效果基本一致,都是暂停当前任务,优先执行紧急事件,因此一般将中断和异常统称为中断。
NVIC
Cortex-M3
内核有一个专门管理中断的外设
NVIC
(
Nested Vectored Interrupt Controller
, 嵌套向量中断控制器),通过优先级控制中断的嵌套和调度。NVIC
是一个总的中断控制器,无论是来在内 核的异常还是外设的外部中断,都由NVIC
统一进行管理。
在
Cortex-M3
中,将优先级拆分为抢占优先级(
Preempt Priority
)和子优先级(
Subpriority
),每个中断都需要指定这两级,具有高优先级的中断可以打断低优先级的中断,实现中断嵌套。
所有可编程的中断都需要指定抢占优先级和子优先级,抢占优先级决定是否可以产生中断嵌套,子优先 级决定中断响应顺序,若两种优先级一样则看中断在中断异常表中的位置,
越靠前越先响应
二、STM32 的中断和优先级
Cortex-M3
设计有
256
种中断,但大多数
MCU
都用不到这么多中断,比如
STM32F103
系列就只有
70
种异常和中断,其中前
10
个是系统异常,后面
60
个是外部中断,
系统异常
外部中断
优先级
1) NVIC_PRIORITYGROUP_0 : 0 位抢占式优先级, 4 位响应优先级;2) NVIC_PRIORITYGROUP_1 : 1 位抢占式优先级, 3 位响应优先级;3) NVIC_PRIORITYGROUP_2 : 2 位抢占式优先级, 2 位响应优先级;4) NVIC_PRIORITYGROUP_3 : 3 位抢占式优先级, 1 位响应优先级;5) NVIC_PRIORITYGROUP_4 : 4 位抢占式优先级, 0 位响应优先级;
STM32F103
的异常和中断,基于
Cortex-M3
修改而来,前面的系统异常部分几乎没有变化,外部中断则对应不同的外设
同样,STM32F103
也继承了
Cortex-M3
的中断优先级规则,因为中断少了很多,中断优先级也用不了那 么多,只使用了PRI_n
的
Bits[7:0]
中的
Bits[7:4]
设置优先级。
三、EXTI外部中断
STM32F103
系列的
EXTI
支持
19
个外部中断
/
事件请求(互联型系列的
STM32
支持
20
个),每个中断
/
事件
都有独立的触发和屏蔽设置,支持中断模式和事件模式。
中断模式
是指外部信号产生电平变化时,
EXTI
将该信号给
NVIC
处理,从而触发中断,执行中断服务函 数,完成对应操作。
事件模式
是指外部信号产生电平变化时,EXTI
根据配置,联动
ADC
或
TIM
执行相关操作。
EXTI功能框图
对应上面蓝色框
中断线路
输入线:
EXTI
控制器有
19
个中断
/
事件输入线,这些输入线可以通过寄存器
设置为任意一个
GPIO,也可以是一些外设的事件,输入线一般是存在电平变化的信号。
边沿检测电路:
通过设置上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)对应位的设置来控制信号触发。
在写EXTI_RTSR寄存器时,在外部中断线上的上升沿信号不能被识别,挂起位也不会被置位。(F4挂起位会被置位)
如果在向 EXTI_FTSR 寄存器写入值的同时外部中断线上产生下降沿,挂起位不会被置位
在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断
总结:可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。
或门电路:
一个输入来自
边沿检测电路触发
,另外一个输入来自
软件中断事件寄存器
(EXTI_SWIER)
。
总结:或门电路 两个输入中有一个为‘1’,都会输出一
与门电路:
它一个输入是编号
3 (请求挂起位置)
电路,另外一个输入来自
中断屏蔽寄存器
(EXTI_IMR)
。
总结:中断屏蔽寄存器(EXTI_IMR)具有一票否决权,决定是否开启此线的中断
至NVIC中断控制器:
将
EXTI_PR
寄存器内容输出到
NVIC
内,从而实现系统中断事件控制。
事件线路
产生事件线路是在编号 3 电路之后与中断线路有所不同,之前电路都是共用的。
:与门电路:
它一个输入来自编号
3
电路,另外一个输入来自
事件屏蔽寄存器
(EXTI_EMR)。
总结:事件屏蔽寄存器 (EXTI_EMR)具有一票否决权,决定是否开启此线的事件发生
脉冲发生器电路:
当它的输入端,即编号
6
电路的输出端,是一个有效
信号
1
时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
一个脉冲信号:
是产生事件的线路最终的产物,这个脉冲信号可以给其他
外设电路使用,比如定时器
TIM
、模拟数字转换器
ADC
等等,这样的脉冲信号一般用来
触发
TIM
或者
ADC
开始转换。