STM基础知识-中断

简单介绍

interrup泛指中断事件及后续中断响应全过程

ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位,因为抢占优先级的最多可以有四位数。

     STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组(当然也可以用8BIT来分为七组)
第0组:所有4bit用于指定响应优先级;                                                                      NVIC_PriorityGroup_0 => 选择第0组 
第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;               NVIC_PriorityGroup_1 => 选择第1组
第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;               NVIC_PriorityGroup_2 => 选择第2组

第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;               NVIC_PriorityGroup_3 => 选择第3组

第4组:所有4位用于指定抢占式优先级。                                                                  NVIC_PriorityGroup_4 => 选择第4组

      中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数,在一个程序中只能设定一次

      所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。

中断源优先级 

中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。 
中断源优先级具体的设置了该中断源的优先级别 
在一个程序中可以设定多个(最多16个优先级,每个中断源只能设定一个)
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。
有几点需要注意的是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

GPIO外部中断

     STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。

EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。 

对于中断的控制,STM32有一个专用的管理机构:NVIC【中断矢量控制器】。


程序实现

   使用外部中断的基本步骤如下:
1.       设置好相应的时钟;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);使GPIOX口使能
2.       设置相应的中断;(1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置 
                                        (2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置
3.       IO口初始化;

4.       把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);

5.       在选择的中断通道的响应函数中中断函数。


中断服务程序虽然简单,但是在写入口函数的时候,注意函数名的写法,只有如下3种命名方式。
(1)EXTI0_IRQHandler;EXTI Line 0
EXTI1_IRQHandler;EXTI Line 1
EXTI2_IRQHandler;EXTI Line 2
EXTI3_IRQHandler;EXTI Line 3
EXTI4_IRQHandler;EXTI Line 4
(2)
EXTI9_5_IRQHandler;EXTI Line 5-9
(3)
EXTI15_10_IRQHandler;EXTI Line 10-15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值