<原创声明:本文属博主原创,禁止一切形式的转载、抄袭>
在用单片机做数据采集或者控制的时候,有时候需要一个工程开好几个中断,去同时控制舵机、电机、串口数据收发等等,这时候就需要对这若干个中断进行等级划分。
1. STM32的抢占优先级和响应优先级:
中断优先级寄存器NVIC_IPRx,本寄存器宽度为8位,原则上每个外部中断可配置的优先级为0~255,实际上精简了,只用到了它的高4位。这4位,又被分成了抢占优先级和响应优先级两组:
(1)抢占属性:就是打断其它正在执行的中断,这时就出现了中断嵌套。抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
(2)响应属性:如果两个中断的抢占优先级相同,并且他们同时申请中断,那么该怎么办呢?则响应属性较高的中断优先处理。响应属性由抢占属性由NVIC_IRQChannelSubPriority 的参数配置。
2.中断数量种类:
NVIC由四位二进制数字来表示。4位二进制表示抢占优先级和响应优先级,用Q表示抢占优先级,用X表示响应优先级,那么4位二进制进行中断配置有以下5种方式:
(1) XXXX: 4位全部用来配置响应优先级,16种中断向量都具有不同的响应优先级;
(2) QXXX:抢占优先级有两种,编号0或1,响应优先级有8种;
(3) QQXX;
(4) QQQX;
(5) QQQQ;
用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n)选择中断数量种类(n可取值0~4);
(注:编号越小,优先级别越高;)
要想配置以上优先级,调用库函数NVIC_PriorityGroupConfig(),输入的参数可以是NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别对应以上介绍的5种分配组;
3.
当中断数量超过16时,那么至少有两个中断向量是使用相同的中断种类,具有相同中断种类的中断向量不能互相嵌套。抢占优先级和响应优先级都相同,则比较它们的硬件中断编号,中断编号越小,优先级越高。(硬件中断编号从中断向量表当中查看)
4.eg:
Int main(void){
......//省略若干
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2,两位抢占优先级,两位响应优先级;有2^2=4种抢占优先级,4种响应优先级。
......
}
void uart_init(u32 bound){
......
//********************Usart1 NVIC串口配置*****************************
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能;
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化NVIC寄存器;
......
}
<原创声明:本文属博主原创,禁止一切形式的转载、抄袭>