stm32之中断优先级NVIC
2016-02-15 15:28
260 查看
什么是NVIC?
即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。
STM32的中有一个强大而方便的NVIC,它是属于Cortex内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由 NVIC来控制的。
对寄存器进行介绍:
ISER[2]:中断使能寄存器组(2个32位寄存器,可以表示60个可屏蔽中断)
ICER[2]:中断失能寄存器组
ISPR[2]:中断挂起控制寄存器组
ICPR[2]:中断解挂控制寄存器组
IABR[2]:中断激活标志位寄存器组(只读,通过它可以知道当前在执行的中断是哪一个)
IPR[15]:中断优先级控制的寄存器组(设置各个中断的抢占和响应优先级)
STM32 的中断分组
第0组:所有4位用于指定响应优先级(16种)
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)
第4组:所有4位用于指定抢占式优先级
我的理解是中断分组对各个中断会有一个限制,比如使用第0组只能存在一个抢占优先级。
抢占优先级>响应优先级
不同的抢占优先级可以存在中断抢占,不同的响应优先级不可以抢占。
优先分组是0组,说明只能存在响应优先级,互相之间不能被打断,而当两个任务同时发生时,UART2 会先响应。
即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。
STM32的中有一个强大而方便的NVIC,它是属于Cortex内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由 NVIC来控制的。
与NVIC有关的寄存器
对其定义了如下结构体typedef struct { vu32 ISER[2]; u32 RESERVED0[30]; vu32 ICER[2]; u32 RSERVED1[30]; vu32 ISPR[2]; u32 RESERVED2[30]; vu32 ICPR[2]; u32 RESERVED3[30]; vu32 IABR[2]; u32 RESERVED4[62]; vu32 IPR[15]; } NVIC_TypeDef;
对寄存器进行介绍:
ISER[2]:中断使能寄存器组(2个32位寄存器,可以表示60个可屏蔽中断)
ICER[2]:中断失能寄存器组
ISPR[2]:中断挂起控制寄存器组
ICPR[2]:中断解挂控制寄存器组
IABR[2]:中断激活标志位寄存器组(只读,通过它可以知道当前在执行的中断是哪一个)
IPR[15]:中断优先级控制的寄存器组(设置各个中断的抢占和响应优先级)
STM32 的中断分组
第0组:所有4位用于指定响应优先级(16种)
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级(8种)
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级(4种)
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级(2种)
第4组:所有4位用于指定抢占式优先级
我的理解是中断分组对各个中断会有一个限制,比如使用第0组只能存在一个抢占优先级。
抢占优先级>响应优先级
不同的抢占优先级可以存在中断抢占,不同的响应优先级不可以抢占。
一个例子说明
void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority --------------------------- */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* UART1 --------------------------------------------------------------- */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* UART2 -------------------------------------------------------------- */ NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
优先分组是0组,说明只能存在响应优先级,互相之间不能被打断,而当两个任务同时发生时,UART2 会先响应。
相关文章推荐
- JQuery的基本用法总结
- mongodb简介与增删该查
- Ubuntu 文件备份问题
- web页面实现拨打电话,发短信等功能
- linux下so动态库一些不为人知的秘密
- spring+springMVC+Mybatis整合
- sdk和ndk
- 五子棋AI算法第四篇-启发式搜索函数
- Linux用户管理
- keepalived+haproxy实现web服务的高可用和负载均衡
- Windows下Python安装NumPy、Scipy、matplotlib模块
- Eclipse反编译工具Jad及插件JadClipse配置
- Java通过Zxing生成二维码
- C# 实现C/C++共同体简单应用
- 性能测试基础知识
- leetcode笔记:Word Pattern
- 转:一个banner仔的自我修养(1) ——字体字形篇
- navicat for mysql (10038)如何解决,远程无法连接问题
- 网络攻防技术与实践
- jQuery.extend 函数详解