目录
一、更新时间
2022.1.23
二、具体内容
STM32F103中常用的功能如IIC、SPI、串口、定时器、外部中断等。如此多的中断,单片机是如何进行管理的就涉及到中断优先级的问题。
2.1 中断优先级分组
在寄存器SCB->AIRCR中进行中断优先级分组管理。
这里需要理解一下抢占优先级与响应优先级的概念。
抢占优先级就是可以打断其他中断,比如说小明在执行打游戏的程序,爸爸在他打游戏的时候下达去楼下买烟的中断,小明刚走到门口就被妈妈叫回写作业,写完作业再去买烟,很明显妈妈的中断优先级更高可以打断爸爸的中断,执行完妈妈的中断后才可以继续执行爸爸请求的中断,这就叫抢占。数字越小抢占优先级的级别越高。
响应优先级是在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断。注意在抢占优先级相同的情况下,高响应优先级不可以打断正在执行的低响应优先级的中断子函数。数字越小响应优先级的级别越高。
注意一般只是在最开始的时候设置一次中断优先级分组,后续不会改变,随意改变中断优先级分组会导致意想不到的情况。对于库函数代码配置如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
//输入参数定义如下:
#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
0 bits for subpriority */
2.2 单个中断优先级设置
在MDK中对NVIC寄存器进行了定义:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register */
} NVIC_Type;
使用IP寄存器对抢占优先级与响应优先级进行配置,使用的是IP寄存器的高四位,低四位不用。10X系列有60个可屏蔽中断,所以使用IP[59]-IPP[0]。ISER为中断使能寄存器,ICER为中断失能寄存器。
中断优先级配置代码如下:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口一中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器