我对TI启动板寄存器中的位如何设置(或清除)存在疑问。似乎有时它们是按位排列的,而有时它们只是通过赋值语句设置的。例如,有一个寄存器是时钟门,必须设置位5才能使用GPIO端口F:
#define SYSCTL_RCGC2_R (*((volatile unsigned long *)0x400FE108))
SYSCTL_RCGC2_R = 0x00000020; //What are the values of all the bits now?
此外,我还看到了按位或设置的位
SYSCTL_RCGC2_R |= 0x00000020;
答案 0 :(得分:2)
SYSCTL_RCGC2_R = 0x00000020 ;
设置所有位,无论其当前状态如何。在这种情况下,除了b5以外的所有其他都归零。
SYSCTL_RCGC2_R |= 0x00000020 ;
仅设置 b5,其他所有位保持不变。 |=
分配等效于:
SYSCTL_RCGC2_R = SYSCTL_RCGC2_R | 0x00000020 ;
即SYSCTL_RCGC2_R
包含的内容均与0x00000020进行或运算。因此b5必须变为1,而所有其他位保持不变,因为 x OR 0 = x 而 x OR 1 = 1 。
类似地,您可以通过对反转的位掩码进行“与”操作来清除单个位:
SYSCTL_RCGC2_R &= ~0x00000020 ;
因为~
反转了位(0xffffffdf
),所以 x AND 0 = 0 而 x AND 1 = x 。
请注意,这都不是TI Launchpad或GPIO寄存器所特有的,它是任何平台或整数数据对象的编程语言所通用的。
答案 1 :(得分:1)
这是基本的C语言操作员行为,与TI Launchpad无关。赋值运算符设置或清除寄存器的每一位。按位或运算符设置指定的位,但不清除任何已设置的位。如果要设置寄存器的一部分而不更改其余部分,请使用按位或。 (可以使用按位AND运算符清除部分,而无需更改其余部分。)