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.

[参考译文] TMS320F28069M:纳秒级 CPU 定时器

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1302843/tms320f28069m-cpu-timer-in-nanoseconds

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

你(们)好!

我尝试 在纳秒内配置 CPU 计时器以生成具有3MHz 频率的时钟信号。 我修改了 C2000ware 中的 ConfigCpuTimer 代码(以微秒为单位进行配置)、如下所示:

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float BlinkIntervalInNs)
{
    // Calculate clock period in nanoseconds
    float ClockPeriodInNs = 1.0 / Freq * 1000 * 1000;

    // Calculate PRD for desired blink interval
    Uint32 PeriodInClocks = (Uint32)(BlinkIntervalInNs / ClockPeriodInNs);

(我将计时器的输入时钟设置为90MHz)

我使用一个示波器来观察此信号、此信号在输出时钟信号达到一个1.33MHz 频率前成功生成。 不过、当我设置 BlinkInterval 以使 输出时 钟频率高于1.33MHz 时、根本不会生成信号。

我一直在为如何解决这个问题而苦恼。  有人能给我建议吗? 谢谢。

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

    尊敬的 Gen:

    您的示例中使用的是什么时钟源? 您是否对 PLL (systctrl.c)或选项进行了与 CPU 计时器示例中提供的更改不同的其他更改?

    此致、

    小津野市

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

    您好、Ozino、

    我正在使用 CPU 计时器0作为时钟源、并且我 在 SYSCTRL.c 中没有做任何更改。  

    我所做的更改包括:

    • CPU 定时器.c
      • ConfigCpuTImer (正如我在原始帖子中所述)
    • LEDBlink.c (我修改了这个代码来生成输出时钟信号)  
      • 将输出引脚从 GPIO 0更改为 GPIO 34

    除了以上几点、我的代码与示例中提供的代码保持一致。

    此致、

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

    大家好、Gen、我将向另一位主题专家重新分配该主题。  不幸的是,他今天不在办公室,但应该能够回答星期一。  也就是说、你可以尝试单步执行代码并"监视"你的关键变量。  在将输出频率推至1.33MHz 时、我想知道其中一个变量是否溢出。

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

    您好、Gen:

    除了 Joe 提到的内容外、您还能给我发送一个屏幕截图吗? 我想验证这些值是否在 计时器寄存器的参数范围内。 此外、上述代码片段未显示这些参数的新纳秒级版本如何加载到计时器寄存器中、您能否显示整个 ConfigCpuTimer 函数?

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

    您好 Joe 和 Omer:

    有关整个 ConfigCpuTimer 函数、请参阅下文。 我还将尝试单步执行代码以查看关键变量。

    void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float BlinkIntervalInNs)
    {
        // Calculate clock period in nanoseconds
        float ClockPeriodInNs = 1.0 / Freq * 1000 * 1000;
    
        // Calculate PRD for desired blink interval
        Uint32 PeriodInClocks = (Uint32)(BlinkIntervalInNs / ClockPeriodInNs);
    
        // Update PRD and other configurations
        Timer->RegsAddr->PRD.all = PeriodInClocks - 1;
        Timer->RegsAddr->TPR.all = 0;
        Timer->RegsAddr->TPRH.all = 0;
        Timer->RegsAddr->TCR.bit.TSS = 1;
        Timer->RegsAddr->TCR.bit.TRB = 1;
        Timer->RegsAddr->TCR.bit.SOFT = 0;
        Timer->RegsAddr->TCR.bit.FREE = 0;
        Timer->RegsAddr->TCR.bit.TIE = 1;
    
        // Reset interrupt counter
        Timer->InterruptCount = 0;
    }

    此致、

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

    您好、Gen:

    假设您调用 ConfigCpuTimer (&CpuTimer0、90,380)或类似1.33 MHz 频率的输出函数、那么您尝试存储在计时器周期寄存器中的值为0x7 F67A 9600、至少需要35位。 TIMERxPRD 寄存器总共只有32位宽(与 PRD 和 PRDH 16位寄存器分开)。 因此、鉴于寄存器限制、该周期无法实现。

    您可以存储在 PRD+PRDH 寄存器的最大值为0xFFFF FFFF 或 4,294,967,295。