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.

[参考译文] TMS320F28377D:TMS320F28377D

Guru**** 2220740 points
Other Parts Discussed in Thread: TMS320F28377D, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1137056/tms320f28377d-tms320f28377d

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

我使用的是 TMS320F28377D、我的外部时钟为16MHz

使用 DELAY_US 函数在某些 GPIO 上创建脉冲和延迟。

对于1000us 的延迟、我得到1.3ms

我正在尝试找到我需要告诉系统我有16MHz 时钟的地方、以便它可以计算适当的延迟。

我在 device.h 中找到此代码、并将时钟更改为16MHz、但它似乎没有任何效果。

您能告诉我需要在哪里输入原始频率吗?

//#define DEVICE_OSCSRC_FREQ 20000000U
#define DEVICE_OSCSRC_FREQ 16000000U

//
//定义以传递到 sysctl_setclock()。 将按如下方式配置时钟:
// PLLSYSCLK = 20MHz (XTAL_OSC)* 20 (IMULT)* 1 (FULT)/2 (PLLCLK_BY_2)
//
#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT (20)|\
SYSCTL_FMULT_NONE | SYSCTL_SYSDIV (2)|\
SYSCTL_PLL_ENABLE)

//
//基于上述 device_setClock_CFG 的200MHz SYSCLK 频率。 更新
//如果使用不同的时钟配置,请使用下面的代码!
//
#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 20 * 1)/ 2)

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

    Traian、

    您已正确更改了这个值、下面的几行代码是#define DEVICE_DELAY_US (x)、它将 DEVICE_SYSCLK_FREQ 作为其输入。

    我怀疑用于 GPIO 切换的驱动程序有一些调试开销、在这里不理想。

    如果右键单击项目并选择"属性"、然后转至"Build">C2000 Compiler->Predefined Symbols":是否可以检查您是否看到"debug"作为预定义?  如果是、现在我们将其删除、重新编译、看看您的时间是否更合理。  

    "调试"预定义可对驱动程序函数进行多次预检查、以确保传递的变量在调用函数之前处于范围内。  对于最终版本代码、我们希望消除该开销。

    最棒的
    Matthew

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

    Mathew

    似乎没有设置调试预定义:

    我更仔细地研究了一点、在我看来、DELAY_US 一点也不受  DEVICE_OSCSRC_FREQ 的影响。

    这就是我这么认为的原因:

    我找到了 F2837xD_examples.h 中定义的 DELAY_US 函数、  

    extern void F28x_usDelay (长循环计数);

    //
    //不要修改此行。
    //
    #define DELAY_US (a) F28x_usDelay (((( long double) A * 1000.0L)/(long double) cpu_rate)- 9.0L)/ 5.0L

    首先、DELAY_US 是一个外部 definition...in 订单、用于查找定义位置、我在此文件夹中执行了文件内容搜索:

    C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f2837xd

    在此  asm 文件中、只找到出现 F28x_usDelay 的一个文件:  F2837xD_usDelay.asm

    这个定义与  DEVICE_OSCSRC_FREQ 没有任何关系,它只取决于 CPU_RATE ... 但是  CPU_RATE 是一个硬定义、位于同一  F2837xD_Examples.h (第312行)中

    #define CPU_RATE 5.00L //针对200MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 5.263L //对于190MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 5.556L //对于180MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 5.882L //对于170MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 6.250L //对于160MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 6.667L //对于150MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 7.143L //对于140MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 7.692L //对于130MHz CPU 时钟速度(SYSCLKOUT)
    //#define CPU_RATE 8.333L //对于120MHz CPU 时钟速度(SYSCLKOUT)

    当我根据晶体与 原始20MHz 的不同方式(将 CPU_RATE 设置为6.25)按比例更改上述 CPU_RATE 时、我将获得正确 的1ms 延迟。

    现在、我需要了解 CPU_RATE 与 DEVICE_OSCSRC_FREQ 的关联方式和位置

    但我感觉自己缺少了什么...感觉自己没有正确  的 DEVICE_OSCSRC_FREQ ...有些地方不匹配...

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

    我错误地阅读了您的帖子、为了使事情更加混乱、我们的示例中定义了2个延迟函数。  在 device.h 中、有一个名为 SYSCTL_DELAY 的函数、该函数应从 device.h 获取输入以使时钟/延迟时间正确。

    如前所述、还有另一个名为 F28x_usDelay 的延迟函数正在被调用、它正在从您找到的 Examples.h 文件中获取其时钟速率信息。

    我认为这里的问题是我们有两个用于相同目的的函数;但也在2个位置定义时钟速率。  我需要在内部跟进这个问题;我知道 F28x_usDelay 已经存在很长时间、我不确定的是 SYSCTL_DELAY。

    最棒的

    Matthew

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

    看起来 SYSCTRL_DELAY 只是为了给 CPU 周期延迟、而 F28x_usDelay 是为了让这一步更进一步到时域。

    最棒的

    Matthew

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

    您好!

    SYSCTL_DELAY 在 driverlib 中定义、 F28x_usDelay 在基于位字段的示例中使用。 两者完全相同、并将环路计数作为输入。

    对于延迟、我们使用宏来计算  所需的循环计数-  bitfield 中的 DELAY_US (A)和  driverlib 中的 DEVICE_DELAY_US (x)

    此致、

    Veena