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.

[参考译文] C2000WARE:C2000Ware 26.00.00.00 sysconfig:sysctl_setEMIF1ClockDivider () 使用原始整数而不是枚举 (F2838x) 生成

Guru**** 2837210 points

Other Parts Discussed in Thread: TMS320F28388D, C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1632569/c2000ware-c2000ware-26-00-00-00-sysconfig-sysctl_setemif1clockdivider-generated-with-raw-integer-instead-of-enum-f2838x

器件型号: C2000WARE
主题中讨论的其他器件: TMS320F28388DSysconfig

器件: TMS320F28388D (F2838x) C2000Ware 版本: 26.00.00.00 SysConfig 版本: 1.27.0 CCS 版本: 20.5.0 (CCS Theia)


问题描述

当使用 SysConfig 在 EMIF1 时钟分频器设置为/2 的 F2838x 器件上配置时钟树时、生成的device.c代码将包含一个原始整数而不是正确的枚举值:

// Generated (wrong):
SysCtl_setEMIF1ClockDivider(2);

// Expected (correct):
SysCtl_setEMIF1ClockDivider(SYSCTL_EMIF1CLK_DIV_2);

请注意、EMIF2在同一行上正确生成:

SysCtl_setEMIF2ClockDivider(SYSCTL_EMIF2CLK_DIV_2);  // correct

为什么这是有害的: SysCtl_setEMIF1ClockDivider()不将其参数视为原始分频器值。 它检查if(divider == SYSCTL_EMIF1CLK_DIV_2)、WHERESYSCTL_EMIF1CLK_DIV_2 = 1(枚举值)。 传递2而不是1导致条件评估为 false、EMIF1 会静默配置为分频器/1 而不是/2、这是以预期时钟速度的两倍运行外设。


根本原因

错误位于:

driverlib/.meta/device/functions_c/Clocktree/Asserts.xdt

这是实际用于 F2838x (VIAClocktree/Device_clocktree_c.xdt) 的模板。 注意:顶层device/functions_c/Device_clocktree_c.xdt不会 标准、但有一个红色错误。

第 110 行 在回退情况中存储完整的枚举字符串:

%var DEVICE_CLK_EMIF1_DIV = "SYSCTL_EMIF1CLK_DIV_1";

行 114 在配置的情况下仅存储原始整数:

%var DEVICE_CLK_EMIF1_DIV = system.clockTree.EMIF1CLKDIV.divideValue;

第 216 行 输出没有枚举前缀的变量:

SysCtl_setEMIF1ClockDivider(`DEVICE_CLK_EMIF1_DIV`);

与第 217 行中的 EMIF2 进行比较、后者正确添加了前缀:

SysCtl_setEMIF2ClockDivider(SYSCTL_EMIF2CLK_DIV_`DEVICE_CLK_EMIF2_DIV`);

所需修复

中有两处更改driverlib/.meta/device/functions_c/Clocktree/Asserts.xdt

更改 1 —第 110 行、使回退与前缀模式一致:

// Before:
%var DEVICE_CLK_EMIF1_DIV = "SYSCTL_EMIF1CLK_DIV_1";
// After:
%var DEVICE_CLK_EMIF1_DIV = "1";

更改 2. —第 216 行、添加枚举前缀以匹配第 217 行上的 EMIF2 模式:

// Before:
    SysCtl_setEMIF1ClockDivider(`DEVICE_CLK_EMIF1_DIV`);
// After:
    SysCtl_setEMIF1ClockDivider(SYSCTL_EMIF1CLK_DIV_`DEVICE_CLK_EMIF1_DIV`);

在这两项更改之后、会SysCtl_setEMIF1ClockDivider(SYSCTL_EMIF1CLK_DIV_2)针对/2 分频器配置正确生成 SysConfig。

附加说明

顶层模板中存在相同的错误(现在未用于 F2838x):

driverlib/.meta/device/functions_c/Device_clocktree_c.xdt

行 29/33:

// Fallback (correct — stores full enum string):
%var DEVICE_CLK_EMIF_DIV = "SYSCTL_EMIF1CLK_DIV_1";

// Configured (wrong — stores raw integer):
%var DEVICE_CLK_EMIF_DIV = system.clockTree.EMIF1CLKDIV.divideValue;

第 233 行无前缀输出:

SysCtl_setEMIF1ClockDivider(`DEVICE_CLK_EMIF_DIV`);

虽然在 C2000Ware 26.00.00.00 中未针对 F2838x 执行此文件、但仍可根据if第 232 行的条件用于其他器件 (F2837xD、F2807x、F2837xS、F28P65x)。 相同的固定模式适用:存储"1"在回退中并SYSCTL_EMIF1CLK_DIV_在第 233 行添加前缀。

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

    您好、  

    感谢您报告此错误。 就能在下一个 C2000Ware 版本中修复该问题。

    此致、

    Siddharth