系列文章目录文章目录系列文章目录前言一、STM32 NVIC中断优先级管理二、STM32中断组
在开始使用中断之前,请了解中断的优先级管理。
CM3内核支持256个中断,包括16个内核中断和240个外部中断,有256个中断
的可编程中断设置。 但是,STM32并不使用CM3内核中的所有内容,只使用了其中的一部分。
STM32有84个中断,包括16个核心中断和68个可屏蔽中断,具有16级可编程中断优先级。
我们经常使用的是这68个可屏蔽中断,而STM32的68个可屏蔽中断在STM32F103系列中
上面又只有60个。 在107系列中只有68个。 因为我们的开发板选择的芯片是STM32F103系列
因此,我只介绍STM32F103系列的60个可屏蔽中断。
另一方面,STM32 NVIC中断优先级在MDK中被管理,并且是与NVIC相关联的寄存器。 MDK为此定义了以下结构体。
类型结构
{
__IO uint32_t ISER[8]; //! Interrupt集启用注册器/
uint 32 _ t保留0 [ 24 ];
__IO uint32_t ICER[8]; //! Interrupt Clear Enable Register /
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; //! Interrupt Set Pending Register /
uint 32 _ t保留2 [ 24 ];
__IO uint32_t ICPR[8]; //! Interrupt Clear Pending Register /
uint 32 _ t保留3 [ 24 ];
__IO uint32_t IABR[8]; //! Interrupt活动位注册器/
uint 32 _ t保留4 [ 56 ];
__IO uint8_t IP[240]; //! Interrupt优先级注册器,8Bit wide /
uint 32 _ t保留5 [ 644 ];
__O uint32_t STIR; //! oftwaretriggerinterruptregister * /
} NVIC_Type;
3358 www.Sina.com/http://www.Sina.com /要启用某个中断,必须将相应的ISER位设置为1并启用该中断。 根据中断数据包、掩码、IO端口映射等的设定进行设定。 3358 www.Sina.com/http://www.Sina.com /用于清除中断的使能。 3358 www.Sina.com/http://www.Sina.com /通过设置1,可以挂起正在运行的中断,并执行相同级别以上的中断。 写0是无效的。 3358 www.Sina.com/http://www.Sina.com /可以通过设置1挂起挂起的中断。 写0是无效的。 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /由240个8位寄存器组成,用于中断这四位分为抢占优先级和子优先级。 抢占优先级在前,子优先级在后。 这两个优先级分别为多少位取决于SCB-AIRCR中中断组的设置。
二、STM32的中断包STM32将中断分为5组,组0~4。 该组的设置在SCB-AIRCR寄存器的bit10~8中定义。
对于每个中断,可以将抢占优先级设置为0到7,将响应优先级设置为1或0。 抢占优先级级别高于响应优先级。 数值越小,优先顺序越高。
这里有两点需要注意。 第一,如果两个中断的抢占优先级和响应优先级相同,则首先看到哪个中断首先发生,然后再执行。 第二,高优先权可以中断正在进行的低优先权中断。 抢占优先级相同的中断时,高优先级响应优先级不能中断低响应优先级的中断。
ISER[8]:
voidnvic _ prioritygroupconfig (uint 32 _ TN vic _ priority group;
此函数的作用是对中断的优先级进行分组。 此函数在系统中只调用一次,并被分成两部分
小组确定后最好不要更改。
voidnvic _ prioritygroupconfig (uint 32 _ TN vic _ priority group )
{
资产_ param (is _ nvic _ priority _ group ) NVIC_prioritygroup );
sc B- air Cr=air Cr _ vect key _ mask|nvic _ priority group;
}
# define is _ nvic _ priority _ group (group )。
() )组==NVIC_PriorityGroup_0) |
(GROUP )==NVIC_PriorityGroup_1) |
(GROUP )==NVIC_PriorityGroup_2) |
(GROUP )==NVIC_PriorityGroup_3) |
(GROUP )==NVIC_PriorityGroup_4) )
分组范围为0-4
中断使能寄存器组
voidnvic _ init (nvic _ init typedef * nvic _ init struct ) )。
NVIC_InitTypeDef是一个结构
类型结构
{
uint8_t NVIC_IRQChannel;
uint8_ TN vic _ irqchannelpreemptionpriority;
uint8_ TN vic _ irqchannelsubpriority;
functionalstatenvic _ irqchannelcmd;
} NVIC_InitTypeDef;
在NVIC_InitTypeDef结构的中间有三个成员变量。 这三个成员变量的作用如下:
NVIC_IRQChannel :定义要初始化哪个中断。 这可以在stm32f10x.h中找到与每个中断对应的名称。
例如USART1_IRQn。
nvic _ irqchannelpreemptionpriority :定义此中断的抢占级别。
NVIC_IRQChannelSubPriority :定义此中断的子优先级级别。
NVIC_IRQChannelCmd :中断是否有效。
ICER[8]:
在系统开始运行时设置中断组。 决定组号,即决定抢占优先顺序和子优先顺序
分配位数。 调用函数为NVIC_PriorityGroupConfig (; 设置要使用的中断的中断优先级。 每次中断调用函数的是NVIC_Init (;