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.

[参考译文] TMS320F28.0049万C:GPIO写入不工作- DriverLib

Guru**** 2562340 points
Other Parts Discussed in Thread: C2000WARE, SFRA

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1092216/tms320f280049c-gpio-writes-not-working--driverlib

部件号:TMS320F28.0049万C
主题中讨论的其他部件:C2000WARESFRA

您好,

我正在为F28.0049万C改编C2000ware 3.3 SDK中的通用电机控制实验室,并需要一些有关这一问题的帮助。

按照Motor Control SDK Universal Project and Lab用户指南(spruj26)中所述修改代码后,
GPIO工作正常,但ADC和ISR工作不正常。 现在ADC和ISR工作正常,但我写了
任何输出GPIO都不会通过。 通过导出代码,我可以在gPIO_TogglePin中看到寄存器地址
未正确计算。

static inline void
GPIO_togglePin(uint32_t pin)
{
    volatile uint32_t *gpioDataReg;

    //
    // Check the arguments.
    //
    ASSERT(GPIO_isPinValid(pin));

    gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + ((pin / 32U) * GPIO_DATA_REGS_STEP);

    gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U);
}
f

变量gpioDataReg应指向0x0.0007万F00,但现在它指向0x0.0007万FB8

在另一个项目中,我可以毫无问题地向GPIO写入数据,所以我不认为这是硬件问题。
比较工作版本和非工作版本之间的拆卸显示差异,
我不清楚为什么会有不同的情况。

非工作代码的反汇编:

         GPIO_togglePin():
083edf:   FE04        ADDB         SP, #4
083ee0:   1E42        MOVL         *-SP[2], ACC
 496        gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + ((pin / 32U) * GPIO_DATA_REGS_STEP);
083ee1:   E8000003    MOVIZ        R3, #0x0
083ee3:   E592        ZERO         R2
083ee4:   E2AF0142    MOV32        R1H, *-SP[2], UNCF
083ee6:   E8080103    MOVXI        R3H, #0x20
083ee8:   E564        SUBC4UI32    R2H, R1H, R3H
083ee9:   E564        SUBC4UI32    R2H, R1H, R3H
083eea:   E564        SUBC4UI32    R2H, R1H, R3H
083eeb:   E564        SUBC4UI32    R2H, R1H, R3H
083eec:   E564        SUBC4UI32    R2H, R1H, R3H
083eed:   E564        SUBC4UI32    R2H, R1H, R3H
083eee:   E564        SUBC4UI32    R2H, R1H, R3H
083eef:   E564        SUBC4UI32    R2H, R1H, R3H
083ef0:   7700        NOP          
083ef1:   BFA90F16    MOV32        @ACC, R1H
083ef3:   FF31        LSL          ACC, 2
083ef4:   FF30        LSL          ACC, 1
083ef5:   FF18007F    ADD          ACC, #0x7f << 8
083ef7:   1E44        MOVL         *-SP[4], ACC
 498        gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U);
083ef8:   E592        ZERO         R2
083ef9:   E2AF0142    MOV32        R1H, *-SP[2], UNCF
083efb:   E8000003    MOVIZ        R3, #0x0
083efd:   E8080103    MOVXI        R3H, #0x20
083eff:   E564        SUBC4UI32    R2H, R1H, R3H
083f00:   E564        SUBC4UI32    R2H, R1H, R3H
083f01:   E564        SUBC4UI32    R2H, R1H, R3H
083f02:   E564        SUBC4UI32    R2H, R1H, R3H
083f03:   E564        SUBC4UI32    R2H, R1H, R3H
083f04:   E564        SUBC4UI32    R2H, R1H, R3H
083f05:   E564        SUBC4UI32    R2H, R1H, R3H
083f06:   E564        SUBC4UI32    R2H, R1H, R3H
083f07:   8A44        MOVL         XAR4, *-SP[4]
083f08:   BFA90F1A    MOV32        @ACC, R2H
083f0a:   2DA9        MOV          T, @AL
083f0b:   0201        MOVB         ACC, #1
083f0c:   563B        LSLL         ACC, T
083f0d:   1EF4        MOVL         *+XAR4[6], ACC

工作代码的拆卸:

00fe28:   FE04        ADDB         SP, #4
00fe29:   1E42        MOVL         *-SP[2], ACC
 494        ASSERT(GPIO_isPinValid(pin));
00fe2a:   7640FE14    LCR          0x00fe14
00fe2c:   5200        CMPB         AL, #0x0
00fe2d:   6008        SB           8, NEQ
00fe2e:   8F4001EE    MOVL         XAR5, #0x0001ee
00fe30:   8F00ACC2    MOVL         XAR4, #0x00acc2
00fe32:   A0A9        MOVL         @ACC, XAR5
00fe33:   7640F9AF    LCR          0x00f9af
 496        gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) +
00fe35:   0642        MOVL         ACC, *-SP[2]
00fe36:   2901        CLRC         SXM
00fe37:   FF44        SFR          ACC, 5
00fe38:   FF31        LSL          ACC, 2
00fe39:   FF30        LSL          ACC, 1
00fe3a:   FF18007F    ADD          ACC, #0x7f << 8
00fe3c:   1E44        MOVL         *-SP[4], ACC
 499        gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U);
