用ST的HAL库后,被绕晕了,这样编程真的好吗?

2019-12-19 18:09发布

用的 STM32L053R8,其中设置CPU的内核电压这一个语句:
        __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
看到这个语句,先找 PWR_REGULATOR_VOLTAGE_SCALE1,如下:
        #define PWR_REGULATOR_VOLTAGE_SCALE1   PWR_CR_VOS_0
然后:
        #define PWR_CR_VOS_0               (0x1U << PWR_CR_VOS_Pos)                    /*!< 0x00000800 */
再然后:
        #define PWR_CR_VOS_Pos             (11U)   
,,,,,,
再找 __HAL_PWR_VOLTAGESCALING_CONFIG 的定义:
        #define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) (MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)))
然后:
        #define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
再然后:
        #define WRITE_REG(REG, VAL)   ((REG) = (VAL))
,,,,,,
等等,还没完,PWR_CR_VOS 是什么?再找:
        #define PWR_CR_VOS_Msk             (0x3U << PWR_CR_VOS_Pos)
        #define PWR_CR_VOS                 PWR_CR_VOS_Msk





以上所有的语句、定义,看了半天,其实加起来就为了实现将 PWR_CR 寄存器的11、12位写为 01 ,用语句表示如下:
        PWR->CR = (PWR->CR & (~0x00001800u)) | 0x00000800u;




呃,我不确定,这样真的“更简单”?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
94条回答
gwnpeter
1楼-- · 2019-12-21 14:23
 精彩回答 2  元偷偷看……
mint
2楼-- · 2019-12-21 16:08
毕竟官方的,现在新项目(内部工具用)就上了 HAL ,坑不少,(如 M7 的 USB CDC 因为 堆栈的分配太小导致 USB 无法枚举成功,这个让我找了好几天,,,)一般碰到问题就去官方社区交流,

一部分可以找到答案,

一部分自问自答,

意识到生态的重要了,大家都再帮 ST 找 bug 额,,,,

不过,写底层驱动真的很爽(还有移植 CMSIS OS,文件系统之类的),只要你知道你需要如何配置的,维护一个 MX 配置就可以了,,,

让不知其所以然的也可以先跑起来,然后有需要再深入理解自己那部分,这个应该是 MX 带来的最大的可能性。

可以花一两个月折腾感受下,然后再看看,,,
security
3楼-- · 2019-12-21 16:19
wye11083 发表于 2017-9-4 18:21
其实是为了兼容性。毕竟不可能搞出来几百套STM32Cube。

兼容性只是其中一点,其实就算只有一个硬件,对于一个合格的 sdk,也需要这么做。需要屏蔽掉硬件的实现细节或差异,让开发者不过多关注硬件细节,尽可能的快速开发。
lixin91985
4楼-- · 2019-12-21 21:59
用过CYPRESS 才知道ST落后很多了。。 IDE 全整合,图形配置,代码编辑,编译。

即使这样,我还是经常需要操作寄存器。
fuquan_dai
5楼-- · 2019-12-21 22:30
因为stm的标准库喜欢上stm32,因为HAL库觉得有必要放弃stm32了。。。
jingwaner
6楼-- · 2019-12-21 23:40
 精彩回答 2  元偷偷看……

一周热门 更多>