CM4内核可以支持256个中断,包括16个内核中断和240个外部中断,256级的可编程中断设置。对于STM32F4没有用到CM4内核的所有东西,只是用到了一部分,对于STM32F40和41系列共有92个中断,其中有10个内核中断和82个可屏蔽中断,常用的为82个可屏蔽中断。
ISER[8]—中断使能寄存器组,用来使能中断,每一位控制一个中断,由于上面已经说明了控制82个可屏蔽的中断,因此利用ISER[0~2]这三个32位寄存器就够了。一下的几个寄存器同理。
ICER[8]—中断除能寄存器组,用来消除中断。
ISPR[8]—中断挂起控制寄存器组,用来挂起中断。
ICPR[8]—中断解挂控制寄存器组,用来解除挂起。
IABR[8]—中断激活标志寄存器组,对应位如果为1则表示中断正在被执行。
IP[240]—中断优先级控制寄存器组,它是用来设置中断优先级的。我们只用到了IP[0]~IP[81],每个寄存器只用到了高4位,这4位又用来设置抢占优先级和响应优先级(有关抢占优先级和响应优先级后面会介绍到),而对于抢占优先级和响应优先级各占多少位则由AIRCR寄存器控制,相关设置如下图所示:
关于抢占优先级和响应优先级的理解,可以将它们简单的理解为两个级别,抢占优先级的级别要比响应优先级的级别高,简单的理解为一个为长辈的一个为晚辈的,晚辈要让着长辈,因此抢占优先级的中断可以打断响应优先级的中断,而同级别的中断就得有个先来后到的了,先来的先执行。
1、中断优先级分组函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup),用来设置设置中断优先级的分组,就是设置AIRCR寄存器的值。
2、中断初始化:NVIC_Init(),用来设置一个中断的相关参数,包括中断通道、抢占优先级、响应优先级、通道使能。
STM32F4的每一个IO都可以作为外部中断的中断输入口,其中断控制器支持22个中断/事件请求。其中有:1、EXTI线0~15:外部IO口的输入中断。2、线16:PVD输出。3、线17:RTC闹钟事件。4、线18:USB OTG FS唤醒事件。5、线19:以太网唤醒。6、线20:USB OTG HS唤醒事件。7、线21:RTC入侵和时间戳事件。8、线22:RTC唤醒事件。
STM32F4IO口远比16根中断线要多,如果要对应上就需要多个IO口公用一根中断线,由于每一组IO口都有16个IO口,则可以做如下对应,即:PA0、PB0、……、PI0,对应中断线0,依次类推则可以做好相应对应。基于该结构则有了如下的配置过程。
1、使能IO口时钟,初始化IO口。
2、开启SYSCFG时钟,设置IO口和中断线的映射。相关函数为:void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx,uint8_t EXTI_PinSourcex)
3、初始化线上中断,设置相关参数。相关函数为:EXTI_Init();相关参数包括:中断线、中断模式、中断触发条件、中断线使能。
4、配置中断分组。相关函数为:NVIC_Init();相关参数包括:中断通道、抢占优先级、响应优先级、使能中断通道。
5、编写中断服务函数。即中断触发后执行的相关代码。与其相关的有两个函数为:ITStatus EXTI_GetITStatus(uint32_t EXTI_Line),用来判断线上中断是否发生。void EXTI_ClearITPendingBit(uint32_t EXTI_Line),用来在中断函数结束时清除中断标志位。
有关NVIC的中断优先级配置和外部中断的相关结构和配置就介绍到这里,这些介绍是编写相关代码的基础,在理解的基础上也要去书写相关的代码和例程,同时设计的相关中断触发事件来多用,用的多了自然会在理论的基础上得到升华。给自己加油吧!!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/rcj183419/article/details/47344589