00fe3d:   0201        MOVB         ACC, #1
00fe3e:   8A44        MOVL         XAR4, *-SP[4]
00fe3f:   1EA6        MOVL         @XAR6, ACC
00fe40:   9242        MOV          AL, *-SP[2]
00fe41:   901F        ANDB         AL, #0x1f
00fe42:   2DA9        MOV          T, @AL
00fe43:   06A6        MOVL         ACC, @XAR6
00fe44:   563B        LSLL         ACC, T
00fe45:   1EF4        MOVL         *+XAR4[6], ACC

并且寄存器的地址计算正确:

感谢您对本报告的任何帮助。

此致,

John

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

    您应该将此GPIO配置为常规输出,如 hal.c中的HAL_setupGPIOs()所示

    不同的项目中,拆分不能相同,因为在此项目中启用了生成优化。

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

    Yanming您好!

    感谢您的建议。

    输出配置为输出:

        // GPIO0->WAKE - chip wake up signal
         GPIO_setMasterCore(0, GPIO_CORE_CPU1);
         GPIO_setPinConfig(GPIO_0_GPIO0);
         GPIO_setDirectionMode(0, GPIO_DIR_MODE_OUT);
         GPIO_setPadConfig(0, GPIO_PIN_TYPE_STD);
    

    优化功能已在以下两个项目中关闭:

    我本应该在第一个员额中增加这一点。 很抱歉混淆了。

    这就是为什么我不确定这些拆卸件为何不同的原因。 除了优化之外,这种方式还会产生什么影响? 输出格式(COFF或EABI)或程序存储器(闪存或RAM)是否会以这种方式影响编译?

    此致,

    John

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

    否。优化和输出格式不应对项目中的GPIO输出产生任何影响。 您可以查看以下有关软件优化和EABI格式的链接。

    C2000从COFF迁移到EABI

    https://software-dl.ti.com/ccs/esd/documents/C2000_c28x_migration_from_coff_to_eabi.html

     

    C2000 C28x优化指南

    https://software-dl.ti.com/C2000/docs/optimization_guide/index.html

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

    Yanming您好!

    感谢您的建议。 我看了这些文件,我明白你的意思。 您有什么想法,为什么GPIO写入会转到错误的地址,或者有什么建议可以让我继续处理此主题吗?

    问候,

    John

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

    您可以尝试在示例实验中保留默认的优化级别,并使用driverlib中的函数读取/写入GPIO以查看发生的情况。

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

    这种拆卸非工作箱的做法毫无意义。  编译器永远不会生成这样的代码。  我怀疑某种原因导致函数 gPIO_TogglePin内的内存位置被覆盖。   

    在编译器cl2000所在的同一\bin目录中,有一个名为dis2000的命令行反汇编程序。  从命令行界面,运行类似于...的命令。

    dis2000 non_working.out > non_working_dis.txt

    从函数gPIO_TogglePin的地址开始检查拆卸。  我怀疑这与第一篇文章中的内容有很大不同。  如果是,您需要了解这种情况是如何发生的。

    谢谢,此致,

    -George

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

    Yanming您好!

    是的,您的直觉是对的。 我关闭了调试优化。

    按照您的建议,我将优化设置回原始设置,看到那里的GPIO工作正常。 您能否解释一下这种方法的工作原理? 我是否需要始终保持优化? 如何进行调试? 我想我看到了一个_DEBUG
    在某处预先定义,这是为了什么?

    因此,我仍然面临着如何正确调试代码的问题。 有了优化,有时就不可能设置断点和其他类似的奇怪现象。

    有很多问题,但我想知道这种魔法是如何运作的。 请解释。

    问候,

    John

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

    John,

    燕明今天不在办公室。  他应该回来,然后回答。

    最佳,

    Matthew

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

    Matthew,您好!

    感谢您的备注。 我期待Yanming的答复。

    谢谢,

    John

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

    您必须 使用项目中显示的默认优化级别,因为项目中使用 的某些库使用默认优化级别。

    您可以 参考C28x优化指南和C编译器指南,如下链接。

    https://software-dl.ti.com/C2000/docs/optimization_guide/index.html

    https://www.ti.com/lit/spru514

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

    Yanming您好!

    但是,当然! 这是很明显的,我都逃脱了。 我很尴尬。

    我研究了如何编译库的源代码,因此可以关闭优化。 但是,对于通用实验室项目,不提供FAST_FLASH_lib_eabi.lib和sfra_F32_TMU_eabi.lib的源代码。

    使用SFRA_ENable_N预定义关闭sfra功能(这是否足够?)。 是否可以关闭使用具有预定义的快速估算器库,以便我可以关闭硬件测试的优化?

    您发送的优化指南的第1阶段也建议这样做:
    "在此阶段,将禁用编译器优化以提供最佳调试体验。"

    您会提出什么建议?

    此致,

    John

    附注:是否可以确定已编译库的优化级别?

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

    如上所述,您最好保留本实验的默认设置。 没有更多建议,因为我们不会为本实验测试更多其他选项。 您可以在不使用所有构建级别中的优化的情况下更改设置,但很难告诉您在满足时会发生什么情况。

    SFRA_ENable_N28.0049万 working--driverlib/4071336#4071336"]SFRA_ENable_N会407.1336万会关闭407.1336万关闭sfra功能(是否足够?)。 是否可以关闭使用具有预定义的快速估算器库,以便我可以关闭硬件测试优化?[/QUOT]

    如果您要实施快速算法以进行电机控制,则不需要。

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

    Yanming您好!

    好的,那么我就得把它当作它,我们可以在这里结束这种情况。

    感谢您的支持。

    此致,

    John