我正在将RFM Hopper发射器的某些Arduino代码转换为C的项目,但是有一些我不完全理解的概念,例如DDRB和DDRD。
例如,我调用这两个方法:
InputSDIO();
OutputSDIO();
在另一个文件中用以下几行声明:
#define InputSDIO() (DDRB &= (~_SDIO))
#define OutputSDIO() (DDRB |= (_SDIO))
它给我以下错误
“错误:表达式不可分配”
此外,此呼叫我也遇到相同的错误,
RX_ANTOut();
在另一个文件中用以下行定义:
#define RX_ANTOut() (DDRD |= (RX_ANT))
正如我说的,代码来自发送器的Arduino项目。如果您需要更多信息,或者我的问题可以更详细,请随时提出。
在DDRB
和DDRD
中,DDR是d ata d接线端[[r egister,它确定引脚是输入还是输出(uC是(Atmel AVR),DDRB
是端口B的DDR,端口D的DDRD
。SDIO
是通常配置为bitmask的端口配置。运算符&=
和|=
与+=
,-=
,...的含义相同,因此a &= b
表示a = a & b
,因此DDRB &= (~SDIO)
等效于DDRB = DDRB & (~SDIO)
,这是常见的方式bitmasking的~
是逻辑取反&
是逻辑AND,|
是逻辑OR。
SDIO
是一个8位(?这是什么AVR模型?)二进制数字,类似于0b01110010
,它掩盖了端口(即端口D)的引脚https://blog.podkalicki.com/bit-level-operations-bit-flags-and-bit-masks/,What is Bit Masking?
在ATmega128RFA1(https://cdn.sparkfun.com/datasheets/Dev/AVR/ATmega128RFA1_Datasheeta.pdf)的数据表中,DDR的功能在第[[14.2.2配置引脚]]的第191页上。