【发布时间】:2016-09-27 21:06:27
【问题描述】:
例如我有以下变量:
unsigned char hsi_div = 0x01; /* HSI/2 */
unsigned char cpu_div = 0x05; /* Fmaster/32 */
我想将hsi_div 写入位 4,3,将 cpu_div 写入位 2,1,0(假设整个字符名为 CLK_DIVR):
CLK_DIVR |= hsi_div << 4; //not correct!
CLK_DIVR |= cpu_div << 2; //not correct!
假设我想回读寄存器以确保我做的正确:
if( ((CLK_DIVR << 4) - 1) & hsi_div) ) { /* SET OK */ }
if( ((CLK_DIVR << 2) - 1) & cpu_div) ) { /* SET OK */ }
我的按位运算有问题吗!?我没有得到正确的行为。
【问题讨论】:
-
你想使用
uint8_t,它是8位的。unsigned char至少 8 位,但可能更多。 -
使用固定宽度类型(参见
stdiont.h),而不是标准整数类型。并选择您使用的语言。 C 和 C++ 是不同的语言! -
@ThomasMatthews 我使用的编译器和平台无关紧要
-
你得到什么行为?
-
使用两个 RMW 访问
volatile硬件寄存器是不好的设计。一次写入值。
标签: c bit-manipulation bitwise-operators