用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条回答
atommann
1楼-- · 2019-12-25 10:29
 精彩回答 2  元偷偷看……
wzyllgx
2楼-- · 2019-12-25 13:20
不喜欢HAL还有LL可以选择,直接操作寄存器的。
2012Ehome
3楼-- · 2019-12-25 17:32
低功耗的代码空间少的用寄存器操作,不是低功耗空间允许直接上库
redroof
4楼-- · 2019-12-25 20:56
EMC菜鸟 发表于 2017-9-5 08:31
我觉得对电路板而言,这个方向并不一定正确,,,,,,我始终认为,电路板不是计算机,配置千差万别的, ...

懂不懂硬件无所谓,重要的是你看到这一行,它要做什么事情是清清楚楚的。谁也不会误解。
而往某某寄存器里面写个某某数字,谁知道这是在干啥?
不说过几年,就算过一个月,你不翻手册自己都别想知道这里写的是啥

还有,就算你看着手册在写,要数寄存器的第几位也完全可能数错。特别是寄存器的很多位都要设置的情况下。
例如:你往寄存器里面写了个数字,后面跟一个注释说“设置某某功能”,结果实际上你算错了数字。下次要查的时候就够你查了。
一般人见到写明了注释说设置某某功能,肯定不会重新拿出寄存器手册来核对这个功能对应的寄存器位是不是你前面设的那几位!
而头文件里面的各个位的define值是厂家写在标准库里的,基本上不会定义错。所以你直接用这些定义就又减少了一种出错的可能。


cc2666
5楼-- · 2019-12-25 21:01
c8051f,06年就用过图形配置了
xuzhiping9889
6楼-- · 2019-12-25 21:48
 精彩回答 2  元偷偷看……

一周热门 更多>