用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-25 22:28
xuzhiping9889 发表于 2017-9-5 09:57
感觉各有优缺点吧,毕竟这样封装让不熟悉的人可以尽快上手,熟悉的人你也可以直接用寄存器操作,效率也能提 ...

要跟对大方向就是了。
多数的情况,用库,
少部分要求严格的情况,再来优化。

不然竞争对手的产品上市了,你的产品估计还在实验室里面。
kinsno
2楼-- · 2019-12-26 03:11
security 发表于 2017-9-4 18:02
增加注释,这个可以。
实际上,写成这样会更直观点:
PWR->CR = (PWR->CR & ~(BIT_11 | BIT_12)) | BIT_1 ...

把HAL改成这种写法,明显要舒适的多,既照顾了寄存器,也照顾了可读性。
HAL库,真的是一个冗余啊。
临时上DEMO还是很好的,有时间还是要精简的。



canspider
3楼-- · 2019-12-26 07:58
security 发表于 2017-9-4 16:59
当你明白 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1) 背后的规则后,
过几个月后,
...

你没get到点
问题不是__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1)这个写法有多复杂难懂
而是这一堆字母真tm长不好记
你要是弄成汉字版的
HAL配置电源电压比例(电源电压比例1)
楼主肯定觉得这样写比直接写数字好多了
security
4楼-- · 2019-12-26 09:27
canspider 发表于 2017-9-5 10:32
你没get到点
问题不是__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1)这个写法有多复杂 ...

写的时候,肯定要知道这些接口的大致存在、大概命名,然后依赖自动补全功能啊。
如果写代码不依赖自动补全,那么基本还在原始社会。
canspider
5楼-- · 2019-12-26 12:04
 精彩回答 2  元偷偷看……
4058665
6楼-- · 2019-12-26 12:25
本帖最后由 4058665 于 2017-9-5 10:57 编辑

看代码确实很绕    用了一段时间  觉的最主要用途是与cubemx结合,HAL库提供了标准的api,这样才能标准化和图形化
对于新手来说还是挺易上手的   
最大的好处 就是 对于寄存器操作   不需要一个个去位操作 计算    用惯了 还是挺方便的
cubemx提供的  最好只做初始化操作    应用细节   觉的不少也不合理     可能cube设计的时候  就到初始化部分的原因
提供框架  让板子功能跑起来  仅仅如此

一周热门 更多>