华夏名网网站建设,wordpress返回上一页,合肥房产网安居客,昆明手机网站开发一、NVIC是什么#xff1f;
NVIC是一种中断控制器。当一个中断正在处理时#xff0c;另一个更高优先级的中断可以打断当前中断的执行#xff0c;并立即得到处理。这种机制使得处理器在高速运行的同时#xff0c;能够及时响应不同优先级的中断请求。
二、有哪些优先级
NVIC是一种中断控制器。当一个中断正在处理时另一个更高优先级的中断可以打断当前中断的执行并立即得到处理。这种机制使得处理器在高速运行的同时能够及时响应不同优先级的中断请求。
二、有哪些优先级只有抢占优先级才会发生中断嵌套
抢占优先级 抢占优先级是指中断的打断优先级抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。 响应优先级 响应优先级是指中断的响应顺序响应优先级只有在抢占优先级相同的情况下才有意义。当抢占优先级相同时俩个中断同时发生响应优先级高的中断先响应。 自然优先级 按照自带的优先级编号硬件固定在抢占和响应优先级相同的情况下决定先执行哪个中断数字越小级别越高。这个是由厂家设计好的。 每个中断源的抢占优先级和响应优先级由用户决定软件设置而自然优先级已经被硬件固定 不可更改。优先级越高其对应的值越低。数字越小优先级越高。
三、什么是中断嵌套
答通俗来讲就是停止当前正在进行的任务去执行抢占优先级更高的中断任务。 例如A的抢占优先级为0B的抢占优先级为1。则当两个中断请求同时发生时先执行抢占优先级高的A。但是当CPU正处理B时发生了A的中断请求则停止执行B先去执行A的中断当执行完A中断后再去执行剩下的B程序。这就是中断嵌套。
四、优先级的优先等级序号越低优先级越高
1优先级大小抢占优先级响应优先级自然优先级。 2抢占优先级相同响应优先级不同则先处理响应优先级高的。但是响应优先级没有中断嵌套。 例如果A的抢占优先级为0B的抢占优先级也为0。A的响应优先级为0B的响应优先级为1。则两个同时发生中断请求时在抢占优先级相同时先处理响应优先级高的A。但是如果CPU正在处理B时发生了A的中断请求则继续执行B当B完成后再执行A。因为响应优先级不会发生中断嵌套。 3如果抢占优先级和响应优先级都相同则比较它们的硬件中断编号自然优先级中断编号越小优先级越高。硬件中断编号从中断向量表中查看
五、优先级分组
Core-M4内核最多支持256级的可编程优先级。用8位来表示优先级级别,优先级级别分为8组分别是组0~组7。但是ST公司设计STM32F407ZGT6时为了精简设计只用了16 个可编程优先级使用了 高四位4 位来设置中断优先级设置低四位的值是无效的。所以不同的芯片优先级分组会有不同。
以STM32F407ZGT6为例
分组配置寄存器SCB-AIRCR。 由 3bit ( AIRCR[10:8] ) 控制抢占优先级与响应优先级分别占几位。 由 4bit ( IP bit[7:4] ) 控制不同的优先级决定中断发生的先后。
IP bit[7:0]:
STM32的中断优先级使用4~7共4个位控制。抢占优先级占2位有4种选择响应优先级占2位有4种选择故中断共可配置16种优先级。 例如要配置2位抢占优先级2位响应优先级就需先配置 寄存器AIRCR[10:8]的数值为101。 注意一般情况下系统代码执行过程中只设置一次中断优先级分组设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱程序出现意想不到的执行结果。如果设置了多次则以最后一次为准。
六、优先级设置示例
例如在同一工程项目中有TIM3_IRQn、USART1_IRQn。优先级配置如下可根据自己目的修改。 1方式一用结构体配置
●TIM3_IRQn优先级设置 NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名NVIC_InitStructure.NVIC_IRQChannel TIM3_IRQn; //选择通道要中断的对象NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; //设置抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; //设置响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //通道使能NVIC_Init(NVIC_InitStructure); //根据以上参数初始化NVIC寄存器●USART1_IRQn优先级设置 NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 3;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //IRQ通道使能NVIC_Init(NVIC_InitStructure); //根据指定的参数初始化VIC寄存器**●该方式相应的优先级分组函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组一般在初始化中进行如当我们选择优先级分组为2时则有2个位决定抢占优先级2个位决定响应优先级。抢占优先级两个位有4种选择值00、01、10、11。分别是0~3不能超过除非先修改优先级组。响应优先级同理。 ●优先级分组在主函数中初始化 这个函数 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 参数可选序号对应下图的组 NVIC_PriorityGroup_0 NVIC_PriorityGroup_1 NVIC_PriorityGroup_2 NVIC_PriorityGroup_3 NVIC_PriorityGroup_4 ●主函数
int main(void) {// 配置中断优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 其他初始化工作// 主循环或其他操作while (1) {// 主程序逻辑}
}当配置好优先级后当中断响应时就可以根据优先级响应规则进行处理。规则如上文标题四中所示。
2方式二直接用函数配置 ●合成优先级值函数
NVIC_EncodePriority(5,1,2);NVIC_EncodePriority() 由三个参数组成 5 表示优先级组号(下图中红框圈住的号而不是红框前面的组的数字)1 表示抢占优先级2 表示响应优先级。 ●如配置SysTick_IRQn中断优先级代码如下 NVIC_SetPriority(SysTick_IRQn,NVIC_EncodePriority(5,1,2)); // 设置SysTick_IRQn中断优先级NVIC_EnableIRQ(SysTick_IRQn); //使能SysTick_IRQn的NVIC响应。NVIC_SetPriority ()函数的第一个参数是中断号这里是 SysTick_IRQn表示 SysTick 定时器的中断。第二个参数是优先级值通过 NVIC_EncodePriority() 函数生成。该函数用于设置优先级。 NVIC_EnableIRQ(SysTick_IRQn) 这行代码用于使能 SysTick 中断。通过这个函数你告诉 NVIC 可以响应 SysTick 中断。
●该方式相应的设置优先组函数 NVIC_SetPriorityGrouping(5);该函数参数和NVIC_EncodePriority函数第一个参数一致具体参数设置如上述NVIC_EncodePriority函数第一个参数所示。
●主函数
int main(void) {// 配置中断优先级分组NVIC_SetPriorityGrouping(5);// 其他初始化工作// 主循环或其他操作while (1) {// 主程序逻辑}
}