【问题标题】:How to set bits on the TI TM4C123G launchpad如何在 TI TM4C123G 启动板上设置位
【发布时间】:2019-05-05 01:24:21
【问题描述】:

我有一个关于如何在 TI 启动板寄存器上设置(或清除)位的问题。有时它们似乎是按位或'd,而其他时候它们仅由赋值语句设置。例如,有一个寄存器是时钟门,必须设置第 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;

【问题讨论】:

    标签: embedded


    【解决方案1】:
    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 = xx OR 1 = 1

    同样,您可以通过“与”反转位掩码来清除单个位:

    SYSCTL_RCGC2_R &= ~0x00000020 ;
    

    因为~ 反转位 (0xffffffdf),并且 x AND 0 = 0x AND 1 = x

    请注意,这些都不是 TI Launchpad 或 GPIO 寄存器所特有的,它对于任何平台或整数数据对象的编程语言都是通用的。

    【讨论】:

    • 那么 (*((volatile unsigned long *)0x400FE108)) 是寄存器的地址而不是数据?
    • @Alex : 不完全是:(volatile unsigned long *)0x400FE108 是寄存器地址。然后,宏定义取消引用(* 运算符)以访问该地址处的数据。
    【解决方案2】:

    这是基本的 C 语言操作员行为,TI Launchpad 没有什么特别之处。赋值运算符设置或清除寄存器的每一位。按位或运算符设置指定的位,但不会清除任何已设置的位。当您想设置寄存器的一部分而不更改其余部分时,请使用按位或。 (按位 AND 运算符可用于清除一部分而不更改其余部分。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2017-03-05
      • 2020-02-23
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多