This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129ENCPDT:如何区分分配给某些 HW 块(如以太网 LED)的引脚和常规 GPIO 引脚之间的引脚模式?

Guru**** 2387500 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1379434/tm4c129encpdt-how-to-distinguish-pin-mode-between-pin-assigned-to-some-hw-blocks-like-ethernet-leds-and-regular-gpio-pin

器件型号:TM4C129ENCPDT

工具与软件:

我拥有一个应用、其中引脚 PK4和 PK6的功能通过编程更改为分配为以太网 LED 或常规 GPIO 输出、以便根据需要控制此类 LED。
我可以通过以下命令更改其模式、以用作以太网 LED:

ROM_GPIOPinConfigure(GPIO_PK4_EN0LED0);
ROM_GPIOPinConfigure(GPIO_PK6_EN0LED1);
GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_6 | GPIO_PIN_4);

或者、我可以使用以下命令对其进行重新编程、使其用作常规 GPIO 输出:

ROM_GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_4);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_6);

在这两种情况下、它都运行良好。  
我的问题是-如何以编程方式读取这些引脚的模式、以太网 LED 或常规 GPIO 输出? 我不想使用额外的标志来保留此模式...
我找到了函数  ROM_GPIODIRModeGet (端口、引脚) ,这似乎是适合我的需要,但它返回0 (GPIO_DIR_MODE_IN )在两种情况下:-(.

我在做什么错?
在这种情况下、读取引脚模式的正确方法是什么?

编译器- CCS V11、无 RTOS……

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="168939" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1379434/tm4c129encpdt-how-to-distinguish-pin-mode-between-pin-assigned-to-some-hw-blocks-like-ethernet-leds-and-regular-gpio-pin 我的问题是:有没有办法以编程方式读取这些引脚、以太网 LED 或常规 GPIO 输出的模式? 我不想使用额外的标志来保留此模式...
    我找到了函数  ROM_GPIODIRModeGet (端口、引脚) 、这似乎适合我的需要、但在两种情况下都返回0 (GPIO_DIR_MODE_IN):-(.

    我似乎无法重现您的问题。 我尝试 以下代码时、它会在引脚为硬件控制时返回2、或在引脚处于 GPIO 输出时返回1。  

    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
    GPIOPinConfigure(GPIO_PB4_U0CTS);
    GPIOPinConfigure(GPIO_PB5_U0RTS);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);

    tmp = GPIODirModeGet(GPIO_PORTA_BASE, GPIO_PIN_0 );

    if (tmp != GPIO_DIR_MODE_HW)
    {
    while (1);
    }

    ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    tmp = GPIODirModeGet(GPIO_PORTA_BASE, GPIO_PIN_0 );

    if (tmp != GPIO_DIR_MODE_OUT)
    {
    while (1);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我明白了  ROM_GPIODIRModeGet (端口、引脚) UART Rx (仅限!)工作正常 引脚、曾尝试使用 uart0 (PA0、PA1)、uart1 (PB0、PB1)和 uart3 (J0、J1)、所有这些引脚的行为方式都相同-  ROM_GPIODIRModeGet () 在 RX 引脚上返回2、但在 TX 引脚上返回0。 根本就未尝试使用 CTS、RTS 引脚... 所有三个 UART 在这两种方式下都能正常作为 UART 工作。 和  ROM_GPIODIRModeGet () 在 PK4和 PK6上返回0、无论其设置为以太网 LED 或 GPIO 输出。

    好的、你运行了  ROM_GPIODIRModeGet ()  仅在 PA0 (uart0 Rx)上尝试其他引脚。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我想我知道原因。 这是对要传递到的引脚编号的误解  GPIODIRModeGet (端口、引脚) . 请参阅用户指南。 如您所见、适用于  GPIODIRModeGet、 它期望的是数字引脚编号、而不是引脚的位装表示 . 因此、对于 PA1、您需要输入0x1、而不是 GPIO_PIN_1、因为 GPIO_PIN_1 实际上是 GPIO.h 中定义的0x00000002 当我为 PA1输入0x1时、它会起作用。  

    GPIOPinConfigure(GPIO_PA1_U0TX);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_1);

    tmp = GPIODirModeGet(GPIO_PORTA_BASE, 0x1 );

    if (tmp != GPIO_DIR_MODE_HW)
    {
    while (1);
    }

    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_1);

    tmp = GPIODirModeGet(GPIO_PORTA_BASE, 0x1 );

    if (tmp != GPIO_DIR_MODE_OUT)
    {
    while (1);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的! 你是绝对正确的,它解决了我所有的问题:-)。 非常感谢。