如何在TI TM4C123G启动板上设置位

时间:2019-05-05 01:24:21

标签: embedded

我对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;

2 个答案:

答案 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运算符清除部分,而无需更改其余部分。)