开始稍微带一点点质量的博客生涯——准备记录研究生所学的内容了
对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清零。
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栏真的是太方便了。今天就写道这里了~