打印
[应用相关]

关于stm32的MY_NVIC_Init()中断管理函数的使用心得!

[复制链接]
957|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Pretext|  楼主 | 2022-9-14 14:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        有次在使用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) 函数的使用讲解就结束了。相信你也应该明白该怎么使用该函数了吧!  




使用特权

评论回复
沙发
地下縱情搖擺| | 2022-11-24 02:00 | 只看该作者
讲的挺好的,其实一般裸机运行的话,比较重要的是中断的

使用特权

评论回复
板凳
风吻过你的不羁| | 2022-11-24 02:32 | 只看该作者
中断如果用的好,其实和操作系统无异的

使用特权

评论回复
地板
討厭和人归類| | 2022-11-24 03:04 | 只看该作者
如果对顺序要求不高的话,其实中断优先级设置成一样也行,系统自己会有安排的

使用特权

评论回复
5
林间有新绿| | 2022-11-24 03:36 | 只看该作者
一般我都是分优先级的,不然理不清谁重要谁不重要

使用特权

评论回复
6
极客晨星| | 2022-11-24 04:08 | 只看该作者
对,我之前就以为优先级越高,数值越大呢,当初错误可没少犯,哈哈

使用特权

评论回复
7
銀河| | 2022-11-24 04:40 | 只看该作者
为啥中断分组是一致的啊?这块能详细讲解一下么

使用特权

评论回复
8
偷吻月亮| | 2022-11-24 05:12 | 只看该作者
原来是高的响应优先级不能打断低的响应优先级啊

使用特权

评论回复
9
岁月反驳| | 2022-11-24 05:44 | 只看该作者
得研究,因为中断可太重要了,用单片机一定要知道的

使用特权

评论回复
10
占得人间第一春| | 2022-11-24 06:16 | 只看该作者
感谢分享,我觉得讲的很清晰,很容易被理解

使用特权

评论回复
11
情和欲| | 2022-11-24 06:48 | 只看该作者
其实也可以用操作系统,应该跟中断差不多

使用特权

评论回复
12
Pretext|  楼主 | 2022-12-4 15:23 | 只看该作者
地下縱情搖擺 发表于 2022-11-24 02:00
讲的挺好的,其实一般裸机运行的话,比较重要的是中断的

对的,很多操作都涉及到中断的。

使用特权

评论回复
13
Pretext|  楼主 | 2022-12-4 15:24 | 只看该作者
风吻过你的不羁 发表于 2022-11-24 02:32
中断如果用的好,其实和操作系统无异的

运行上来说可能无异,但是代码上来说还是有很大的区别的!

使用特权

评论回复
14
Pretext|  楼主 | 2022-12-4 15:29 | 只看该作者
討厭和人归類 发表于 2022-11-24 03:04
如果对顺序要求不高的话,其实中断优先级设置成一样也行,系统自己会有安排的
...

设置成一样还是不太好的,因为有些中断就是需要有优先级的,虽然一般不会同时产生,但是还是要区分优先级!

使用特权

评论回复
15
Pretext|  楼主 | 2022-12-4 15:32 | 只看该作者
极客晨星 发表于 2022-11-24 04:08
对,我之前就以为优先级越高,数值越大呢,当初错误可没少犯,哈哈

有些操作系统确实是数值越大优先级越高。

使用特权

评论回复
16
Pretext|  楼主 | 2022-12-4 15:37 | 只看该作者
情和欲 发表于 2022-11-24 06:48
其实也可以用操作系统,应该跟中断差不多

裸机是学习单片机的第一步,后面才是操作系统。

使用特权

评论回复
17
Pretext|  楼主 | 2022-12-4 15:38 | 只看该作者
占得人间第一春 发表于 2022-11-24 06:16
感谢分享,我觉得讲的很清晰,很容易被理解

让大家听懂了才是这个教程存在的意义。

使用特权

评论回复
18
Pretext|  楼主 | 2022-12-4 15:41 | 只看该作者
林间有新绿 发表于 2022-11-24 03:36
一般我都是分优先级的,不然理不清谁重要谁不重要

是的,而且设计优先级最好用宏定义,这样更容易对比出来!

使用特权

评论回复
19
MessageRing| | 2022-12-6 14:24 | 只看该作者
中断优先级设置成一样也行

使用特权

评论回复
20
Stahan| | 2022-12-6 14:55 | 只看该作者
高的响应优先级不能打断低的响应优先级

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

2032

帖子

1

粉丝