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.

[参考译文] 编译器/TMS320F2.8379万D:设置大量GPIO的最佳方法

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/629482/compiler-tms320f28379d-best-way-for-setting-lots-of-gpio

部件号:TMS320F2.8379万D

工具/软件:TI C/C++编译器

大家好,

我必须将IGBT驱动器与我的F2.8379万D连接起来,我对配置或系统工作没有任何问题,但我想优化代码清晰度和GPIO配置。

每个IGBT驱动器需要3个GPIO (故障,就绪和重置,输入和输出,但这不是问题),我的系统中有16个驱动器。

此代码(数组,结构,类或其他)的最佳方式是什么? 我不想写"#define Driver1_fault = GpioDataRegs.GPBDAT.bit.GPIO34".... 16*3=48次。

我认为有许多解决方案,但我不是编程方面的专家,因此我希望您能帮助我提供提示。

谢谢!

热雷梅

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想说一组类,尽管可能最好在TMS320电路板上提出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jeremy:

    我们当然可以在这方面提供帮助。 首先,最终目标是什么? 快速执行时间? 小代码大小? 减少手动编码?

    此致,

    克里斯

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

    您好,Kris,

    最终目标是减少手动编码,正如我所说的,我有48个GPIO仅为IGBT驱动器配置,我不想手动写入哪个GPIO为哪个驱动器针脚调整,因为它不方便,这是错误的最佳方式。

    我喜欢使用PWMreg指针数组配置PWM的PFC Vienna示例,因此我用自己的类型“驱动程序”复制它:


    我已经达到配置GPIO的目的,但我不知道如何将GPIO bool值分配给"(*Drivers[i]).bit.fault"或"(*Drivers[i]).bit.ready"

    是否可以生成类似"#define Driver1_Fault GpioDataRegs.GPBDAT.bit.pointerToGoodGpioNumber"的内容??

    或者使用循环? while (I<n){(*Drivers[I]).bit.fault = someths ; I++}

    非常感谢,祝您度过美好的一天,

    此致,
    热雷梅

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

    Jeremy,

    我们不能将指针指向位字段,因为总线体系结构是16位,用于最小的访问。 因此,我们可以做的最好的事情是使用16位寄存器引用,并使用公式来提取该位。 就有限的手动编码而言,我们当然可以将其取消。 这是我过去的一个例子。

    我们的所有GPIO端口均为32位。 因此,如果您执行GPIO #% 32,则结果将是GPxDAT寄存器中的位数。 要解决GPxDAT中"x"的含义,它只能是GPIO #/32的整数结果。 因此,将这些组合在一起,以了解是否设置了特定的GPIO,您可以执行类似的操作(此语法可能错误,但希望这一要点能使其通过):

    struct gPIO_DATA_regs my_GPIO[]{&GpioDataRegs.GPADAT,&GpioDataRegs.GPBDAT,&GpioDataRegs.GPCDAT,&GpioDataRegs.GPDDAT ...等等}

    //确定是否设置了GPIO 60
    Int GPIO端口= 60 / 32;
    int bit_number = 60 % 32;

    IF (my_GPIO[GPIO端口]和(0x1 <<位数))


    }

    希望这能有所帮助。

    克里斯

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

    您好,Kris:

    感谢您的帮助,我会这样做的。

    此致,

    热雷梅