用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条回答
MagicYang
1楼-- · 2019-12-28 21:24
 精彩回答 2  元偷偷看……
javabean
2楼-- · 2019-12-28 21:27
本帖最后由 javabean 于 2017-9-6 16:26 编辑
EMC菜鸟 发表于 2017-9-5 08:31
我觉得对电路板而言,这个方向并不一定正确,,,,,,我始终认为,电路板不是计算机,配置千差万别的, ...


你去看看linux的内核代码,驱动是硬件抽象,内核还对不同的处理器架构(X86,X64,Spark,Power,安腾,ARM)都有支持,全部都是抽象定义,还有各种宏
不光是软件工程师需要,硬件工程师也需要,只管这一小滩,是很简单的操作,当世界围着转的时候,任何一个简单的操作都是伟大的举动

你只搞这一个项目,很简单,ST做的事情大家都要围着转,就没那么简单。我家做窗子M2的螺丝小了,M4的螺丝又大了浪费钱,那我是自己造一个螺丝吗,还是用现成的,ST的做法在你的项目里可能是大炮打鸟,浪费,但当别人的巨型项目的时候,可能是手枪打卫星,还不够用呢,还要自己定义更多抽象,这就是小马过河,各种动物间所以没必要争,选自己合适的就好。
gongxd
3楼-- · 2019-12-29 02:54
可惜的就是hal库 bug一大堆,兼容性也不怎么好
比如最新的 stm32f4 1.6 中I2s和原来的差别很大
都是坑
shentqlf
4楼-- · 2019-12-29 05:04
我也是为了简化编程的复杂度,自己写了一套eBox固件库。用起来跟arduino差不多,非常方便
lixin91985
5楼-- · 2019-12-29 07:57
还是STD库比较好。
lixin91985
6楼-- · 2019-12-29 08:13
 精彩回答 2  元偷偷看……

一周热门 更多>