在下面的变量中定义了gpio的cmuClock。 我知道什么是<< and bit wise or operations . but there are logical stuff like shifting 0 four times :-) shifting 0 4 times still will result in zero. What kind of registers are used in efr32 for this purpose? Thanks.
cmuClock_GPIO = (CMU_NOPRESC_REG << CMU_PRESC_REG_POS)//0<<4
| (CMU_NOSEL_REG << CMU_SEL_REG_POS)//0<<0
| (CMU_HFBUSCLKEN0_EN_REG << CMU_EN_REG_POS)//5<<8
| (_CMU_HFBUSCLKEN0_GPIO_SHIFT << CMU_EN_BIT_POS)//2<<12
| (CMU_HFBUS_CLK_BRANCH << CMU_CLK_BRANCH_POS),//5<<17
这样写使得代码可维护。
如果
CMU_NOPRESC_REG
的值需要改变为非零的值,你可以只改变一个地方的一个常量,代码仍然有效。
如果你取消移位,那么当你想改变那个位域的值时,你不能只改变一个常量,你必须遍历所有代码并将移位放回去。
(另请注意,如果您使用常量编写
(0 << N)
,那么编译器将永远不会实际生成移位指令,它会在编译时进行移位并将结果值插入二进制文件中)。