NVIC寄存器详解(基于STM32F103XX型号讲解)

您所在的位置:网站首页 寄存器能存多少位 NVIC寄存器详解(基于STM32F103XX型号讲解)

NVIC寄存器详解(基于STM32F103XX型号讲解)

2024-07-12 23:10| 来源: 网络整理| 查看: 265

前言:

NVIC全名为嵌套向量中断控制器(Nested vectoredinterrupt controller),用于中断分组,进而给很更好的设置抢占优先级和响应优先级。

NVIC寄存器的基本结构:

对于现在的STM32的MCU,每个中断通道的优先级都是使用NVIC寄存器中的8位来控制的,一共有2^8=256种不同等级的中断(16个内核中断+240个外部中断),由于STM32用不了那么多中断,故有些厂家根据自己使用的芯片进行了调整。

在我使用的STM32F103XX系列的单片机上,因为低四位被厂家限制取零,故只可以使用上四位寄存器进行中断方式选择,所以只有2^4=16种不同的中断。

在开始讲解NVIC寄存器的工作方式之前,先讲解两个十分重要的知识点:抢占优先级和响应优先级 抢占优先级:

打断正在执行的任务A,并执行下一个新的任务B,执行完新任务B之后,在继续执行任务A,此属性由NVIC_IRQChannelPreemptionPriority 的参数配置。

类似此文中提到的中断和中断嵌套:stm32 学习记录(持续更新)-CSDN博客

响应优先级:

当两个相同抢占优先级的中断在同一时间被触发时,就先处理响应优先级较高的中断,此属性可以由NVIC_IRQChannelSubPriority 参数配置。

注意:当抢占优先级与响应优先级都相同时,就按中断号进行排队

中断优先级的分组:

此图的大致意思就是:

当为分组0时,NVIC寄存器的4位全部用于响应优先级

当为分组1时,NVIC寄存器的1位用于抢占优先级,NVIC寄存器的其它3位用于响应优先级

当为分组2时,NVIC寄存器的2位用于抢占优先级,NVIC寄存器的其它2位用于响应优先级

当为分组3时,NVIC寄存器的3位用于抢占优先级,NVIC寄存器的其它1位用于响应优先级

当为分组4时,NVIC寄存器的4位用于抢占优先级

结论:抢占优先级>响应优先级>STM32默认中断级别

NVIC寄存器的配置过程: 1.使用void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数对优先级分组配置。

在此处共有5种配置情况(就是刚刚所讲的 “中断优先级的分组”),分别为:

NVIC_PriorityGroup_0 => 选择第0组 NVIC_PriorityGroup_1 => 选择第1组 NVIC_PriorityGroup_2 => 选择第2组 NVIC_PriorityGroup_3 => 选择第3组 NVIC_PriorityGroup_4 => 选择第4组

举个例子:将NVIC寄存器配置为0组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 2.NVIC初始化结构体的内容,配置以及初始化: NVIC结构体的内容: typedef struct {   uint8_t NVIC_IRQChannel;                 //使用的中断外设   uint8_t NVIC_IRQChannelPreemptionPriority;  //抢断优先级   uint8_t NVIC_IRQChannelSubPriority;  //响应优先级         FunctionalState NVIC_IRQChannelCmd;       } NVIC_InitTypeDef; NVIC结构体配置过程(以外部中断0为,优先级1组为例): NVIC_InitTypeDef GPIOA_0Init; //定义NVIC寄存器的初始化结构体名称 GPIOA_0Init.NVIC_IRQChannel = EXTI0_IRQn; //设置为外部中断0 GPIOA_0Init.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级别(0~1) GPIOA_0Init.NVIC_IRQChannelSubPriority = 1; //响应优先级别(0~7) GPIOA_0Init.NVIC_IRQChannelCmd = ENABLE; //中断使能 初始化函数调用(根据刚才所写的NVIC结构体配置): NVIC_Init(&GPIOA_0Init); NVIC使用过程总结:

1.中断优先级分组配置。

2.NVIC初始化结构体的配置。

3.初始化函数调用进行NVIC寄存器的初始化。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择中断分组 NVIC_InitTypeDef GPIOA_0Init; //定义NVIC寄存器的初始化结构体名称 GPIOA_0Init.NVIC_IRQChannel = EXTI0_IRQn; //设置为外部中断0 GPIOA_0Init.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级别(0~1) GPIOA_0Init.NVIC_IRQChannelSubPriority = 1; //响应优先级别(0~7) GPIOA_0Init.NVIC_IRQChannelCmd = ENABLE; //中断使能 NVIC_Init(&GPIOA_0Init);//调用初始化函数对NVIC进行初始化



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3