关于STM32F103中断优先级管理NVIC

本文详细介绍了STM32F103单片机中断优先级的管理方式,包括中断优先级分组及单个中断优先级设置的方法。通过实例讲解了抢占优先级与响应优先级的概念,并给出了具体的配置代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、更新时间

二、具体内容

 2.1 中断优先级分组

 2.2 单个中断优先级设置


一、更新时间

        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寄存器

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值