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.

[参考译文] TMS320F280025:DCL 库函数控制参数更新

Guru**** 2539500 points
Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1325870/tms320f280025-dcl-library-functions-control-parameter-updates

器件型号:TMS320F280025
主题中讨论的其他器件:C2000WARESysConfig

大家好、

客户有问题需要您的帮助:

版本:C2000数字控制库版本3.4、您需要使用库函数来完成控制参数的实时更新;

在相同的软件工程、相同的配置中、测试按如下方式执行:

1.使用 DCL_updatePI 函数可正确更新控制参数;

2.控制参数不能用 DCL_fupdatePI 函数进行更新、可以观察到 CSS 结构中的状态标志处于 STS_UPDATE_PANDBY 状态;

3、控制结构从 PI 改为 PID、 采用 DCL_fupdatePID、控制参数可被正确更新;

DCL_futils。 ASM 已经启用了 FU_PID 和 FU_PI。

询问工程师此处的参数无法更新 DCL_fupdatePI 的原因是什么。

此致、

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

    您好!

    由于美国放假、请预计在2月20日前收到答复。

    谢谢。此致、

    辛奇塔

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

    尊敬的 Ben:

    对我来说、同样的代码 strctrure 适用于 fupdatePID、但不适用于 fupdatePI 函数、这听起来非常奇怪。

    要对此进行故障排除、客户可以在调试模式下调用 fupdatePI 时插入一个断点、然后观察反汇编过程以查看是否

    1.函数是否被正确调用?

    2.如果是,请检查以下分支语句的下一行 asm 是否正确

     

    BF          PI_EXIT, EQ
    ,导致 TCLR instr (清除标志)或 POP instr (恢复寄存器)。 TCLR 指令将指示  STS_UPDATE_PAUNGING 状态的前提条件已满足、并将执行后续更新指令。 POP 指令是因为它未通过 STS_UPDATE_PANDBY 状态检查并正在恢复状态以退出函数。 有关具体详细信息、请参阅 DCL_futils.asm 中 fupdatePI 的实现

    3.如果以上是真的,可能是文件 DCL_futils.asm 已经回调. 在这种情况下、我建议消费者下载 C2000Ware 的另一个实例来试用。

    如果需要进一步的帮助、请告诉我。

    此致!

    王森

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

    1.此函数被调用;

    2.生成 POP 指令;

    我使用的文件是从 C2000Ware_5_00_00_00复制的。

    原始 asm 文件:

    _DCL_fupdatePI:
            .asmfunc
            PUSH        ST0                 ; save flags
            PUSH        XAR0                ; save XAR0
            PUSH        XAR7                ; save XAR7
            PUSH        ST1                 ; preserve INTM
            MOVL        XAR7, @XAR4         ; XAR7 = &p
            ADDB        XAR7, #18           ; XAR7 = &CSS
            MOVL        XAR0, *XAR7         ; XAR0 = &tpt
            MOVL        ACC, *+XAR0[4]      ; ACC = CSS.sts
            AND         ACC, #1             ; mask bit 0
            BF          PI_EXIT, EQ         ; skip if zero

    我更改了第8行 ADDB XAR7,#18 ; XAR7=&CSS,将#18更改为#20;

    _DCL_fupdatePI:
            .asmfunc
            PUSH        ST0                 ; save flags
            PUSH        XAR0                ; save XAR0
            PUSH        XAR7                ; save XAR7
            PUSH        ST1                 ; preserve INTM
            MOVL        XAR7, @XAR4         ; XAR7 = &p
            ADDB        XAR7, #20           ; XAR7 = &CSS
            MOVL        XAR0, *XAR7         ; XAR0 = &tpt
            MOVL        ACC, *+XAR0[4]      ; ACC = CSS.sts
            AND         ACC, #1             ; mask bit 0
            BF          PI_EXIT, EQ         ; skip if zero

    我调试并比较 PI 和 PID 之间的差异、最后更改 DCL_futils.asm 代码、现在似乎可以正常工作。 我是否需要更改任何其他代码、或者应在何处获取最新的 asm 文件/DCL 库源文件。

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

    尊敬的 Bo:

    感谢您犯了一个未被注意到的错误、对齐后 CCS 属性实际上位于结构体的第20个字节中。 由此给您带来的不便、我深表歉意、我们将确保在下一个版本中反映此修复程序。 检查后所有其他函数看起来都很好、因此不需要进行其他更改。  

    再次感谢! 如果您对我们的图书馆还有任何其他问题,请告诉我。

    此致!

    王森

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

    很抱歉打扰您。 我想出了一些问题,当使用 VCRC,原因也可能有一些关系  fupdatePI。 以下是我的测试步骤:

    我计算得出并得到 CRC 值。 然后我打电话 DCL_updatePI 并更改了 PI 参数。 我计算得出并得到 再次获取 CRC 值;

    2.I 计算得出并得到 CRC 值。 然后我打电话  dcl_fupdatePI 并更改了 PI 参数。  我再次计算了 CRC 值、但再也无法获得正确的 CRC 值。

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

    尊敬的 Bo:

    很抱歉耽误我的时间、请让我联系 VCRC 专家、看看是否有我不知道的潜在注意事项。 一旦我收到响应、我就会回复您。

    此致!

    王森

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

    尊敬的 Bo:

    关于 VCRC 模块的可重入性没有任何已知问题、尽管如此、在更仔细地检查汇编代码之后、似乎 _DCL_fupdatePI .asm func 中遗漏了一行:

    _DCL_fupdatePI:
            .asmfunc
            PUSH        ST0                 ; save flags
            PUSH        XAR0                ; save XAR0
            PUSH        XAR7                ; save XAR7
            PUSH        ST1                 ; preserve INTM
            MOVL        XAR7, @XAR4         ; XAR7 = &p
            ADDB        XAR7, #20           ; XAR7 = &CSS
            MOVL        XAR0, *XAR7         ; XAR0 = &tpt
            MOVL        ACC, *+XAR0[4]      ; ACC = CSS.sts
            AND         ACC, #1             ; mask bit 0
            BF          PI_EXIT, EQ         ; skip if zero
            TCLR        *+XAR0[4], #0       ; clear STS_UPDATE_PENDING flag
            MOVL        XAR0, XAR7          ; XAR0 = &CSS
            SUBB        XAR0, #2            ; XAR0 = &SPS
            MOVL        XAR7, *XAR0         ; XAR7 = &Kp
            SETC        INTM                ; block interrupts
            MOVL        ACC, *XAR7++        ; SPS.Kp -> ACC
            MOVL        *XAR4++, ACC        ; update KpUmax
            MOVL        ACC, *XAR7++        ; SPS.Ki -> ACC
            MOVL        *XAR4++, ACC        ; update Ki
            ADDB        XAR4, #2            ; XAR4 = &Umax
            MOVL        ACC, *XAR7++        ; SPS.Umax -> ACC
            MOVL        *XAR4++, ACC        ; update Umax
            MOVL        ACC, *XAR7++        ; SPS.Umin -> ACC
            MOVL        *XAR4++, ACC        ; update Umin
            ADDB        XAR4, #2            ; XAR4 = &Imax
            MOVL        ACC, *XAR7++        ; SPS.Imax -> ACC
            MOVL        *XAR4++, ACC        ; update Imax
            MOVL        ACC, *XAR7          ; SPS.Imin -> ACC
            MOVL        *XAR4, ACC          ; update Imin
            CLRC        INTM                ; <<---Add this line
    PI_EXIT:
            POP         ST1                 ; restore INTM
            POP         XAR7                ; restore XAR7
            POP         XAR0                ; restore XAR0
            POP         ST0                 ; restore flags
            LRETR
            .endasmfunc

    您能否尝试在 pi_exit 分支前面添加以下行、查看其是否仍然运行异常?

            CLRC        INTM                ;

    对于给您带来的不便、请告知我这是否可以解决问题。  

    此致!

    王森

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

    感谢您的答复。 我添加此行并重试、以下是我的一些测试结果:

    1)致电  DCL_updatePI 不影响 VCRC;

    2)致电  DCL_fupdatePI (带或不带 CLRC INTM) 影响 VCRC 结果;

    3)致电  DCL_fupdatePID (带或不带 CLRC INTM) 影响 VCRC 结果;

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

    感谢您发送编修。

    由于 带宽限制、我直到下周才能重现和调试这一特定问题。 在我找出问题的根本原因后、我会经常向您发布信息。  

    但就目前而言、我们可以继续使用 DCL_updatePI、希望您没有此问题。

    此致!

    王森  

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

    你好、Bo、抱歉耽误了我的时间。

    只是为了仔细检查一下,是否启用了"Processor Options"下的标志--isr_save_vcu_regs?   

    我可以知道您使用的大小多项式吗?  您是否也碰巧使用由链接 器生成并生成链接器计算值的 CRC 表? 如果不适合公开披露这些信息、请随时直接向我告知具体情况。

    此致!

    王森

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

    1. -isr_save_vcu_regs 未按下图设置:

    2.hear 是我的 CRC 配置与 SysConfig ,使用 CRC-16-MODBUS , 14字节,多项式是0x8005。

    3.我使用的最终值是从 crc_bitReflect (BswCrc_VCRC0_Handle->crcResult,16)获得的;

    4、我 做了更多的测试,可能与以上功能有关系:

      4.1) 调用 fupdate 函数后,可以得到正确的 CRC 值 BswCrc_VCRC0_Handle->crcResult (不管 --isr_save_vcu_regs 开/关 或不设置 );

      4.2) 从函数 crc_bitReflect (BswCrc_VCRC0_Handle->crcResult、16)获得的值是调用 fupdate 函数的错误机构;

      4.3)例如、计算0x01-0x14 CRC 值、VCRC 输出为0x89D3、fefflect 值为0xCB91;调用 fupdate 后、VCRC 输出也为0x89D3、但反映值 始终为0xDFA3;

    5.关于 VCRC 模块的另一个问题

      根据数据表、该器件中只有 VCRC 模块、但 SysConfig 生成的头文件包含 VCU2头文件。 是否应该使用 vcu2xxx.h 中的函数? 如果我无法使用这些函数、为什么我可以 在调用 fupdate 之前获得正确的 CRC 反映值。  

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

    尊敬的 Bo:

    非常感谢您提供的信息。

    关于 VCU2、VCRC 只是 VCU2的子集。 遗憾的是、对于 F28002x 器件、仅实现了 VCRC、因此您无法使用 VCU2的其他特性(例如 Viterbi、基于 VCU2的 FFT、ReedSolomon 等)。 但您可以随意使用 VCU2中涉及 CRC 的任何函数。

    此致!

    王森

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

    谢谢。 我不使用 VCU2的其他功能、但  CRC_bitReflect 函数除外;

    抱歉上面的回复中有误、 我用于计算 CRC 的原始值是0x01、0x02...0x0E (1~14)、不是0x01-0x14。

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

    尊敬的 Bo:

    很抱歉耽误了很长时间,以为我已经回复了一条后续消息,但没有发送。

    我尝试了您的 设置 配置、但无法重现该问题、无论运行哪个 DCL 函数、CRC_runConfigpolyBytes 和 CRC_bitReflect 都是一致的。 但是,如果使用中断,请确保设置了--isr_save_vcu_regs,以便在发生 ISR 时保存/恢复 VCU 寄存器。  

    此致!

    王森

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

    尊敬的 Sen:

    很抱歉耽误了很长时间、因为这些天我忙于一些编码工作。

    我尝试了一个名为 。  CCS、C200Ware 和编译器版本记录在 main.c 文件中。

    1. 本项目中无 ISR;
    2. -- isr_save_vcu_regs 设置为打开;
    3.   在 文件 DCL_futils.asm 中的函数_DCL_fupdatePI (__LW_AT__中对齐后、将结构的偏移量更改为20字节);

    右侧的 CRC 值为0xCB91;

    调用 DCL_updatePI 后、结果不受影响、它仍为0xCB91。

    调用 DCL_fupdatePI 后、结果始终为0xF303(与先前的测试不同、但其值始终为错误的0xF303)


    e2e.ti.com/.../DCL_5F00_Test1.zip

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

    尊敬的 Bo:

    非常感谢 您提供的示例、让我尝试重现该问题、然后我将返回给您。

    此致!

    王森

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

    Bo,

    我刚接到这个问题的电话、所以我有几个问题要问您。

    1.您能准确总结一下哪些函数被调用、以及按照什么顺序执行 CRC 计算吗?

    2.您能在上述流程中指定 updatePI 或 fupdatePI 函数被调用的确切位置吗?

    谢谢。

    Sira

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

    您可以在这个问题中看到演示 I provisiN <DCL_Test1.zip>和上面的回复。

    我在这里总结了这些步骤:

    设置变量 在表达式视图中、您可以获得一次 CRC 值、正确的 CRC 值 为 0xCB91;

    设置 变量  在表达式视图中、您可以 运行 一次 DCL_fupdatePI。 如果您再次获取 CRC 值设置,  最终的 < GebswCrc_U_RES> 这一次不正确;

    3.更改功能  DCL_fupdatePI (&Asw Dcc_Controller 1_VHBus) 至  DCL_updatePI (&Asw Dcc_Controller 1_VHBus) ,再次编译并下载新程序。 这次无论你叫什么  DCL_updatePI 或不是,CRC 值 始终是正确的值0xCB91;

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

    Bo,

    谢谢。 我看着她的眼睛。 我看到你在无限循环中执行 CRC 计算,接着是 bitreflect (),然后是 updatePI/ fupdatePI。

    以下是一些评论/问题:

    1.在 fupdatePI 的错误情况下,您是否确定 BswCrc_VCRC0_Handle->crcResult 仍然正确,而 crc_bitReflect()的输出不正确?

    2.在 updatePI 和 fupdatePI 的情况下,BswCrc_VCRC0_Handle->crcResult 的值是什么?

    谢谢。

    Sira

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

    BswCrc_VCRC0_Handle->crcResult 在调用 fupdatePI/updatePI 后始终正确。  调用 fupdatePI 后从 crc_bitReflect ()获得的值出错,但在调用 updatePI 后正确无误。

    我已在2个月前对这一问题的上述答复中作了如下答复:

    3.我使用的最终值是从 crc_bitReflect (BswCrc_VCRC0_Handle->crcResult,16)获得的;

    4、我 做了更多的测试,可能与以上功能有关系:

      4.1) 调用 fupdate 函数后,可以得到正确的 CRC 值 BswCrc_VCRC0_Handle->crcResult (不管 --isr_save_vcu_regs 开/关 或不设置 );

      4.2) 从函数 crc_bitReflect (BswCrc_VCRC0_Handle->crcResult、16)获得的值是调用 fupdate 函数的错误机构;

      4.3)例如、计算0x01-0x14 CRC 值、VCRC 输出为0x89D3、fefflect 值为0xCB91;调用 fupdate 后、VCRC 输出也为0x89D3、但反映值 始终为0xDFA3;

     注意: CCS、C200Ware 和编译器的版本与 <DCL_Test1.zip>不同 ,并且错误值也不同。

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

    尊敬的 Bo:

    感谢您的观察、我还通过 crc_bitReflect 和 fupdatePI 复制了这个问题。  我们正在与更广泛的团队进行积极的内部讨论、当我们在大约一天左右的时间内有一个结论时、我们会向您回复。

    我真的很感激你在这个问题上的耐心。

    此致!

    王森