完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
开始稍微带一点点质量的博客生涯——准备记录研究生所学的内容了
对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 有手表栏真的是太方便了。这里写了~ |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:04 , Processed in 1.399459 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号