2013-08-16 203 views
0

我试图在同一时间更改一个引脚的状态(输出/输入)(使用位掩码)。GPIO的树莓派位掩码(OUT_GPIO和INP_GPIO)

一针的代码是:

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

我真的不明白这个代码做什么。

比方说,gpio := 0x20200000所以引脚1应该是

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

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

+0

从哪里得到该代码? – Bex

回答

0

所以从broadcom arm外设手册,你应该已经在请求我们为你读它之前已经参考... 0x20200000是gpio引脚0到9的函数选择寄存器,每个10个引脚有一个寄存器每个gpio 3位可选择8个功能之一2个未使用的位。所以模10是找出哪个功能选择寄存器,然后时间3是每个gpio引脚三位。

位模式0b000将引脚定义为输入,将位模式0b001定义为输出,所以您引用的这个代码或者是零,或者是三个位都是1,这当然是另一个错误两位不保证为零。为了正确使用这些代码,你应该修复它,或者将gpio设置为输入,然后输出,这样它会清除三位然后设置一位。