所以我试图对微 Controller 上的寄存器中的一些位进行 ORR。 到目前为止,我一直在使用 Assembly,现在我使用 C,但我遇到了一些困难。
因此,在 ASM 中,如果我想访问具有偏移量的寄存器,例如: GPIO_PORT_F 和偏移 GPIO_DATA 我将使用以下代码。
LDR R0,=GPIO_PORT_F ;load the base
LDR R1, [R0, #GPIO_DATA] ;load the offset
ORR R1, 0x1 ;ORR it with a value
STR R1, [R0, #GPIO_DATA] ;store back
这正是我想要在 C 中执行的操作。 这就是我所拥有的。
GPIO_PORT_F 定义如下
#define GPIO_PORT_F (*((unsigned long *)0x40025000))
(GPIO_PORT_F+GPIO_DATA) = (GPIO_PORT_F+GPIO_DATA) | inMask;
我收到错误“表达式必须是可修改的左值”
我在这里做错了什么,我正在使用它来抵消。
最佳答案
赋值运算的左侧通常不能有另一个运算的结果。在不深入探讨左值和右值之间的差异的情况下,赋值运算符左侧的值必须是可修改的,而加法运算符的结果则不能修改(更多有关左值与右值的信息,请参阅 this question 的答案) )。我认为 PORTA+GPIO_DIR 是指针算术,所以也许是这样的:
PORTA[GPIO_DIR] = *(PORTA+GPIO_DIR)|inMask;
PORTA[GPIO_DIR]
和 *(PORTA+GPIO_DIR)
都产生相同的左值,即索引 GPIO_DIR
处的元素数组PORTA
。我已将两者都包含在内,以便您可以决定您喜欢哪一个,但通常使用左侧。
关于C 地址偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26175295/