注册 登录
查看: 2466|回复: 11

急求中断嵌套的例程

[复制链接]
发表于 2013-7-17 22:06:37 | 显示全部楼层 |阅读模式
买了个山外的k60核心板,但是里面没有中断嵌套的例程,很是郁闷,研究了一下,发现中断嵌套的函数居然在M4核的头文件里,但是调用时,总是出错,很是郁闷。故急需一个中断嵌套的例程。很希望技术客服能尽快解决。
回复

使用道具 举报

发表于 2014-1-8 14:58:32 | 显示全部楼层
这个设置优先级组的函数 和设置优先级的函数在哪个里面调用啊?  实在初始化函数里面调用吗?  比如我要初始化定时器中断  就在pit_init()里面写着两个函数来设置优先级?
回复 支持 1 反对 0

使用道具 举报

发表于 2013-7-18 10:50:45 | 显示全部楼层
我们提供的例程,仅供参考,如果没有所需的,则需要自行实现。

提供参考思路:需要用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 范围为 0~ 4 :
PriorityGroup = 0表示 0bit 抢占优先级  ,4bit 亚优先级 (默认的,由于都是相同抢占优先级,所以不支持中断嵌套
PriorityGroup = 1表示 1bit 抢占优先级  ,3bit 亚优先级 (2个抢占优先级)
如此类推……


回复 支持 反对

使用道具 举报

发表于 2013-7-18 10:53:14 | 显示全部楼层
如果你不想用CMSIS库,我提取其中的源代码可供参考:
  1.     /** \brief  Set Priority Grouping

  2.       This function sets the priority grouping field using the required unlock sequence.
  3.       The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.
  4.       Only values from 0..7 are used.
  5.       In case of a conflict between priority grouping and available
  6.       priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.

  7.         \param [in]      PriorityGroup  Priority grouping field
  8.      */
  9.     static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  10.     {
  11.         uint32_t reg_value;
  12.         uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07);               /* only values 0..7 are used          */

  13.         reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
  14.         reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk);             /* clear bits to change               */
  15.         reg_value  =  (reg_value                                 |
  16.                        ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) |
  17.                        (PriorityGroupTmp << 8));                                     /* Insert write key and priorty group */
  18.         SCB->AIRCR =  reg_value;
  19.     }



  20.     /** \brief  Enable External Interrupt

  21.         This function enables a device specific interrupt in the NVIC interrupt controller.
  22.         The interrupt number cannot be a negative value.

  23.         \param [in]      IRQn  Number of the external interrupt to enable
  24.      */
  25.     static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
  26.     {
  27.         /*  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));  enable interrupt */
  28.         NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */
  29.     }


  30.     /** \brief  Set Interrupt Priority

  31.         This function sets the priority for the specified interrupt. The interrupt
  32.         number can be positive to specify an external (device specific)
  33.         interrupt, or negative to specify an internal (core) interrupt.

  34.         Note: The priority cannot be set for every core interrupt.

  35.         \param [in]      IRQn  Number of the interrupt for set priority
  36.         \param [in]  priority  Priority to set
  37.      */
  38.     static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
  39.     {
  40.         if(IRQn < 0)
  41.         {
  42.             SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);
  43.         } /* set Priority for Cortex-M  System Interrupts */
  44.         else
  45.         {
  46.             NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);
  47.         }        /* set Priority for device specific Interrupts  */
  48.     }
回复 支持 反对

使用道具 举报

发表于 2013-7-18 17:56:45 | 显示全部楼层
拿分走人呵呵,楼下继续!
回复 支持 反对

使用道具 举报

发表于 2014-1-8 17:09:18 | 显示全部楼层
阿粥。 发表于 2014-1-8 14:58
这个设置优先级组的函数 和设置优先级的函数在哪个里面调用啊?  实在初始化函数里面调用吗?  比如我要初始 ...

main 函数里 ,自己 调用啊。

回复 支持 反对

使用道具 举报

发表于 2014-3-22 15:05:59 | 显示全部楼层
MARK ,学习了!
回复 支持 反对

使用道具 举报

发表于 2014-5-13 22:05:13 | 显示全部楼层
王清铭 发表于 2014-1-8 17:09
main 函数里 ,自己 调用啊。

调用了就报错   这个不行啊    说未被宏定义
回复 支持 反对

使用道具 举报

发表于 2014-12-7 19:04:58 | 显示全部楼层
马克了
回复 支持 反对

使用道具 举报

发表于 2015-2-13 10:36:32 | 显示全部楼层
好帖子
回复 支持 反对

使用道具 举报

发表于 2015-3-5 11:58:13 | 显示全部楼层
Admin 发表于 2013-7-18 10:50
我们提供的例程,仅供参考,如果没有所需的,则需要自行实现。

提供参考思路:需要用CMSIS库的两个函数 ...

山外哥,麻烦问一下,是不是这个意思,如果设置PriorityGroup=2的话,那么共有2^2=4个抢占优先级2^2=4个亚优先级,priority=0~3为4个抢占优先级,而且数值越小,抢占优先级越高,priority=4~7为4个亚优先级,优先级相同,数值低的不能打断高的
回复 支持 反对

使用道具 举报

发表于 2016-11-8 17:13:39 | 显示全部楼层
涨知识了
回复 支持 反对

使用道具 举报

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

本版积分规则

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