我正在尝试理解这段代码来解决这些问题:
/* GPIO bits */
static bit GP5 @ (unsigned)&GPIO*8+5;
static bit GP4 @ (unsigned)&GPIO*8+4;
static bit GP3 @ (unsigned)&GPIO*8+3;
static bit GP2 @ (unsigned)&GPIO*8+2;
static bit GP1 @ (unsigned)&GPIO*8+1;
static bit GP0 @ (unsigned)&GPIO*8+0;
GPIO以这种方式定义:
static volatile unsigned char GPIO @ 0x06;
为什么GPIO地址乘以8然后加上该位数?这个宏的结果是什么,我该如何解决这个问题?
上面的代码适用于PIC微控制器的XC8编译器。 Atmel在使用宏 IOPORT_CREATE_PIN 时使用相同的内容。该宏定义如下:
#define IOPORT_CREATE_PIN(port, pin) ((IOPORT_##port)*8 + (pin))
答案 0 :(得分:2)
“为什么GPIO地址乘以8后再加上该位的数量?该宏的结果是什么以及如何对该位进行寻址?”
这是来自最低地址的位数:每个字节8位加上字节的偏移量。
您可以使用该名称来处理该位,例如GP3 = 1;
。编译器知道它是一个位。正如所指出的,这是PIC的特定编译器扩展。
答案 1 :(得分:1)
因为每个特殊功能寄存器都有8位(取决于微控制器)。 GP0
的地址为0x06*8+0 = 0x30
。解决一些问题的方法也取决于微控制器。对不起,我不熟悉PIC。你可以自己搞清楚。