用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条回答
EMC菜鸟
1楼-- · 2019-12-23 21:09
security 发表于 2017-9-4 18:02
增加注释,这个可以。
实际上,写成这样会更直观点:
PWR->CR = (PWR->CR & ~(BIT_11 | BIT_12)) | BIT_1 ...

这个好,以前一直没想到这种用法,简单粗暴直接!
security
2楼-- · 2019-12-24 00:58
redroof 发表于 2017-9-5 08:15
可读性最重要,绝大部分地方可读性甚至大于执行效率。更何况那一堆define到最后其实变成了跟直接写寄存器一 ...

是的,所以我在 4 楼,就说那代码是写给人的。
代码的客户,是人,
代码写得再复杂,机器照样 666 的看得懂,而我们却不行。
security
3楼-- · 2019-12-24 06:13
 精彩回答 2  元偷偷看……
EMC菜鸟
4楼-- · 2019-12-24 11:11
本帖最后由 EMC菜鸟 于 2017-9-5 08:32 编辑
security 发表于 2017-9-4 20:56
兼容性只是其中一点,其实就算只有一个硬件,对于一个合格的 sdk,也需要这么做。需要屏蔽掉硬件的实现细 ...


我觉得对电路板而言,这个方向并不一定正确,,,,,,我始终认为,电路板不是计算机,配置千差万别的,想屏蔽掉硬件是不可能的事情,简单一点来说,就设置一个内核的电压、在寄存器里设置两个位,真的象HAL库这样写更容易让使用者理解吗?除非是纯软件工程师来做嵌入式开发,否则但凡懂硬件的工程师,不可能更喜欢HAL库这种写法!
另:我始终不认为纯软件工程师能做好嵌入式软件,至少对我来说,不把处理器所有的寄存器了解一遍,我是不敢让我的程序批量出去的!
zxzx8059
5楼-- · 2019-12-24 13:16
小封裝的ROM常常都少,原廠的build完就沒剩多少ROM能用了,
這場合還是適合直接動reg..
wzd5230
6楼-- · 2019-12-24 14:00
lixin91985 发表于 2017-9-4 21:21
用过CYPRESS 才知道ST落后很多了。。 IDE 全整合,图形配置,代码编辑,编译。

即使这样,我还是经常需要 ...

cypress哪个系列是这样的?我用Traveo系列,累成狗!

一周热门 更多>