注册 登录
查看: 8944|回复: 78

[K60] Coertx-M4系列中断嵌套、优先级说明(新增M0+系列说明)

  [复制链接]
发表于 2013-10-12 17:32:28 | 显示全部楼层 |阅读模式
需要用CMSIS库的两个函数配置中断优先级(另外一个实现中断使能)

设置优先级分组:
  1. voidvoid NVIC_SetPriorityGrouping(uint32_t PriorityGroup)

PriorityGroup范围为0 ~ 4,共5组

优先级设置函数:
  1. void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

priority范围为0 ~ 15, prio越低,则优先级越高 (4bit)

使能中断函数:
  1. void NVIC_EnableIRQ(IRQn_Type IRQn)



优先级可分为 抢占优先级 (4bit 里的高位) ,和 亚优先级(4bit 里的低位)
只有 抢占优先级 高的 才可以 打断低抢占优先级的 中断,形成 中断嵌套。

NVIC_SetPriorityGrouping 就是指定如何在 4bit 优先级里区分 抢占优先级 和 亚优先级。
PriorityGroup 范围为 NVIC_PriorityGroup_0~ NVIC_PriorityGroup_4 :
PriorityGroup = NVIC_PriorityGroup_0表示 0bit 抢占优先级  ,4bit 亚优先级
PriorityGroup = NVIC_PriorityGroup_1表示 1bit 抢占优先级  ,3bit 亚优先级 (2个抢占优先级)
如此类推……

NVIC_PriorityGroup_n 的定义如下:
  1. #define NVIC_PriorityGroup_0          ((uint32)0x7) /* 0 bits for pre-emption priority
  2.                                                       4 bits for subpriority */
  3. #define NVIC_PriorityGroup_1          ((uint32)0x6) /* 1 bits for pre-emption priority
  4.                                                       3 bits for subpriority */
  5. #define NVIC_PriorityGroup_2          ((uint32)0x5) /* 2 bits for pre-emption priority
  6.                                                       2 bits for subpriority */
  7. #define NVIC_PriorityGroup_3          ((uint32)0x4) /* 3 bits for pre-emption priority
  8.                                                       1 bits for subpriority */
  9. #define NVIC_PriorityGroup_4          ((uint32)0x3) /* 4 bits for pre-emption priority
  10.                                                       0 bits for subpriority */

不管 PriorityGroup  是多少,4bit 就意味着 priority 的范围从 0~15
高 PriorityGroup 位就是抢占优先级,低 4 - PriorityGroup  位就是亚优先级
NVIC_PriorityGroup_1时:


Cortex-M0+ 不需要设置优先级分组,只有4个中断优先级可选

=================================================================
对K60而言,先NVIC_SetPriorityGrouping 设置优先级分组,一般直接配置为NVIC_PriorityGroup_4,即4bit抢占优先级,那么就有16个中断嵌套。然后再用 NVIC_SetPriority 设置优先级,然后再使能中断。
关于优先级分组,就是4bit的寄存器,高的是抢占优先级 ,低的是亚优先级,然后像切蛋糕那样,看我们怎么切开两份。

KL26 是没有优先级分组的,全部都是抢占优先级,不需要我们分的。只有2bit的!换句话说,KL26一般常用就是这两个函数:

优先级设置函数:
  1. void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

priority范围为0 ~ 15, prio越低,则优先级越高 (4bit)

使能中断函数:
  1. void NVIC_EnableIRQ(IRQn_Type IRQn)



===============================
下面是K60的摄像头例程的优先级设置的代码:
PORTA_IRQn 的 优先级最高。

  1.     /************************ 配置 K60 的优先级  ***********************/
  2.     //K60 的默认优先级 都为 0
  3.     //参考帖子:急求中断嵌套的例程 - 智能车讨论区 - 山外-vcan123论坛
  4.     //          http://www.vcan123.com/forum.php?mod=viewthread&tid=499&page=1#pid3270
  5.     NVIC_SetPriorityGrouping(<span style="font-size: 14px; line-height: 1.5;">NVIC_PriorityGroup_</span><span style="font-size: 14px; line-height: 1.5;">4);            //设置优先级分组,4bit 抢占优先级,没有亚优先级</span>

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2014-1-20 17:27:26 | 显示全部楼层
VisDream 发表于 2014-1-19 21:04
这么经典的贴,居然这么少的回复!不过,山外哥你说的太抽象了,怎么实现了,有简单的例子来做抢占式优先级的 ...

