用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条回答
security
1楼-- · 2019-12-23 01:31
PEcontrol 发表于 2017-9-4 23:09
同意楼上,  感觉有一些单片机应用不需要这么复杂,
特别是一些底层的实时应用, 更习惯于直接操作寄存器, ...

我想这是趋势。
硬件资源是一直在持续提高的。越高级的硬件,就需要越抽象的封装。
cycisok
2楼-- · 2019-12-23 04:14
函数封装的时候可以用自然些的,但底层操作绕多就没必要了。我觉得是思维习惯的不同,有些库真的很难用
AlertTao
3楼-- · 2019-12-23 09:04
只能说:世界变化太快,已经没有太多时间看数字了,HAL能看懂意思就好了。
yelong98
4楼-- · 2019-12-23 10:06
 精彩回答 2  元偷偷看……
redroof
5楼-- · 2019-12-23 14:34
可读性最重要,绝大部分地方可读性甚至大于执行效率。更何况那一堆define到最后其实变成了跟直接写寄存器一样,啥也没损失
eaglelpx
6楼-- · 2019-12-23 17:34
玛德。我也用的很崩溃,I2C输出波形老是不对,方波夹杂着三角波。各种设置都没用

一周热门 更多>