用的 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;
呃,我不确定,这样真的“更简单”?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
是写给人看的。
而 PWR->CR = (PWR->CR & (~0x00001800u)) | 0x00000800u;
是写给机器看的。
过几个月后,
你再来看 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); 和 PWR->CR = (PWR->CR & (~0x00001800u)) | 0x00000800u;
从哪个写法,你能更快速的知道代码背后的意图呢?
一周热门 更多>