因此,我正在尝试对微控制器的寄存器中的某些位进行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;


我收到一个错误“表达式必须是可修改的左值”

我在这里做错了什么,我正在使用这是我的抵消尝试。

最佳答案

赋值操作通常不能在左侧获得其他操作的结果。在不深入探讨左值与右值之间的区别的情况下,赋值运算符左侧的值必须是可修改的,加法运算符的结果不可修改(更多关于左值v右值的答案this question )。我认为PORTA+GPIO_DIR是指针算术,因此可能类似于:

PORTA[GPIO_DIR] = *(PORTA+GPIO_DIR)|inMask;


PORTA[GPIO_DIR]*(PORTA+GPIO_DIR)都产生相同的左值,即数组GPIO_DIR中索引PORTA处的元素。我将两者都包括在内,因此您可以决定自己喜欢哪个,尽管通常使用左边的那个。

10-08 08:11