单片机学习小组
直播中

刘丹

7年用户 1486经验值
私信 关注

CortexM4内核Stm32-HAL_NVIC_SetPriorityGrouping()是什么?

CortexM4内核STM32-HAL_NVIC_SetPriorityGrouping()是什么?

回帖(1)

李晓欢

2022-1-26 10:11:56
开始稍微带一点点质量的博客生涯——准备记录研究生所学的内容了


对32的学习还是比较感兴趣,想对一个内核进行深刻的理解,所以想更深层次的去理解,很佩服32HAL库代码的可读性~


废话不多说,开始主题:


HAL库在main函数中会有一个HAL_Init()
其具体如下


HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch, Instruction cache, Data cache */
#if (INSTRUCTION_CACHE_ENABLE != 0U)
  __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif /* INSTRUCTION_CACHE_ENABLE */


#if (DATA_CACHE_ENABLE != 0U)
  __HAL_FLASH_DATA_CACHE_ENABLE();
#endif /* DATA_CACHE_ENABLE */


#if (PREFETCH_ENABLE != 0U)
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE */


  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);


  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);


  /* Init the low level hardware */
  HAL_MspInit();


  /* Return function status */
  return HAL_OK;
}


INSTRUCTION_CACHE_ENABLE、DATA_CACHE_ENABLE和PREFETCH_ENABLE分别在stm32f4xx_hal_conf.h处定义。
完成flash设置后,
便进入到HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);函数中


void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
  NVIC_SetPriorityGrouping(PriorityGroup);
}


带HAL_前缀的往往会使用assert_param函数进行检验,可以双击IS_NVIC_PRIORITY_GROUP按F12查看符合要求的参数有哪些。这里就不讲了。
然后进入到中断分组设置函数。


__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{
  uint32_t reg_value;
  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */


  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */
  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */
  reg_value  =  (reg_value                                   |
                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)  );              /* Insert write key and priority group */
  SCB->AIRCR =  reg_value;
}


首先是定义局部变量reg_value和PriorityGroupTmp,后者是读取中断分组的后三位。
默认分组为NVIC_PRIORITYGROUP_2,可以看图。


#define NVIC_PRIORITYGROUP_2         0x00000005U /*!< 2 bits for pre-emption priority
                                                      2 bits for subpriority */



然后是SCB->AIRCR对进行操作

该重新在31-16位只读为0XFA05,写入为0x05FA,10 ~8 位是使用分组reg_value 应该获取资助值(0XFA05 0000),然后SCB_AIRCR_VECTKEY_Msk
和使用SCB_AIRCR_PRIGROUP_Msk 使reg_value 清零。再将到达目的地的。再将优先组Tmp(发现存储
高16位)定位到10~8位,及对之后的属性值的设置。其实搞完,自己也不是太菜了。今天。主要学到的内容不是最重要的。但是学会开始STM32F3与F4系列Cortex M4内核编程手册(虽然是全中文,慢慢还是看得懂的),学32,遇到的不明白的keli debug 3xx 就在 STM 中文范围看编译栏时不会出现,可以降低等级,优先等级改为 0,默认为 0。debug 有手表栏真的是太方便了。这里写了~




举报

更多回帖

发帖
×
20
完善资料,
赚取积分