打印

stm32中断优先级的定义

[复制链接]
7656|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zly0123yz|  楼主 | 2013-9-24 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
老是在stm32中的中断优先级上犯错。所以决定学习下这玩意的定义。查找了下以前的资料,发现以前就有下载过一个说明。哀活该我被坑啊~~~
NVIC_PriorityGroupConfig()说明.rar (12.02 KB)
沙发
feilusia| | 2013-9-24 16:03 | 只看该作者
其实说起来很简单。
NVIC: M3内核允许8bit做优先级分组设置,而STM32只有4bit可以设置。
AIRCR寄存器的4个位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
例:定义为第二组,抢占式优先级2bit,响应式优先级2bit,2bit共可有4种状态,也就是总共能设置4*4=16个中断优先级。
定义为第三组,抢占式优先级3bit,响应式优先级1bit,也就是总共能设置8*2=16个中断优先级。

使用特权

评论回复
板凳
fdcjjrxl| | 2013-9-24 16:18 | 只看该作者
请问这个NVIC_PriorityGroupConfig函数在哪个库文件中定义的呀?

使用特权

评论回复
地板
feilusia| | 2013-9-24 16:22 | 只看该作者
fdcjjrxl 发表于 2013-9-24 16:18
请问这个NVIC_PriorityGroupConfig函数在哪个库文件中定义的呀?

misc.c

使用特权

评论回复
5
fdcjjrxl| | 2013-9-24 16:33 | 只看该作者
我在F0的库文件misc.c中没找到这个NVIC_PriorityGroupConfig函数呀,唯一提到这个函数的是下面这段注释

/**
  * @brief  Initializes the NVIC peripheral according to the specified
  *         parameters in the NVIC_InitStruct.
  * @NOTE   To configure interrupts priority correctly, the NVIC_PriorityGroupConfig()
  *         function should be called before.   
  * @param  NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains
  *         the configuration information for the specified NVIC peripheral.
  * @retval None
  */
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

使用特权

评论回复
6
zly0123yz|  楼主 | 2013-9-24 16:36 | 只看该作者
本帖最后由 zly0123yz 于 2013-9-24 17:07 编辑
fdcjjrxl 发表于 2013-9-24 16:33
我在F0的库文件misc.c中没找到这个NVIC_PriorityGroupConfig函数呀,唯一提到这个函数的是下面这段注释

/* ...

其实就一句话修改  SCB->AIRCR 的值撒

使用特权

评论回复
7
feilusia| | 2013-9-24 16:56 | 只看该作者
fdcjjrxl 发表于 2013-9-24 16:33
我在F0的库文件misc.c中没找到这个NVIC_PriorityGroupConfig函数呀,唯一提到这个函数的是下面这段注释

/* ...

V3.5的库里有
/**
  * @brief  Configures the priority grouping: pre-emption priority and subpriority.
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length.
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

使用特权

评论回复
8
zly0123yz|  楼主 | 2013-9-24 17:07 | 只看该作者
楼上正解~

使用特权

评论回复
9
fdcjjrxl| | 2013-9-24 17:26 | 只看该作者
那我F0的discovery开发板可以使用V3.5的这个库吗?
具体在我那个EXTI0的中断处理函数中,应该怎么修改就可以使用SysTick的延时函数呢?

使用特权

评论回复
10
zly0123yz|  楼主 | 2013-9-24 17:37 | 只看该作者
fdcjjrxl 发表于 2013-9-24 17:26
那我F0的discovery开发板可以使用V3.5的这个库吗?
具体在我那个EXTI0的中断处理函数中,应该怎么修改就可 ...

你把你EXTI0的抢断优先级降低就ok了

使用特权

评论回复
11
hkcj| | 2013-9-24 19:03 | 只看该作者
试试楼主的方法   应该是可行的

使用特权

评论回复
12
zly0123yz|  楼主 | 2013-9-24 19:13 | 只看该作者
hkcj 发表于 2013-9-24 19:03
试试楼主的方法   应该是可行的

擦。。。之前是马甲?

使用特权

评论回复
13
fdcjjrxl| | 2013-9-25 08:03 | 只看该作者
F0中就看到一个NVIC_IRQChannelPriority设置,将它从0改为2以后,仍然不能在中断处理函数中执行SysTick。

void EXTI0_Config(void)
{
  EXTI_InitTypeDef   EXTI_InitStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
  
  /* Enable GPIOA clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  /* Configure PA0 pin as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  
  /* Connect EXTI0 Line to PA0 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

  /* Configure EXTI0 line */
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI0 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
14
feilusia| | 2013-9-25 08:37 | 只看该作者
你漏设置了副优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =

使用特权

评论回复
15
zly0123yz|  楼主 | 2013-9-25 08:46 | 只看该作者
feilusia 发表于 2013-9-25 08:37
你漏设置了副优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =

NVIC_IRQChannelSubPriority 不是副优先级是主优先级吧。

使用特权

评论回复
16
feilusia| | 2013-9-25 09:03 | 只看该作者
zly0123yz 发表于 2013-9-25 08:46
NVIC_IRQChannelSubPriority 不是副优先级是主优先级吧。

你百度搜下吧,是副优先级

使用特权

评论回复
17
zly0123yz|  楼主 | 2013-9-25 09:15 | 只看该作者
feilusia 发表于 2013-9-25 09:03
你百度搜下吧,是副优先级

他貌似两个都没设啊。。。。我说看的怎么这么怪呢
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
        NVIC_InitStructure.NVIC_IRQChannelSubPriority

使用特权

评论回复
18
zly0123yz|  楼主 | 2013-9-25 09:16 | 只看该作者
fdcjjrxl 发表于 2013-9-25 08:03
F0中就看到一个NVIC_IRQChannelPriority设置,将它从0改为2以后,仍然不能在中断处理函数中执行SysTick。

...

你优先级只是分类了。并没有设置啊
设置是
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
        NVIC_InitStructure.NVIC_IRQChannelSubPriority
这两个。。。

使用特权

评论回复
19
fdcjjrxl| | 2013-9-25 09:20 | 只看该作者
终于搞清楚了,F0固件库中core_cm0.h定义了SysTick的中断优先级是最低的3,我把它的优先级改为1后(那个减1改成减3),再把EXTI0的中断优先级改为2或者3,就可以在EXTI0的中断处理函数中先执行SysTick中断了。
谢谢楼主!谢谢各位!

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

使用特权

评论回复
20
fdcjjrxl| | 2013-9-25 09:30 | 只看该作者
zly0123yz 发表于 2013-9-25 09:16
你优先级只是分类了。并没有设置啊
设置是
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriorit ...

您说的这两个是不是cortex-M3的设置呀,我直接学的M0,用的F0 discovery的板子,好像没有这两个设置

使用特权

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

本版积分规则

24

主题

420

帖子

0

粉丝