AFIO专题2:从外部中断配置中辨析中断线、中断源和中断通道等概念

1、AFIO用于外部中断线的引脚选择

外部中断是AFIO的另一个用处,具体来说,是用于外部中断线(EXTI Line)的引脚选择。使用GPIO_EXTILineConfig()函数进行配置。

外部中断线是什么呢?所谓中断线,是外部中断独有的概念,和其他外设配置中的中断源并不是同一个概念。其他外设在进行中断配置时,需要首先进行中断源(Interrupts Sources)配置。所谓中断源,是指能够触发中断处理程例程(ISR,Interrupt Service Routine)的事件或信号。一个中断只有一个中断服务例程,但是可以有多个不同的中断源。因此,每次进行中断配置时,都需要配置中断源。比如定时器中断配置,需要使用函数TIM_ITConfig()配置TIM中断源,其中断源有多个,包括TIM_IT_Update、TIM_IT_CC1~TIM_IT_CC4和TIM_IT_COM等。EXTI其实没有中断源的说法,它和中断源对等的概念其实是EXTI_InitTypeDef结构体中的EXTI_Mode和EXTI_Trigger,这一点下边配置EXTI时再讲。

那么为什么要有外部中断线的概念,而其他外设没有呢?这其实是根源于外部中断区别于其他外设的一个重要特点:其他外设都有专用的I/O口,而所有GPIO口都可以设置为外部中断线的I/O口。这导致中断线数量和GPIO口数量的不对等,GPIO口数量大于外部中断线的数量。如下图所示,stm32f10x控制器外部中断的中断线有20条,其中有16条通用的外部中断线,另外4条是专用的外部中断线(图中的PVD、RTC、USB和ETH)。对于通用的外部中断线,总共只有16条,而GPIO口却有48个或64个等(不同型号的芯片引脚数量不同),因此,必须对可用于外部中断的GPIO口数量进行限制

GPIO_EXTILineConfig()就是用于对GPIO口进行限制和选择:同pin不同port的GPIO口在外部中断中只能使用其中一个。比如说,使用了GPIOA PIN1,其他端口比如GPIOB、GPIOC等的PIN1就不能再用于外部中断了。在这里,AFIO其实类似于一个数据选择器

注:此图来自江科大stm32入门教程,并非原创

2、外部中断配置流程

  • 使能GPIO和AFIO的时钟。注意,EXTI不需要进行进行时钟使能,因为EXTI并不需要时钟源来工作
  • GPIO初始化。
  • AFIO配置,也就是调用前边所说的外部中断线选择函数GPIO_EXTILineConfig(),选择中断线所用的I/O口。
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
  • EXTI初始化
    • EXTI_InitTypeDef结构体中,EXTI_Line用于选择中断线。注意,中断线号必须和前边用GPIO_EXTILineConfig()配置好的引脚号相对应
    • 如前所述,EXTI_Mode和EXTI_Trigger其实才是和中断源相对等的概念,配置外部中断触发的事件或信号。
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;	//配置外部中断线EXTI_Line14
EXTI_InitStructure.EXTI_LineCmd = ENABLE;   //指定外部中断线使能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	//指定外部中断线为下降沿触发
EXTI_Init(&EXTI_InitStructure);
  • NVIC配置
    NVIC_InitTypeDef结构体的NVIC_IRQChannel,指的是中断通道。如上一篇帖子所述,中断通道其实就是启动文件中的中断向量表中的中断向量,同时也是中断服务例程的函数名,这三者是同一个意思。
    所谓中断向量,对于Cortex-M3内核,是指中断服务例程的入口地址,存放在中断向量表中,在启动文件中定义。而在C语言中,函数名表示该函数的地址。这是因为在C语言中,函数名在大多数上下文中都会被解释为指向该函数的指针。因此,中断服务例程的入口地址其实就是中断服务例程的函数名。因此,中断向量其实就是中断服务例程的函数名。
    当中断被触发时,系统就去中断向量表中找到对应的中断向量,也就是中断服务例程的入口地址,随后程序跳转到中断服务例程中去工作。正因为如此,所以中断服务例程的名称才必须和中断向量表中的中断向量一致,不能自己随便编,否则程序将无法正常调用中断服务例程。

    讲到这里就清楚了,前边提到的中断源和中断通道什么区别呢?再看一下中断源的定义:触发中断处理例程(ISR,Interrupt Service Routine)的事件或信号,而前边提到中断通道就是指中断处理例程的名称。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			
NVIC_Init(&NVIC_InitStructure);	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值