用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条回答
Excellence
1楼-- · 2019-12-27 09:47
nxp得都是寄存器操作
redroof
2楼-- · 2019-12-27 13:04
security 发表于 2017-9-5 11:01
实际上,对于寄存器的直接操作,我一直使用以下形式,来避免出现 magic number,避免出错以及思考:

PWR ...

写BitXX比写magic number好一点,但也没好太多。
你下次还是要看寄存器手册来确认BIT_11和BIT_12的功能。为什么bit11和bit12要设为这个值,会不会哪天笔误写错了?
写成 PWR_REGULATOR_VOLTAGE_SCALE1 才能完全没有疑义,再也不需要查手册了。
redroof
3楼-- · 2019-12-27 18:35
 精彩回答 2  元偷偷看……
security
4楼-- · 2019-12-27 21:50
redroof 发表于 2017-9-5 13:29
写BitXX比写magic number好一点,但也没好太多。
你下次还是要看寄存器手册来确认BIT_11和BIT_12的功能。 ...

是的,这个只是给喜欢直接操作寄存器的开发者,提供一个稍微好一点的解决方案。
jingwaner
5楼-- · 2019-12-27 22:42
不管是HAL 还是寄存器,实际上都是对硬件驱动层的初始化或者配置。

使用寄存器,也可以写成模块函数,移植其他项目只要拷贝,修改个别参数即可,不会浪费太多时间。也可以快速开发出产品。

熟悉HAL库的时间,和熟悉寄存器配置或者说标准库使用,花的时间是差不多的。

而操作寄存器的好处是非常值得的:运行快,编译快,代码小

熟悉了寄存器,更容易理解MCU这类器件,对TIMER ,SPI ,I2C ,UART 了解更清楚,等你换MCU或者查找问题时,帮助更大,处理更快。
Excellence
6楼-- · 2019-12-28 03:48
从移植来说,应该用寄存器。不论st还是nxp

一周热门 更多>