因此,我正在尝试对微控制器的寄存器中的某些位进行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
处的元素。我将两者都包括在内,因此您可以决定自己喜欢哪个,尽管通常使用左边的那个。