【发布时间】:2014-10-03 07:57:43
【问题描述】:
所以我正在尝试对微控制器上的寄存器中的一些位进行 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;
我收到一个错误“表达式必须是可修改的左值”
我在这里做错了什么,我正在使用它来尝试抵消。
【问题讨论】:
-
嗯,你还没有很好地解释你的 C 代码。
PORTA和GPIO_PORT_F是一样的吗?GPIO_DIR是整数偏移量吗?如果是这样,试试这个:*(PORTA+GPIO_DIR) |= inMask; -
@squeamish,我相信你想写 *(PORTA+GPIO_DIR) |= inMask; .我同意你的“方法”,这可能是“字节我”正在寻找的解决方案
-
如果
PORTA是一个指针,GPIO_DIR是一个整数偏移量,那么PORTA[GPIO_DIR]可用于获取或设置该指针偏移量处的值。 -
对不起,我使用的示例和实际变量混淆了。我已经更新了这个问题。我尝试使用 PORTA[GPIO_DIR] |= inMask;并收到另一个错误“表达式必须具有指向对象类型的指针”(PORTA+GPIO_DATA) |= inMask;给出错误““ 的操作数必须是指针”