我对Arduino一无所知,但在大多数微控制器上通常这样做的方式是直接指向外围设备的寄存器区域,在这种情况下是串行端口。假设您的 MCU 像这样映射这些寄存器:
// serial port 1
0x1234 SERIAL_CONTROL_REG
0x1235 SERIAL_DATA_REG
0x1236 SERIAL_STATUS_REG
// serial port 2
0x2000 SERIAL_CONTROL_REG
0x2001 SERIAL_DATA_REG
0x2002 SERIAL_STATUS_REG
然后,您可以使用指针跟踪端口,如下所示:
#define SERIAL_PORT1 ((volatile uint8_t*)0x1234)
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000)
typedef volatile uint8_t* serial_port_t;
...
serial_port_t port;
if (something == somethingElse)
port = SERIAL_PORT1;
else
port = SERIAL_PORT2;
然后可以进一步扩展,以便您可以将寄存器用作变量,例如使用宏:
#define SERIAL_CONTROL_REG(offset) (*(offset + 0))
#define SERIAL_DATA_REG(offset) (*(offset + 1))
#define SERIAL_STATUS_REG(offset) (*(offset + 2))
if(SERIAL_STATUS_REG(port) & some_mask)
{
SERIAL_DATA_REG(port) = 0xAA;
}
这就是您通常为具有多个相同板载端口的 MCU 外设编写通用硬件驱动程序的方式。