有次在使用stm32做项目时,遇到要用2个定时器及其中断服务程序的情况。这样就需要使用函数MY_NVIC_Init(NVIC_PreemptioPriority,NVIC_SubPriority,NVIC_Channel,NVIC_Group)对两个中断服务的优先级进行设定了。最开始,这个函数看得我是一头雾水,无从着手,仔细研究了一会才明白该如何使用了。相信很多新手同学会和我有类似的经历吧,为了方便大家的学习和工作,特将此函数在此讲述一番,希望对大家有帮助(注:本文章的作用仅在于使新手学会使用stm32的中断管理函数,不能达到深入理解目的)!
1、对各个参数的解释:
(1)NVIC_PreemptionPriority:这个参数是用来设定抢占优先级的
(2)NVIC_SubPriority:这个参数是用来设定响应优先级的
(3)NVIC_Channel:这个参数是用来设定中断编号的(范围是0~59)
(4)NVIC_Group:这个参数是用来设定中断分组的(范围是0~4)
2、关于NVIC_PreemptionPriority和NVIC_SubPriority的设定范围的说明,参下表:
看了此图,大概就能明白一个问题,就是NVIC_PreemptionPriority和NVIC_SubPriority的设定是和NVIC_Group
这个参数的值有关的,这也是上文没有给出它们的取值范围的原因。
举例:若选取组2(即参数NVIC_Group的值为2),那么NVIC_PreemptionPriority和NVIC_SubPriority的范围是多少呢?
答:从上表横向第4栏可以看出,分配结果为:2 位抢占优先级,2 位响应优先级,故抢占优先级和响应优先级
的范围均为0~3(即二进制的00~11).同理若选取组3,则抢占优先级的范围为0~7(即二进制的000~111),响应优先级的范围为0~1(因为此时响应优先级只占一位,故非0即1).
3、关于各参数选取的原则及作用:
看了1和2的叙述后,大家只能知晓各参数的选取范围,从而能有效避免取值时的“越界”现象。下面再讲下取
值的原则和作用。以中断服务A和中断服务B同时出现在项目里为例:
(1)对于NVIC_Group要注意:在一个工程代码里,所有的中断分组都要一致!即若在A中NVIC_Group
的值为2,那么在B中NVIC_Group的值也应为2,否则可能发生错误!具体关于NVIC_Group的值的选取也要
参照上表,由抢占优先级和响应优先级的取值范围要求来定。
(2)对于抢占优先级和响应优先级是值越小则优先级越高!
(3)如果A、B两个中断的抢占优先级和响应优先级取值均一样的话,则看哪个中断先发生就先执行哪个中断服务。
举例:A_INTERRUPT为MY_NVIC_Init(1, 2, 0, 2);
B_INTERRUPT为MY_NVIC_Init(1, 2, 1, 2);
那么A和B谁先发生,就先执行哪个中断服务。
(4)抢占优先级较高的中断可以打断正在进行的抢占优先级较低的中断服务,但对于抢占优先级相同的中断,较
高的响应优先级不可以打断正在进行的较低的响应优先级中断。
举例:A_INTERRUPT为MY_NVIC_Init(1, 2, 0, 2);
B_INTERRUPT为MY_NVIC_Init(1, 3, 1, 2);
若中断服务B正在进行中时,中断服务A也发生了,那么B不会被A打断,因为它们的抢占优先级相同(尽管A的
响应优先级要比B高)。
4、结束语:
到此,关于void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8
NVIC_Group) 函数的使用讲解就结束了。相信你也应该明白该怎么使用该函数了吧!
|