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、我的外部时钟为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