就两个函数,比较容易吧,还需要例子?

第一个是 设置分组,第二个是 设置优先级
回复 支持 1 反对 0

使用道具 举报

发表于 2014-4-11 00:43:28 | 显示全部楼层
倾城 发表于 2014-4-11 00:37
山外哥,新的底层与老的底层在功能上有什么区别吗?为什么更新了底层呢?有没有必要更换底层呢?

另外,新版本配套视频,应该更适合新人学习的。
回复 支持 0 反对 1

使用道具 举报

发表于 2013-10-13 15:52:44 | 显示全部楼层
由于中断嵌套函数写在core_cm4.h这个头文件中。所以在main函数前面加了#include “core_cm4.h”。
但是编译的时候出现好多错误。都是说core_cm4.h中的一些东东没定义的。求解

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

你好,请问这个问题怎么解决?  发表于 2014-7-13 18:15
回复 支持 反对

使用道具 举报

发表于 2013-10-17 10:32:09 | 显示全部楼层
旧库需要注释掉  arm_math.h 文件的这一行代码:

  1. #define __CMSIS_GENERIC              /* disable NVIC and Systick functions */
回复 支持 反对

使用道具 举报

发表于 2014-1-19 21:04:05 | 显示全部楼层
这么经典的贴,居然这么少的回复!不过,山外哥你说的太抽象了,怎么实现了,有简单的例子来做抢占式优先级的设定吗
回复 支持 反对

使用道具 举报

发表于 2014-1-20 17:29:45 | 显示全部楼层
VisDream 发表于 2014-1-19 21:04
这么经典的贴,居然这么少的回复!不过,山外哥你说的太抽象了,怎么实现了,有简单的例子来做抢占式优先级的 ...

现在搞着 KL,KL 没有分组 ,来过设置优先级的函数
  1.     NVIC_SetPriority(PORTA_IRQn,0);         //配置优先级
  2.     NVIC_SetPriority(PORTC_PORTD_IRQn,1);         //配置优先级
  3.     NVIC_SetPriority(DMA0_IRQn,2);          //配置优先级
  4.     NVIC_SetPriority(PIT_IRQn,3);          //配置优先级
回复 支持 反对

使用道具 举报

发表于 2014-1-31 04:43:50 | 显示全部楼层
吕一瑾 发表于 2014-1-20 17:27
就两个函数,比较容易吧,还需要例子?

第一个是 设置分组,第二个是 设置优先级

这样不行,效果是一样的
回复 支持 反对

使用道具 举报

发表于 2014-1-31 11:00:39 | 显示全部楼层
VisDream 发表于 2014-1-31 04:43
这样不行,效果是一样的

为何不行?你如何测试的?0 是最高优先级的哦!
回复 支持 反对

使用道具 举报

发表于 2014-2-27 13:42:13 | 显示全部楼层
是不是PriorityGroup = 0得对应priority范围为0 ;PriorityGroup =1 得对应priority范围为0~1 ;PriorityGroup = 2得对应priority范围为0 ~3riorityGroup = 3得对应priority范围为0~7 以此类推呀
回复 支持 反对

使用道具 举报

发表于 2014-3-9 00:25:19 | 显示全部楼层
山外哥,,,这个有点抽象哇,,,对于第一次接触K60来说,有点雾水,,,,,可以给出一份完整的中断嵌套的程序设置么?时间有点急迫,,,才如此急迫,,,希望理解
回复 支持 反对

使用道具 举报

发表于 2014-3-9 11:41:08 | 显示全部楼层
小钟 发表于 2014-3-9 00:25
山外哥,,,这个有点抽象哇,,,对于第一次接触K60来说,有点雾水,,,,,可以给出一份完整的中断嵌套的程 ...

