0

我正在尝试同时更改一个以上引脚的状态(输出/输入)(使用位掩码)。

一个引脚的代码是:

#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define OUT_GPIO(g) *(gpio+((g)/10)) |=  (1<<(((g)%10)*3))

我真的不明白这段代码的作用。

比方说,gpio := 0x20200000所以对于 Pin 1 它应该是

 10 0000 0010 0000 0000 0000 0000 0000 + 0 = (10 0000 0010 0000 0000 0000 0000 0000 + 0) & ~11 1000 = 0

我认为这不可能是正确的。我究竟做错了什么?

4

1 回答 1

0

因此,在要求我们为您阅读之前,您应该已经参考了 Broadcom arm 外围设备手册……0x20200000 是 gpio 引脚的功能选择寄存器 0 到 9 每组 10 个引脚有一个寄存器,每个 gpio 有 3 位选择 8 个功能之一 2 位未使用。所以模 10 是要找出哪个功能选择寄存器,然后乘以 3 是每个 gpio 引脚的 3 位。

位模式 0b000 将引脚定义为输入,位模式 0b001 定义为输出,因此您引用的这段代码要么将三位归零,要么将三位与 1 相结合,这当然是错误的,因为其他两位不是保证为零。要正确使用该代码,您可能应该修复它或将 gpio 设置为输入然后输出,以便清除三位然后设置一位。

于 2014-08-17T02:53:30.413 回答