STM32 NVIC/中断优先级专题:NVIC配置及CM3内核的NVIC_IPR寄存器

1、STM32片上外设分类

首先要有基本概念,STM32F10x芯片基于CM3内核(Cortex-M3内核的简称),CM3内核是ARMv7-M架构的。这里的v7是version 7,第七代架构。虽然目前ARM公司64位的最新架构已经到第九代了,但是ARM公司M系列芯片还是有许多采用的第七代架构。

NVIC属于内核外设。在STM32的片上外设中,有两类外设:

  • 一类是内核外设,是位于内核内部的,有且只有两个:NVIC和SysTick。
  • 一类是位于内核之外的外设,包括I2C、USART等除了上述两个内核外设之外的所有外设。

内核外设有一个特点:在配置这类外设时,不需要进行时钟使能。

2、Cortex-M3内核的NVIC_IPR寄存器

在Cortex-M3内核中,中断优先级由专门的寄存器NVIC_IPR(Interrupt Priority Register,中断优先级寄存器)配置。原则上, CM3支持多达256级的可编程优先级。但是,绝大多数 CM3 芯片都会精简设计,以致实际上支持的优先级数会更少,如 8 级,16 级,32 级等。它们在设计时会裁掉表达优先级的几个低端有效位,以减少优先级的级数:这就是所谓的以 MSB 对齐(MSB和字节序有关,是Most Significant Bit的缩写,表示最高有效位)。

以下图为例,表示NVIC_IPR寄存器只有高3位是有效字段,用于设置优先级,最低5位被弃用。这个时候系统最多只能表示2^3=8个优先级。

注:此图来自《Cortex-M3权威指南》,并非原创。

并且注意,在有效字段里,MSB 所在的位段(左边的)对应抢占优先级(pre-emption priority),而 LSB 所在的位段(右边的)对应响应优先级(或子优先级,subpriority)。详见下图。关于抢占优先级和响应优先级的概念,这里不再赘述,推荐去b站看江科大的stm32入门教程,讲得非常好。

注:此图来自《Cortex-M3权威指南》,并非原创。

在STM32F10x中,优先级字段的高4位用于设置中断优先级。也就是说,NVIC_IPR寄存器的每个字节的高4位用于表示中断的优先级,而低4位未使用。因此,STM32F10x系列芯片,可用的优先级个数为2^4=16个。

在这4个有效位里边,根据所表示的抢占优先级和响应优先级的位数的不同,可分成5组,这就是所谓的中断优先级分组。注意,不是4组,而是5组,因为抢占优先级和响应优先级都可以是0位。如下图所示。

注:此图来自stm32f10x标准库文件misc.c。

3、NVIC配置流程

前边讲到,NVIC是内核外设,不需要进行时钟使能。因此,NVIC的配置仅两步:

  • 进行中断优先级分组。比如设置第0组NVIC_PriorityGroup_0,则可参考下列代码。需要注意的是,在整个stm32工程中,中断优先级分组只需要进行一次,并不需要在每次配置某个外设的中断优先级时,都设置一遍。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    //中断优先级分组
  • 调用NVIC_Init()初始化NVIC。例如设置外部中断EXTI0的中断优先级,参考配置如下列代码。
    有一点非常重要的是,NVIC_InitTypeDef结构体中的NVIC_IRQChannel是指中断通道,其实就是启动文件中的中断向量表中的中断向量,同时也是中断服务例程的函数名,这三者是同一个意思。理解这一点非常重要,这一点将会在下一篇的AFIO专题中讲到。
NVIC_InitTypeDef NVIC_InitStructure;  //配置NVIC_InitTypeDef结构体
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

4、附录

本文部分内容参考自《Cortex-M3权威指南》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值