Other Parts Discussed in Thread: TMS320F28388D, C2000WARE, SYSCONFIG
器件型号: C2000WARE
主题中讨论的其他器件: TMS320F28388D、 Sysconfig
器件: 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 行添加前缀。