直接调用就行,这些函数都是我们提供的工程里自带的啊!!
摄像头无线调试的那个例程就有展示配置中断优先级
回复 支持 反对

使用道具 举报

发表于 2014-4-5 15:42:19 | 显示全部楼层
山外メ雲ジ 发表于 2014-1-31 11:00
为何不行?你如何测试的?0 是最高优先级的哦!

山外哥,请问直立平衡和摄像头DMA谁的优先级应该更高?不设置优先级可以吗?
回复 支持 反对

使用道具 举报

发表于 2014-4-10 22:28:40 | 显示全部楼层
山外メ雲ジ 发表于 2014-3-9 11:41
直接调用就行,这些函数都是我们提供的工程里自带的啊!!
摄像头无线调试的那个例程就有展示配置中断优 ...

请问一下,我把PriorityGroup设为4,在下面设置void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)时,需要把所有的中断都重新定义一下优先级吗?我可不可以这么写

NVIC_SetPriorityGrouping(4);
NVIC_SetPriority(88,7);   //PTB中断
NVIC_SetPriority(68,8);

还有,我没找到void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)这个函数,只找到了void set_irq_priority (int, int);这个函数,他们两个是通用的吗
回复 支持 反对

使用道具 举报

发表于 2014-4-10 22:36:41 | 显示全部楼层
倾城 发表于 2014-4-10 22:28
请问一下,我把PriorityGroup设为4,在下面设置void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priorit ...

有的啊,山外哥的代码:set_irq_priority  就是 NVIC_SetPriority,宏定义而已
回复 支持 反对

使用道具 举报

发表于 2014-4-10 23:21:34 | 显示全部楼层
康锦 发表于 2014-4-10 22:36
有的啊,山外哥的代码:set_irq_priority  就是 NVIC_SetPriority,宏定义而已

那我改变中断优先级时,可不可以就这么写

NVIC_SetPriorityGrouping(4);
NVIC_SetPriority(88,7);   //PTB中断
NVIC_SetPriority(68,8);   //PIT中断

我不用的中断我不修改优先级,能行吗?会不会使我修改后的中断与原该等级的中断发生冲突
回复 支持 反对

使用道具 举报

发表于 2014-4-10 23:28:49 | 显示全部楼层
倾城 发表于 2014-4-10 23:21
那我改变中断优先级时,可不可以就这么写

NVIC_SetPriorityGrouping(4);

你用的好像是旧版本代码吧?不是一天攻破的代码。可以那样做啊
回复 支持 反对

使用道具 举报

发表于 2014-4-11 00:35:20 | 显示全部楼层
栾端静 发表于 2014-4-10 23:28
你用的好像是旧版本代码吧?不是一天攻破的代码。可以那样做啊

哦哦,是这样啊,我不知道有新的底层代码,不过不知道有没有什么变动,原来的底层有bug吗?
回复 支持 反对

使用道具 举报

发表于 2014-4-11 00:37:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-3-9 11:41
直接调用就行,这些函数都是我们提供的工程里自带的啊!!
摄像头无线调试的那个例程就有展示配置中断优 ...

山外哥,新的底层与老的底层在功能上有什么区别吗?为什么更新了底层呢?有没有必要更换底层呢?
回复 支持 反对

使用道具 举报

发表于 2014-4-11 00:42:42 | 显示全部楼层
倾城 发表于 2014-4-11 00:37
山外哥,新的底层与老的底层在功能上有什么区别吗?为什么更新了底层呢?有没有必要更换底层呢?

旧版本的架构不够清晰,很多人学起来觉得乱。
另外,旧版本的代码也有很多bug,所以我们重新来写,加入了比较多的注释,更适合新手来学。
回复 支持 反对

使用道具 举报

发表于 2014-4-12 21:52:12 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-4-13 21:55:51 | 显示全部楼层
山外的新工程不能查看函数的定义,是神马情况啊?
回复 支持 反对

使用道具 举报

发表于 2014-4-16 02:26:41 | 显示全部楼层
山外メ雲ジ 发表于 2014-4-11 00:43
另外,新版本配套视频,应该更适合新人学习的。

