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.

[参考译文] TMS320F28379D:TMS320F28379D 中的奇怪 GPIO 行为

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/987188/tms320f28379d-strange-gpio-behavior-in-tms320f28379d

器件型号:TMS320F28379D

您好!

我有以下非常简单的代码

Fullscreen
1
2
3
GpioDataRegs.GPADAT.bit.GPIO21 = 1;
GpioDataRegs.GPADAT.bit.GPIO20 = 1;
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

GPIO19和 GPIO21被设定为高电平。  但是出于某种原因、GPIO20未设置为高电平。  (当我使用示波器查看 GPIO20以及在 Code Composer Studio 调试器的"Registers"选项卡中查看 GpioDataRegs 时、我都会看到这一点。)

让这种情况变得更加陌生的是、如果我将代码更改为:

Fullscreen
1
2
3
GpioDataRegs.GPADAT.bit.GPIO21 = 1;
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
GpioDataRegs.GPADAT.bit.GPIO20 = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

然后 GPIO21和 GPIO20被设定为高电平、但不是 GPIO19。  因此、我中间的任何一个似乎都没有设置。

但是、如果从 Code Composer Studio 的"Registers"选项卡中、我手动将全部三个设置为高电平、则全部三个设置为高电平并保持高电平(在调试器和示波器中)。

我很难解释这种奇怪的行为。  我是否缺少一些简单的东西或者 TMS320F28379D 芯片是否可能损坏?

我 正在将 GpioCtrlRegs 设置为在代码中输出。

Fullscreen
1
2
3
4
5
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO21 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
EDIS;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我已经尝试回收微控制器的电源、重新启动 Code Composer Studio 并重新启动计算机。  同样的行为仍然存在。

谢谢、

Kevin

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

    刚刚在另一个具有另一 个 TMS320F28379D MCU 的电路板上进行了测试、我看到了相同的行为。  因此、即使是这样简单的代码、也必须存在一些软件问题。  我缺少什么??

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

    尊敬的 Kevin:

    您需要使用设置/清除或切换寄存器来更改 GPIO 引脚状态。 这应该可以解决您观察到的问题。

    此致、

    Vivek Singh

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

    您可以参阅此 帖子 以详细了解问题。

    此致、

    Vivek Singh

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

    Vivek、

    感谢您的回答。  我现在通过阅读链接了解了这个问题。  

    我想强制低/高一组 GPIO、具体取决于每个 GPIO 的用户输入。  是否有比使用 if/else 语句更巧妙的方法来使用 Set/Clear?

    使用 GPADAT 时、我可以为每个 GPIO 执行一个简单的代码行

    Fullscreen
    1
    GpioCtrlRegs.GPADIR.bit.GPIO21 = UserGPIO21Control; //force GPIO21 high or low depending on UserGPIO21Control
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    现在、当使用 Set/Clear 时、我需要为每个 GPIO 使用一个额外的 if 语句

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    if (UserGPIO21Control == 0)
    {
    GpioDataRegs.GPACLEAR.bit.GPIO21 = 1; //force GPIO21 low
    }
    else
    {
    GpioDataRegs.GPACLEAR.bit.GPIO21 = 1; //force GPIO21 high
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这不是一个 GPIO 的大问题、但我有一组 GPIO、我需要根据用户输入强制拉低/拉高、因此我想知道是否有比使用一组 if/else 语句更好的方法。

    谢谢、

    Kevin

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

    Vivek、

    我只是想跟进这一点、因为我没有收到回复:对于基于用户输入设置 GPIO、是否有比使用 if/else 语句更巧妙的方法来使用 Set/Clear?

    谢谢、

    Kevin

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

    大家好、Kevin。

    我认为您需要这样写才能实现基于用户输入的引脚切换。  

    此致、

    Vivek Singh