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