STM32中断分配——抢占优先级与响应优先级

大一的时候学了C语言的代码,自己一个人两天做完了7个人一周的课设,写过200~300行的简单代码,于是好高骛远,跟着实验室老师做项目。老师看我也很拼,于是对我说:单片机这个东西其实很简单,51已经被淘汰了,STM32现在是主流,你就学STM32吧。于是我就学完了C语言基础就上手32了。结果可想而知,没有单片机的很多基础知识,学这种16位的较为复杂的单片机是很痛苦的,很多东西看上好几遍自己也理解不透,因为对最基本的概念没有清楚的认识。到了大三,学校开了51单片机+汇编这门课,系统的学习了8位单片机的内部结构,理解了定时器、串口、矩阵键盘的工作原理,再上手STM32就很容易了。
大一大二的时候,一直没有搞清楚抢占优先级和响应优先级的分配,直到系统的学完51单片机,对位、字节、字在单片机内部的作用有了清楚的认识。现在来捋一捋,希望能帮助到其它勤奋好学的同学,在用单片机做数据采集或者控制的时候,有时候需要一个工程开好几个中断,去同时控制舵机、电机、串口数据收发等等,这时候就需要对这若干个中断进行等级划分。
1. STM32的抢占优先级和响应优先级:
中断优先级寄存器NVIC_IPRx,本寄存器宽度为8位,原则上每个外部中断可配置的优先级为0~255,实际上精简了,只用到了它的高4位。这4位,又被分成了抢占优先级和响应优先级两组:

(1)抢占属性:就是打断其它正在执行的中断,这时就出现了中断嵌套。抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
(2)响应属性:如果两个中断的抢占优先级相同,并且他们同时申请中断,那么该怎么办呢?则响应属性较高的中断优先处理。响应属性由抢占属性由NVIC_IRQChannelSubPriority 的参数配置。
2.中断数量种类:
NVIC可以配置16种中断向量的优先级(不是16个),即2^4=16,由四位二进制数字来表示。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寄存器;
......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章