CortexM4内核Stm32-HAL_NVIC_SetPriorityGrouping()详解

开始稍微带一点点质量的博客生涯——准备记录研究生所学的内容了

对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寄存器进行操作
SCB->AIRCR寄存器
该寄存器在31-16位 只读为0XFA05,写入是0x05FA,10~8位是分组

使用reg_value读取该寄存器默认值(0XFA05 0000),然后使用SCB_AIRCR_VECTKEY_Msk和SCB_AIRCR_PRIGROUP_Msk使reg_value清零。
SCB_AIRCR_VECTKEY_Pos为矢量偏移,直接送到位上,比如说SCB_AIRCR_VECTKEY_Pos就是0x10,左移16位,可以送到寄存器的高16位。

再将PriorityGroupTmp(存储分组名)送到10~8位,及完成对reg_value的设置。

其实搞完之后,发现也不是很难,自己太菜了哈哈哈。
今天主要学到的内容不是最重要的。主要还是学会开始查STM32F3与F4系列Cortex M4内核编程手册(虽然是全英文,但是慢慢看还是看得懂的),学32,遇到不明白的寄存器,首先看STM32F4xx中文参考手册。

keli debug有时候watch栏会出现not in scope时,可以降低keil编译优先级,优先等级改为0,默认3。debug有watch栏真的是太方便了。今天就写道这里了~
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值