山外哥,老版本是不是不能对8个引脚同时赋值,我看到了函数,但是用的时候,只有一个有输出
回复 支持 反对

使用道具 举报

发表于 2014-4-16 11:40:49 | 显示全部楼层
哥哥冇钱 发表于 2014-4-13 21:55
山外的新工程不能查看函数的定义,是神马情况啊?

跟代码没关系,跟IAR有关系。编写代码,用山外哥推荐的编辑器吧
回复 支持 反对

使用道具 举报

发表于 2014-4-16 11:41:44 | 显示全部楼层
倾城 发表于 2014-4-16 02:26
山外哥,老版本是不是不能对8个引脚同时赋值,我看到了函数,但是用的时候,只有一个有输出

老版本好像也有专门的函数的吧。看你怎么调用而已。
回复 支持 反对

使用道具 举报

发表于 2014-4-17 23:02:28 | 显示全部楼层
栾端静 发表于 2014-4-16 11:41
老版本好像也有专门的函数的吧。看你怎么调用而已。

请教你个问题,为什么编码器输出有毛刺,我用的是500线的,而且还出现了周期性的扰动

回复 支持 反对

使用道具 举报

发表于 2014-5-5 13:48:05 | 显示全部楼层
请问用cmsis的库资料在哪里啊 怎么我找不到的 求链接
回复 支持 反对

使用道具 举报

发表于 2014-5-5 18:59:17 | 显示全部楼层
没事了 原来我找错地方了
回复 支持 反对

使用道具 举报

发表于 2014-5-8 20:41:39 | 显示全部楼层
山外メ雲ジ 发表于 2014-3-9 11:41
直接调用就行,这些函数都是我们提供的工程里自带的啊!!
摄像头无线调试的那个例程就有展示配置中断优 ...

求指教,不知道什么问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-5-8 20:50:07 | 显示全部楼层
111xian 发表于 2014-5-8 20:41
求指教,不知道什么问题。

大哥,你写错函数啦!!!
回复 支持 反对

使用道具 举报

发表于 2014-5-8 21:16:45 | 显示全部楼层
锺离思涵 发表于 2014-5-8 20:50
大哥,你写错函数啦!!!

啊,真的写错了,
笑坏我的肚子了
回复 支持 反对

使用道具 举报

发表于 2014-5-8 21:18:53 | 显示全部楼层
栾端静 发表于 2014-4-16 11:41
老版本好像也有专门的函数的吧。看你怎么调用而已。

编码器采集脉冲,也要进行PIT中断定时吧,中断优先级,应该在DMA之前吧?
回复 支持 反对

使用道具 举报

发表于 2014-6-1 17:38:10 | 显示全部楼层
山外メ雲ジ 发表于 2013-10-17 10:32
需要注释掉  arm_math.h 文件的这一行代码:

去年发布的代码也需要注释掉这一句吗??
回复 支持 反对

使用道具 举报

发表于 2014-6-1 17:43:00 | 显示全部楼层
山外メ雲ジ 发表于 2014-3-9 11:41
直接调用就行,这些函数都是我们提供的工程里自带的啊!!
摄像头无线调试的那个例程就有展示配置中断优 ...

void set_irq_priority (int irq, int prio);里面的irq号是填写的什么啊,不是中断向量号。。。
回复 支持 反对

使用道具 举报

发表于 2014-6-1 17:43:39 | 显示全部楼层
栾端静 发表于 2014-4-10 23:28
你用的好像是旧版本代码吧?不是一天攻破的代码。可以那样做啊

旧版本void set_irq_priority (int irq, int prio);里面的irq号是填写的什么啊,不是中断向量号。。。
回复 支持 反对

使用道具 举报

发表于 2014-6-3 18:32:24 | 显示全部楼层
山外メ雲ジ 发表于 2013-10-17 10:32
需要注释掉  arm_math.h 文件的这一行代码:

编码器DMA的优先级是比PIT高好还是低好啊
回复 支持 反对

使用道具 举报

