TM4C123G launchpad:如何在不知道其 GPIO 及其在字节中的位置的情况下修改一个引脚(例如 PE1)

TM4C123G launchpad: How to modify one pin (e.g. PE1) without knowing its GPIO and its position in the byte

请允许我澄清标题: 我正在编写一个函数,将 16x2 LCD 引脚连接到 TM4C123G 引脚。用户应该能够 select 他们想要的任何 TM4C123G 引脚。作为功​​能编写者,我需要用户将那个引脚的信息传递给我,以便我可以连接引脚。

现在我知道有两种修改pin的方法了:

方法一: 引用完整的寄存器和AND/OR具有一定的值:

// Want to set PE1 to high
#define GPIO_PORTE_DATA_R       (*((volatile unsigned long *)0x400243FC))
GPIO_PORTE_DATA_R |= 0x02;

方法二:使用bit-specific寻址并引用PE1:

// Want to set PE1 to high
#define PE1       (*((volatile unsigned long *)0x40024008))
PE1 = 0x02;

现在考虑我需要编写的函数:用户必须向它传递两条信息 -- 1) 使用哪个 GPIO(端口 E),以及 2) 使用哪个位(PE1 第二位从低端)。

我的问题:有没有办法让用户只向我传递一个内存地址,我可以简单地将其设置为 0x01 高位和 0x00 低位?

这实际上是一个独立于其平台的通用问题。解决方案也是opinion-based。不管怎样,下面是我的建议:)

由于用户只会管理 GPIO,s/he 不需要了解涵盖较低级别的底层外设控制的实现细节。因此,您可能希望通过向用户提供一些基本功能来隐藏实现细节,如下所示

/* Header File */
int enableGpio(int gpioPort, int index);
int disableGpio(int gpioPort, int index);

您还可以隐藏用于处理操作背后逻辑的宏,方法是在源文件中声明它们。

/* Source File */
#define GPIO_PORTE_DATA_R       (*((volatile unsigned long *)0x400243FC))
#define PE1                     (*((volatile unsigned long *)0x40024008))

int enableGpio(int gpioPort, int index) { /* Implementation*/ }
int disableGpio(int gpioPort, int index) { /* Implementation*/ }

我还建议使用枚举而不是整数来声明 GPIO 端口。这样,您就可以防止对您的函数进行未定义的调用。

暂时就这些:)