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.

[参考译文] TMS320F280039:C2000Ware 中的软件诊断库在 STL_Util_delayUS/ STL_UTIL_CPU_RATE 中使用了过于粗略的近似值

Guru**** 2468610 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1477123/tms320f280039-software-diagnostic-library-in-c2000ware-has-a-too-coarse-approximation-in-stl_util_delayus-stl_util_cpu_rate

器件型号:TMS320F280039
Thread 中讨论的其他器件:C2000WARE

工具与软件:

软件诊断库中的自检应用示例(文件"sta_tests.c")使用此代码片段中的代码对 CPU 计时器进行测试

用于获取比较系统节拍所经过的延迟 STL_Util_delayUS ()、

static inline void STL_Util_delayUS(uint32_t microseconds)
{
    uint32_t delay = (uint32_t)(((((float32_t)microseconds * 1000.0f) /
                                (float32_t)STL_UTIL_CPU_RATE) - 9.0f) / 5.0f);

    SysCtl_delay(delay);
}

具体取决于  STL_UTIL_CPU_RATE 、在"stl_util.h"中定义为

//
// Defines
//
#define STL_UTIL_CPU_RATE 8.33f // for a 120MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 10.00f // for a 100MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 11.111f // for a 90MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 12.500f // for a 80MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 16.667f // for a 60MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 20.000f // for a 50MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 25.000f // for a 40MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 33.333f // for a 30MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 41.667f // for a 24MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 50.000f // for a 20MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 66.667f // for a 15MHz CPU clock speed (SYSCLKOUT)
//#define STL_UTIL_CPU_RATE 100.000f // for a 10MHz CPU clock speed (SYSCLKOUT)

120 MHz 的有效数字为正 范围之内 、适用于大数字和严格范围、如中的示例所示 STL_OSC_CT_stopTest ()也是 粗调 精度。

可用于测试 失败 -这发生在我的设置。

解决方案可以用更多的数字(如8.3333f)更改#define、但它仍是 C2000Ware 标头的一部分。
在我的案例中,我选择避免完全 STL_Util_delayUS,直接使用 SysCtl_delay,并计算延迟与(甚至更安全)整数算术。 我最终得到了一些表现类似的代码

uint32_t delay_counts =
     (((STA_USER_OSC_MIN_COUNT + STA_USER_OSC_MAX_COUNT) / 2u) - 9u) / 5u;
SysCtl_delay(delay_counts);

可对象的是上面的代码甚至不引用 CPU 时钟频率。 但是、即使是原始代码也不会:它只是将其隐藏在宏中(以及8.33f 幻数中)

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

    感谢您报告这个问题。 我将在未来的版本中提交一个错误以进行改进。

    惠特尼