发表于 2014-7-6 19:58:35 | 显示全部楼层
darren0540 发表于 2013-10-13 15:52
由于中断嵌套函数写在core_cm4.h这个头文件中。所以在main函数前面加了#include “core_cm4.h”。
但是编译 ...

哥程序是添加到哪里的?
回复 支持 反对

使用道具 举报

发表于 2014-7-13 15:25:46 | 显示全部楼层
山外メ雲ジ 发表于 2013-10-17 10:32
旧库需要注释掉  arm_math.h 文件的这一行代码:

山外哥,在旧库里找不到这句呀,NVIC_SetPriorityGrouping(4);我应该怎么设置抢占优先级呢?————K60
回复 支持 反对

使用道具 举报

发表于 2014-7-13 15:40:29 | 显示全部楼层
倾城 发表于 2014-4-11 00:35
哦哦,是这样啊,我不知道有新的底层代码,不过不知道有没有什么变动,原来的底层有bug吗?

你好,想请问一下你旧版本库的优先级怎么设置呢?
回复 支持 反对

使用道具 举报

发表于 2014-7-13 15:42:17 | 显示全部楼层
栾端静 发表于 2014-4-16 11:40
跟代码没关系,跟IAR有关系。编写代码,用山外哥推荐的编辑器吧

你好,想请教一下你山外旧版本库的优先级怎么设置?
回复 支持 反对

使用道具 举报

发表于 2014-12-12 21:32:47 | 显示全部楼层
本帖最后由 龙龙 于 2014-12-12 21:36 编辑
山外メ雲ジ 发表于 2014-4-11 00:43
另外,新版本配套视频,应该更适合新人学习的。

为什么K60的中断默认优先级都是0,但中断向量表不是设置每个中断的优先级的吗????还有就是如果我的一个工程里面用到了多个中断,是不是必须得设置他们的优先级呢???
回复 支持 反对

使用道具 举报

发表于 2014-12-13 01:00:22 | 显示全部楼层
龙龙 发表于 2014-12-12 21:32
为什么K60的中断默认优先级都是0,但中断向量表不是设置每个中断的优先级的吗????还有就是如果我的一 ...

中断向量表是存储中断函数入口的地方,跟优先级没任何关系的。
回复 支持 反对

使用道具 举报

发表于 2014-12-21 21:39:51 | 显示全部楼层
小白同求,为什么编码器输出有毛刺,我用的是512线的,而且还出现了周期性的扰动,请大神指教
回复 支持 反对

使用道具 举报

发表于 2014-12-22 15:20:58 | 显示全部楼层
山外メ雲ジ 发表于 2014-1-31 11:00
为何不行?你如何测试的?0 是最高优先级的哦!

山外哥,K60的新库里的默认中断优先级在哪里
回复 支持 反对

使用道具 举报

发表于 2014-12-22 16:41:14 | 显示全部楼层
q515702604 发表于 2014-12-22 15:20
山外哥,K60的新库里的默认中断优先级在哪里

芯片内部配置,代码寄是没有配置的。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-23 11:32:41 | 显示全部楼层
山外メ雲ジ 发表于 1419237674
芯片内部配置,代码寄是没有配置的。
那默认的优先级是怎样的呢
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-23 11:44:09 | 显示全部楼层
q515702604 发表于 2014-12-23 11:32
那默认的优先级是怎样的呢

默认都是0,即最高优先级。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-23 11:49:29 | 显示全部楼层
在外部中断函数中执行程序期间,PIT定时器还计时吗?
例如:PIT计时5ms,一个外部中断服务函数执行需要1ms,进入外部中断时PIT是3ms,出来外部中断时PIT记得时间是3ms还是4ms?
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2015-3-15 09:50:53 | 显示全部楼层
我想问一下,KL26中PIT0和PIT1之间可以设置中断优先级吗?他们这间不是共用同一个中断号吗?如果可以该如何设置呢?
回复 支持 反对

使用道具 举报

发表于 2015-3-15 10:17:03 | 显示全部楼层
山外メ雲ジ 发表于 2014-4-11 00:43
另外,新版本配套视频,应该更适合新人学习的。

山外哥    为啥没用使能函数啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部