我正在尝试同时更改多个管脚的状态(输出/输入)(使用位掩码)。
一个引脚的代码是:
#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我认为这不可能是正确的。我做错了什么?
发布于 2014-08-17 10:53:30
因此,根据broadcom arm外设手册,在要求我们为您读出之前,您应该已经参考了该手册...0x20200000是gpio引脚0到9的功能选择寄存器。对于每组10引脚,每个gpio都有一个寄存器3位,用于选择8种功能中的一种,2位未使用。因此,模10是为了找出哪个功能选择寄存器,乘以3是每个gpio引脚的三个位。
位模式0b000将引脚定义为输入,位模式0b001定义为输出,因此您引用的这段代码要么将三位置零,要么将三位与1相加,这当然是错误的,因为其他两位不能保证为零。要正确使用该代码,您可能应该修复它,或者将gpio设置为输入,然后设置为输出,以便清除三位,然后设置一位。
https://stackoverflow.com/questions/18271030
复制相似问题