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:写入寄存器不起作用

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1173879/tms320f28379d-writing-to-a-register-not-working

器件型号:TMS320F28379D
Thread 中讨论的其他器件:C2000WAREcontrolSUITE

大家好、我正在尝试从 ePWM 寄存器读取数据并将数据写入其中。 我可以读取整个寄存器、但当我尝试读取一半或一个单一位(例如 EPwm2Regs.TBCTL.bit.PHSDIR)时、我会得到一个编译错误:

错误:不允许获取位字段的地址

作为权变措施、我读取一个完整寄存器(EPwm2Regs.TBCTL)、然后提取一个单一位(PHSDIR =位13)。

但是、如果我尝试写入单个位、我也会得到相同的错误。

我尝试使用类似的方法:读取整个寄存器、更改特定位、然后向同一寄存器写入新值、但这不起作用。 我可以在 DAC 上看到第13位发生变化、但没有斜坡信号(TBCTR 为零)。

是否可以只对一个位进行写入? 在此过程中、我可能会覆盖 TBCTL 寄存器的其他一些位、因此我的斜坡为零

模型已连接。

e2e.ti.com/.../TBCTL_5F00_Write_5F00_test_5F00_R2018a.zip

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

    尊敬的 Mike:

    [引用 userid="270650" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1173879/tms320f28379d-writing-to-a-register-not-working ]\n 是否可以只对一个位进行写入? [/报价]

    是的、可以对一个位进行写入。 我建议参考 C2000Ware 中的 ePWM 软件示例之一以获取相关示例。 查看这些示例后、我会将项目设置与您的项目设置进行比较、以确保链接到正确的头文件。

    C:\ti\c2000\C2000Ware_version\device_support\f2837xd\examples\CPU1

    此致、

    Marlyn

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

    您好、Marlyn、

    感谢你的答复。

    我已经介绍了一些代码示例。 我使用与示例中相同的语法来指向寄存器、但在我的情况下、它不起作用。 即使我尝试写入一半的寄存器、它也不会改变。

    在此应用中、我正在读取整个 TBPHS 寄存器、并向 TBPHS 寄存器的上半部分写入一个新值、但存储器复制块似乎无法覆盖现有值、并且我在 DAC 输出上看到的偏移不会改变。

    存储器复制目标设置|应用代码| ePWM 设置

    TBPHS 寄存器:

    在另一个示例中(更改一个位)、如果我使用地址而不是名称、对于 TBCTL 寄存器偏移= 0h、我已经输入了该偏移、但不知道如何移动到第13位?

    更新了

    写入单个位

    这篇文章 说将代码放在 EALLOW 和 EDIS 之间、我就是这样做的。

    我还将存储器复制块放入触发的子系统中、但编译时仍会出现错误:

    "TBCTL_Write_Test_R2018a_2.c"、第858行:错误:不允许获取位字段的地址
    1在"TBCTL_Write_TEST_R2018a_2.c"的编译中检测到错误。
    >>编译失败
    Gmake:***[TBCTL_Write_Test_R2018A_2.obj]错误1.

    下面显示了从 TBCTL_Write_TEST_R2018A_2.c 中提取的代码、其中第7行对应于错误消息中引用的第858行。

      /* ConstCode for S-Function (memorycopy): '<S2>/Memory Copy4' incorporates:
       *  Constant: '<Root>/Constant6'
       */
      {
        boolean_T *memindsrc = (boolean_T *)
          (&TBCTL_Write_test_R2018a_2_P.Constant6_Value);
        boolean_T *meminddst = (boolean_T *) (&EPwm2Regs.TBCTL.bit.PHSDIR);
        EALLOW;
        *(boolean_T *) (meminddst) = *(boolean_T *) (memindsrc);
        EDIS;
      }
    
      /* End of ConstCode for S-Function (c28xisr_c2000): '<Root>/C28x Hardware Interrupt' */
    

    从单个位读取

    编译错误消息:

    "TBCTL_Write_Test_R2018a_2.c"、第136行:错误:不允许获取位字段的地址
    1在"TBCTL_Write_TEST_R2018a_2.c"的编译中检测到错误。
    >>编译失败

    下面显示了从 TBCTL_Write_TEST_R2018A_2.c 中提取的代码、其中第3行对应于错误消息中引用的第136行。

    /* S-Function (memorycopy): '<Root>/Memory Copy8' */
    {
    boolean_T *memindsrc = (boolean_T *) (&EPwm2Regs.TBCTL.bit.PHSDIR);
    boolean_T *meminddst = (boolean_T *) (&rtb_MemoryCopy8);
    *(boolean_T *) (meminddst) = *(boolean_T *) (memindsrc);
    }

    如我的 inial 文章中所述、当我读取整个寄存器(EPwm2Regs.TBCTL)、然后提取一个单一位(PHSDIR =位13)时、它可以正常工作。

    /* S-Function (memorycopy): '<Root>/Memory Copy2' */
    {
    uint32_T *memindsrc = (uint32_T *) (&EPwm2Regs.TBCTL);
    uint32_T *meminddst = (uint32_T *) (&rtb_MemoryCopy);
    *(uint32_T *) (meminddst) = *(uint32_T *) (memindsrc);
    }
    
    /* DataTypeConversion: '<Root>/Data Type Conversion1' incorporates:
    *  DataTypeConversion: '<S1>/Extract Desired Bits'
    */
    rtb_DataTypeConversion1 = (int16_T)(rtb_MemoryCopy >> 13U) & 1;

    更新2.

    写入寄存器

    我尝试写入 TBPRD 寄存器(这次是整个寄存器)。 我尝试了三种不同的方法;所有方法都在硬件中断子例程中

    1. 使用存储器复制并将源代码符号设置为:&EPwm2Regs.TBPRD、具有 EALLOW; EDIS;之前和之后。 可以编译和加载
    2. 使用存储器复制并分别为 TBPRD 设置地址和偏移:HEX2DEC ('00004100') HEX2DEC ('00000063')、EALLOW EDIS 均为之前和之后。 可以编译和加载
    3. 使用数据存储存储器和自定义代码块作为替代 方法、如此处所示。 无法编译。 获取数据存储器参数未定义错误。

    在所有情况下、所有受监控的信号都降至零。 随附了案例1 (_a)和2 (_b)的 C 代码。

    e2e.ti.com/.../3566.TBCTL_5F00_Write_5F00_test_5F00_R2018a_5F00_3.zip

     

     

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

    尊敬的 Mike:

    感谢您提供更多详细信息。 我将在 MathWorks 中循环、因为他们可以最好地评论 MathWorks 方面的事情、尤其是内存复制块和您遇到的问题。

    此致、

    Marlyn

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

    Mike、

    有关 MathWorks 支持、请将其发布在 MathWorks 支持论坛上。 我们没有支持它的内部资源、我们依赖 MathWorks 团队。 最好在他们的论坛上回答、因为他们有一组工程师负责监控支持问题。 Hare 是支持论坛的链接。

    如果您还有其他问题、获取 MathWorks 产品支持的最佳方法是 联系 MathWorks 现场技术支持。

     

    您还可以搜索答案或在 MATLAB Answers C2000论坛上发布问题。 此外 、在文档 和 示例中提供了有关 MathWorks 支持 C2000的信息

    谢谢、此致、

    桑托什

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

    您好 、Santosh、

    感谢您的建议。

    我已将我的查询发布到 MATLAB 论坛(123)、但仍未得到答复。 我还 通过 MATLAB 论坛进行了大量搜索、但 找不到任何 用于 写入寄存    器的存储器块的引用;主要是有关读取寄存器的问题。  

    您是否有支持 C2000产品的 MathWorks 团队的详细联系信息、以便我可以直接与他们联系?

    提前感谢您、此致。

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

    Mike、

    您能否在 MathWorks 论坛上发送您的帖子的链接、以便我可以与 MathWorks 工程师进行跟进?

    此致、

    桑托什

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

    Mike、

    我给 MathWorks 工程师发送了一封电子邮件、其中包含该主题的链接、希望我们能尽快收到。

    此致、Santosh

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

    尊敬的 Mike:

    看起来您使用的是 MATLAB 版本 R2018a。
    C2000支持包使用 controlSUITE 驱动程序库文件在 R2018a 中为 F28379D 目标板生成代码、但不使用 C2000Ware。
    由于 controlSUITE 不支持访问位字段、因此 R2018a 不支持访问寄存器中的各个位。
    但是、R2022a 中添加了对针对 F2837x 目标的 C2000Ware 支持、适用于 TI C2000支持包。
    如果要访问寄存器中的各个位、可能需要迁移到最新的 MATLAB 版本。

    但是、对于 controlSUITE、读取整个寄存器、修改值以及将值写回寄存器的工作流程将起作用。
    但当我研究您的模型时、您需要提取低12位(0-11)、高2位(14-15)、并设置位13、这是不正确的。
    您正在跳过模型中的位12、这就是您无法获得正确 DAC 值的原因。
    相反、您需要提取低13位而不是12位。

    作为替代方法、您可以使用值为8192的按位异或运算符来切换位13、或使用运算符来分别设置位13。
    请参阅随附的图像。

    如有任何疑问、请联系我们:
    www.mathworks.com/support.html

    此致、
    RAM Alla | MathWorks

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

    谢谢 RAM!!

    我要在这里附加 RAM 中的映像。

    此致、Santosh

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

    您好 RAM、

    非常感谢您的回复。 我将在 R2022a 中尝试代码。

    您能否快速查看写入寄存器的示例? 在此示例中、我尝试覆盖 ePWM2 TBPRD 寄存器、即更改 ePWM2开关频率。 但是、当我添加一个 C28x 硬件中断块(存储器副本位于硬件中断块内)时、没有任何变化。 这是否也与旧版 MATLAB 相关? 我可以更改 TBPRD 并查看存储器副本-> DAC 上的更改、但 ePWM2 EPwm2Regs.TBCTR 输出在 DAC 输出上为零。

    MATLAB Simulink 模型: e2e.ti.com/.../7610.TBCTL_5F00_Write_5F00_test_5F00_R2018a_5F00_3.zip

    提前感谢您

    更新了

    我尝试读取 MATLAB R2022a 和中的一个位

    但是、当我尝试从单个位读取 EPwm2Regs.TBCTL.bit.PHSDIR 时、仍然会遇到相同的错误

    第101行:错误:不允许获取位字段的地址

    /* S-Function (memorycopy): '<Root>/Memory Copy8' */
      {
        boolean_T *memindsrc = (boolean_T *) (&EPwm2Regs.TBCTL.bit.PHSDIR);
        boolean_T *meminddst = (boolean_T *) (&rtb_MemoryCopy8);
        *(boolean_T *) (meminddst) = *(boolean_T *) (memindsrc);
      }

    版本 C2000Ware_4_00_00_00提供了相同的错误。

    MATLAB Simulink 模型: e2e.ti.com/.../TBCTL_5F00_Write_5F00_test_5F00_R2022a_5F00_2.zip

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

    尊敬的 Mike:

    这似乎是使用 存储器复制块访问位字段的限制。  
    您可以尝试使用前面建议 的权变措施来修改寄存器值、方法是使用逐位运算符屏蔽不必要的位、如上图所示。

    如果您 有任何疑问、请通过以下地址联系我们:
    www.mathworks.com/support.html

    此致、
    RAM Alla | MathWorks