关于中断
Crotex-M3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断。
STM32F10x 芯片有 84 个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,对于STM32F103系列芯片只有60个可屏蔽中断,参考《STM32F10x 中文参考手册》-9 中断和事件章节。
NVIC (Nested Vectored Interupt Controler) :嵌套向量中断控制器。
优先级分组
STM32F103 芯片支持 60 个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8 位,理论上每个外部中断优先级可以设置为0-25,数值越小,优先级越高。但是 STM32F103 中只使用 4 位,高 4 位有效),
用于表达优先级的高 4 位又被分组成抢占式优先级和响应优先级(亚优先级”或“副优先级),每个中断源都需要被指定这两种优先级。
在抢占式优先级相同的情况下,高响应优先级的中断优先被响应
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个。
如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理那一个,越靠前的先执行。
有关NVIC 中断相关的库函数都在库文件 misc. 和 misc.h 中。
STM32F103 中指定中断优先级的寄存器位有 4 位,这 4 位的分组方式如下5种,设置优先级分组可调用库函数 NVIC_PriorityGroupConfig()实现。
GPIOx.0-GPIOx.15(x=A,BC,DE,F,G)分别对应中断线 EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
中断模式
标号 1 为输入线,EXTI 控制器有 20 个中断/事件输入线,输入线一般是存在电平变化的信号。
标号2边沿检测电路,对触发方式(上升沿触发和下降沿触发)进行选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器 。可以是只有上升沿触发、只有下降沿触发、上升沿和下降沿都触发。
标号3是一个或门电路,只要有一个为有效信号 1, 则输出有效信号 1,
标号4是一个与门电路,只有当两者都为有效信号 1,才会输出有效信号 1,
标号5将挂起寄存器内容输入到 NVIC 内,实现系统中断事件的控制。
标号6是一个与门电路,只有两者都为有效电平 1,标号 6 输出才有效,
标号7脉冲发生器电路,标号 6 输出有效,脉冲发生器输出一个脉冲信号。
标号8脉冲信号,通常用来触发定时器、ADC 等开始转换。
小结
中断线路:最终会输入到 NVIC 控制器中,运行中断服务函数,实现中断内功能。
事件线路:最后产生的脉冲信号流向其他的外设电路。
EXTI 外设接口时钟是由 PCLK2,即 APB2 提供 。
外部中断实验
外部中断配置在APP文件夹exti.c (驱动文件)和exti.h(头文件)。
exti.c
#include "exti.h"
#include "led.h"
#include "SysTick.h"
#include "key.h"
void My_EXTI_Init(void) //外部中断初始化函数
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟
//4个按键端口(PE2/PE3/PE4/PA0)映射到相应的中断线上
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);//选择GPIO管脚用作外部中断线路