【STM32】NVIC的基本含义及基本配置

目录

抢占式优先级(占先式优先级)和响应优先级(子优先级)

配置响应优先级及应用举例

中断优先的比较过程


NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。控制着整个芯片中断相关的功能,通过对NVIC寄存器进行配置可以实现对内核和片上外设的中断的控制。但是各个芯片厂商在设计芯片的时候会对 Cortex-M4内核里面的 NVIC进行裁剪,把不需要的部分去掉,所以说 STM32的 NVIC 是 Cortex-M4的 NVIC 的一个子集,只是用到了NVIC的一部分功能,其余的保留以后备用。

抢占式优先级(占先式优先级)和响应优先级(子优先级)

STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
1. 何为占先式优先级(pre-emption priority)
高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。
2. 何为副优先级(subpriority)
在占先式优先级相同的情况下,高副优先级的中断优先被响应;
在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。

misc.h文件中定义的“NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)”函数:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下:

#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

配置响应优先级及应用举例

 例如以下怕配置了2位抢占优先级,2位子优先级。那么初始化中断结构体的NVIC_IRQChannelPreemptionPriority可以取0~3,NVIC_IRQChannelSubPriority 可以取0~3。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分祝:2位的抢占,2位的子优先级

以下配置了一个初始化中断结构体"NVIC_InitStructure1",其中抢占优先级NVIC_IRQChannelPreemptionPriority =0,子优先级NVIC_IRQChannelSubPriority =1;

	//中断的初始化配置
	NVIC_InitTypeDef NVIC_InitStructure1;//中断初始化结构体
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE);
	//RTC需要的时钟总线不是APB2下的,而是APB1
	//RCC_APB1Periph_BKP	备份寄存器
	//RCC_APB1Periph_PWR  电源
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//中断请求名称
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//配置通道是否开启(ENABLE:1为开启)
	NVIC_Init(&NVIC_InitStructure);//中断初始化

若下面再配置初始化中断结构体"NVIC_InitStructur2"的抢占优先级NVIC_IRQChannelPreemptionPriority =0,子优先级NVIC_IRQChannelSubPriority =2;

	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级

中断优先的比较过程

首先比较NVIC_IRQChannelPreemptionPriority(抢占优先级),小者所对应的中断服务函数优先执行。NVIC_InitStructur2与NVIC_InitStructur1的NVIC_IRQChannelPreemptionPriority相同;所以再比较NVIC_IRQChannelSubPriority,NVIC_InitStructur1的NVIC_IRQChannelSubPriority(子优先级)小,所以优先执行。

全文关键:上面的优先执行是什么意思呢?比如上面NVIC_InitStructur2的中断服务函数正在执行,而此时触发了NVIC_InitStructur1的中断服务函数,则打断NVIC_InitStructur2的中断服务函数,先执行完NVIC_InitStructur1的中断服务函数再返回继续执行NVIC_InitStructur2的中断服务函数

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于STM32系列的微控制器,NVIC(Nested Vectored Interrupt Controller)是用于管理中断的关键模块。通过配置NVIC,可以设置中断优先级、使能特定中断、清除中断标志等。 以下是配置NVIC的一般步骤: 1. 确定需要配置的中断源。首先,查阅芯片手册或相关文档,了解可用的中断源以及它们的优先级。 2. 设置中断优先级分组。NVIC使用优先级分组来确定中断优先级的编码方式。可以通过设置SCB(System Control Block)寄存器中的PRIGROUP位来选择分组方式。不同的分组方式会影响中断优先级编码的位数。 3. 配置中断向量表。在代码中,需要定义中断处理函数,并将其放置在正确的中断向量表位置。在STM32中,中断向量表通常位于代码的起始位置,可以通过编译器选项或链接脚本来指定。 4. 配置中断优先级。使用NVIC模块提供的函数,将中断源与相应的优先级关联起来。通过调用NVIC_SetPriority()函数,可以设置中断源的优先级。 5. 使能中断。通过调用NVIC_EnableIRQ()函数,使能相应的中断源。这样,当中断源触发时,相应的中断处理函数将被调用。 6. 清除中断标志。在中断处理函数中,根据需要清除中断标志。有些中断源会自动清除标志,而其他一些可能需要手动清除。 需要注意的是,具体的配置步骤和函数可能会因使用的STM32系列和开发环境的不同而有所差异。因此,在进行NVIC配置时,请参考相关的芯片手册、参考手册或官方文档,以确保正确配置中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值