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.

[参考译文] TMS320F28032:当时钟源被配置为外部振荡器时、CPU 定时器2的前6个脉冲丢失。

Guru**** 2537080 points
Other Parts Discussed in Thread: TMS320F28035

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/605566/tms320f28032-first-6-pulses-of-cpu-timer-2-lost-when-clock-source-configured-as-external-oscillator

器件型号:TMS320F28032
主题中讨论的其他器件: TMS320F28035

我们将 CPU 定时器2用作一种外部脉冲计数器。

到目前为止、我们已使用以下代码来配置 CPU 定时器2:

EALLOW;

SysCtrlRegs.PCLKCR3.bit.CPUTIME2ENCLK = 1; //启用 CPU 计时器2

SysCtrlRegs.CLKCTL.bit.TMR2CLKSRCSEL = 1; //设置计时器2的输入时钟以使用外部引脚

SysCtrlRegs.CLKCTL.bit.TMR2CLKPRESCALE = 0; //将输入时钟源的预分频器设置为/1

SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; //将外部时钟源引脚设置为 GPIO19

EDIS;

除了上电复位、GPIO19的前6个脉冲不会导致  CpuTimer2Regs.TIM 递减计数、一切都正常。 在第6个脉冲之后、CpuTimer 正常递减计数。

这个问题似乎是时间独立和频率独立的。 加电后、我可以等待几分钟、无论什么、前6个脉冲都将丢失。 我还可以将脉冲分开几秒钟、它们也会丢失到第7个脉冲。  

我还尝试了设置 TMR2CLKSRCSEL = 0 (SYSCLKOUT)、等待几微秒、然后切换回 TMR2CLKSRCSEL = 1。 使用调试器、我观察 到 CpuTimer2Regs.TIM 在时钟源为 SYSCLKOUT 时递减、但在切换到外部时钟源后、前6个脉冲再次丢失。

有什么想法我做了什么错?

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

    这是一个有趣的问题、它与时间和频率无关。


    我有几个问题要问您、以便更好地了解情况:

    1.您将什么用作外部时钟源?

    2.是否已尝试将 XTALOSCOFF 设置为1? TMS320x2803x Piccolo 系统控制和中断参考指南(修订版 C)
    表示如果使用 XCLKIN、则该位设置为1。


    您可以在下面尝试一些操作:

    1.您可以尝试将鉴定设置为3个或6个样本以过滤信号噪声。 使用 GPACTRL 寄存器。
    (对于3个样本、将 GPAQSEL2寄存器设置为01;对于6个样本、设置为10)

    2.也可以尝试通过将 CLKCTL[XTALSCOFF]设置为1来手动关闭晶体振荡器。 在打开 OSC 的复位时、该值默认为0。

    有关这些建议的更多信息、请查看下面链接的《TMS320x2803x Piccolo 系统控制和中断参考指南》。

    www.ti.com/.../sprugl8c.pdf

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

    尊敬的 Kevin:

    感谢您的回复:

    外部时钟源实际上是一个光耦合器、在连接到 GPIO19之前、光耦合器的输出通过逻辑逆变器传递。 我们使用示波器探测信号、这是一个非常干净的3.3V 方波。

    当 我配置系统时钟源时、CLKCTL[XTALSCOFF]= 1在我的代码的前面已经存在:

    EALLOW;
    SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
    SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 0;// Clk src = INTOSC1
    SysCtrlRegs.CLKCTL.bit.XTALSCOFF = 1;//关闭 XTALSC
    SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;//关闭 INTOSC2
    EDIS;

    我尝试将 GPIO19的限定条件更改为3个样本以及6个样本、但行为没有变化。 在光耦合器的另一侧、我们使用 PLC 发送宽度为1ms 的脉冲-因此不应有任何信号弹跳。

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

    我还有一些问题:

    外部时钟源(光耦合器)的运行频率是多少?

    2、您说过您正在使用 CPU 定时器2来对外部振荡器的脉冲进行计数。 这是您的原因是什么? 您是否使用它来驱动中断或类似的中断?

    需要验证的一点是、您已初始化的所有寄存器/位在代码的主段期间不会改变。 调试后、您应该能够在 CCS 中验证这些值(您可以逐行运行代码并查找更改)。

    我要注意的另一点是、该器件缺少时钟检测电路。 当切换到外部时钟源时、这可能会关闭、从而导致一些差异。

    这只是我想提请你注意的事情。

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

    尊敬的 Kevin:

    为了给您简单的系统概述、我们正在使用28032芯片开发伺服驱动器。 驱动器的输入是传统的"阶跃"、"方向"、"使能"信号、这些信号使用光耦合器进行隔离。 连接到 CPU 定时器2的"时钟"信号实际上是"阶跃"输入。

    在频率方面、它不是固定的、完全由伺服驱动器的最终用户决定。 我们仅使用 RC 电路在200kHz 后限制"阶跃"信号的最大频率。 在调试丢失脉冲问题的测试期间、我们使用的频率要低得多。  

    最初、我们只将"STEP"信号编程为外部中断。 但是、正如您所知、中断具有很大的开销、在更高的频率下、CPU 根本没有时间处理频率中断并同时执行伺服计算。 我知道我们可以将 QEP 模块配置为接受 STEP 和方向信号、但只有一个 QEP 模块、它已用于连接增量编码器。 最后、我们提出了使用带有外部时钟源的 CPU 定时器2来为我们计算步进数的想法。 此解决方案迄今为止运行良好、并为我们释放了大量 CPU 资源。 唯一的问题是启动时的这种神秘脉冲损失

    我从读取 SPRUGL8C 中知道缺少时钟检测电路、但我不得不承认有关该主题的整个部分有点难理解。 在我自己的代码被初始化并且它是 always0之后、我检查了 PLLSTS[MCLKSTS]位。 根据我的理解、这表示没有检测到异常时钟条件? 老实说、我不清楚 CPU 定时器2在时钟缺失检测电路中发挥的作用。  

    谢谢、

    Dave

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

    这似乎是一种释放一些计算能力的好方法、因为您已经在将 QEP 用于其他用途。 这是一个有趣的问题、我目前不确定为什么会忽略前6个脉冲。 我将更深入地探讨这一点。

    正确、如果 PLLSTS[MCLKSTS]位显示0、则不会看到缺少时钟、这不应该是问题。

    当我发现任何新的和相关的事情时/如果我发现、我会在这里发帖。

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

    测试 CPU 定时器2脉冲检测时、代码中是否还有其他运行内容? 您是否曾尝试将其分解为仅从 GPIO 引脚而不是光耦合器提供外部时钟? 我想确保在您测试它时没有其他可能影响它的函数。

    我正在复制您的问题。 到目前为止、它似乎按预期工作、但我尚未在上电复位后测试设置。

    会让您随时了解最新信息、
    Kevin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    感谢您花时间研究这个问题。 我不认为问题出在硬件上。 当我们之前跟踪此问题时、我们使用了一个振荡器直接探测 GPIO 引脚-绕过光耦合器。 我们在启动后根本没有观察到任何丢失的脉冲。  

    在有机会时、我将尝试使用最少的代码来设置一个新项目、以复制此问题。 在我开始工作后、我将分享代码和我的发现。 再次感谢!

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

    在 POR 之后、我能够使用 GPIO 引脚使我的设置正常工作(或者、您可以尝试使用3.3V 电源)。 我没有看到丢失的6个脉冲。

    我建议您确保从闪存正确运行此操作、并且您无需等待通过 RAM 初始化任何内容。 查看与此相关的先前论坛帖子以及如何从闪存正确运行/编程您的代码。

    e2e.ti.com/.../839255

    另外、请确保设置为使用外部时钟和 CPU 定时器2的初始寄存器位在 POR 之后不会改变。 我将包括我在下面使用的初始化函数...

    无效
    ExtOscSel (空)

    EALLOW;

    //
    // 1-GPIO19 = XCLKIN、0-GPIO38 = XCLKIN
    //
    SysCtrlRegs.XCLK.bit.XCLKINSEL = 1;//将外部时钟源引脚设置为 GPIO19

    SysCtrlRegs.CLKCTL.bit.XTALSCOFF = 1;//关闭 XTALSC、晶体振荡器
    SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0;//打开 XCLKIN
    SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0;//切换到外部时钟

    //
    //将 INTOSC1切换到 INTOSC2/ext clk
    //
    SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 0;// CNTI 为0,关闭内部时钟运行 CPU

    SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;// INTOSC1的时钟看门狗关闭
    SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1;//关闭 INTOSC2
    SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;//将 INTOSC1保持开启状态
    EDIS;


    //初始化 CPU 计时器2
    无效
    InitCPUTimer2 (空)

    EALLOW;

    SysCtrlRegs.PCLKCR3.bit.CPUTIME2ENCLK = 1;//启用 CPU 计时器2

    SysCtrlRegs.CLKCTL.bit.TMR2CLKSRCSEL = 1;//设置计时器2的输入时钟以使用外部引脚

    SysCtrlRegs.CLKCTL.bit.TMR2CLKPRESCALE = 0;//将输入时钟源的预分频器设置为/1

    SysCtrlRegs.XCLK.bit.XCLKINSEL = 1;//将外部时钟源引脚设置为 GPIO19

    EDIS;


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

    尊敬的 Kevin:

    我今天尝试了您的代码、但仍然不幸运。 在 main 函数中、除了将 RAM 函数从闪存复制到 RAM 的代码外、我注释掉了所有内容。 然后我粘贴到您共享的代码中。 我仍然看到相同的行为:前6个脉冲未接收、所有其他脉冲都正常。 我用示波器仔细检查了进入 MCU 的信号、没有任何问题。 该信号是一个非常干净的3.3V 方波、在切换回0V 之前仅持续1ms。 这是一张照片:

    无论脉冲是否是 POR 的第一个脉冲、脉冲的形状在示波器上始终相同。 您的硬件设置是什么? 它是完全相同的芯片吗? TMS320F28032TM

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

    您正在根据需要打开/关闭此信号、它是否不会以1ms 的周期(1kHz)持续运行? 不确定如果6个脉冲丢失、您会如何见证它。

    当您说"脉冲是否是 POR 的第一个脉冲无关紧要"时、您是否意味着在对 MCU 进行首次编程之后以及在打开/关闭电源之后、前6个脉冲丢失?

    我使用的是 TMS320F28035、认为他们在这个问题上不会采取不同的行动。 如果我可以获得28032、我将尝试相同的设置。

    我的设置涉及将 GPIO 引脚连接到 CLKIN (GPIO19)、并根据外部振荡器的需要将其打开/关闭。 观察寄存器 CPUTIME.TIMER2TIM 和 CpuTimer2Regs.TIM.ALL。 此外、我还有一个 timer2中断来关闭一个 LED、以便在 POR 之后进行调试。

    我正在闪存之外运行此程序的大部分内容、以便在 POR 之后正常工作、下面是.cmd 的一部分来展示这一点。

    部分


    /*分配计划领域:*/
    .cinit :> FLASHA PAGE = 0
    .pinit :> FLASHA、 PAGE = 0
    .text :> FLASHA PAGE = 0
    codestart :>开始 PAGE = 0
    ramfuncs :LOAD = FLASHD,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0

    csmpasswds :>csm_PWL_P0 page = 0
    csm_rsvd :>csm_RSVD page = 0

    /*分配未初始化的数据段:*/
    堆栈 :> RAMM0 PAGE = 1.
    ebss :> RAML2 PAGE = 1.
    等斯梅姆 :> RAML2 PAGE = 1.

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

    尊敬的 Kevin:

    是的、您回答正确、我将根据需要打开/关闭信号。 我使用 PLC 发送固定的1ms 宽度脉冲、但当我按下与其相连的按钮时、它一次只发送一个脉冲。 我今天尝试改变脉冲的宽度、似乎没有什么不同。 我还尝试让 PLC 一次发送多个脉冲。 最后、观察到的丢失脉冲数相同。

    就漏脉冲而言、是的、在 POR 和对 MCU 进行编程的两种情况下、都观察到6个漏脉冲。  

    顺便说一下、您验证丢失脉冲的方式与我所做的完全相同。 我主要通过调试观察 CpuTimer2Regs.TIM.all 的变化。  

    今天、我取出了我们公司一段时间前购买的 F28035 controlCARD、并使用相同的代码对其进行编程。 有趣的是、我也没有观察到任何丢失的脉冲。 我已经安排了其中一个 PCB 进行转换、以使用 F28035芯片、让我们看看它是否真的是特定于芯片的问题。  

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

    我很高兴听到我正确地复制了您的问题。 奇怪的是、您的设置是在 F28035 controlCARD 上工作、而不是在 F28032芯片上工作、它们应该以相同的方式工作。 我假设您正在运行完全相同的程序。 希望将您的 PCB 转换为 F28035将会有所不同。 如果我获得一个 F28032芯片并在某个时候对其进行测试、我将在这里公布我的结果。

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

    尊敬的 Kevin:
    我们有一个理论、说明为什么在我们自己的电路板上缺少脉冲、而不是 controlCARD。 我们认为这与 controlCARD 具有晶体振荡器而我们的板没有晶体振荡器这一事实有关。 请看图18左下角的内容。 在 SPRUGL8C 中、EXTCLK 信号来自与晶体振荡器块(OSC)进行异或操作的 XCLKIN 信号。 复位时、振荡器默认使能。 因此、我的理论是 controlCARD 上的前6个脉冲仍然丢失。 然而、这些脉冲来自晶体振荡器、所以当我们将 TIMER2配置为使用 GPIO19作为时钟输入时、它已经正常接受脉冲。 这有道理吗? 一种验证方法是从 controlCARD 中移除晶体振荡器、然后重试我们的代码。 我坚信、在本例中、我们将观察到丢失的脉冲。

    无论如何、即使我的理论是正确的、这仍然无法解决丢失脉冲的根本问题。 在 TI、您能与谁交流吗? 也许熟悉该器件的人会对此有一些见解?

    谢谢、
    Dave

    更新了:我刚刚测试了我的理论。 我们采用了23035 controlCARD 并对晶体振荡器进行了去色、使用我们能够观察到缺失脉冲的相同代码。

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

    这是一个有趣的理论。 为了澄清、当您在更新中说"我们能够观察到丢失的脉冲"时、您意味着在移除晶体后存在问题? 前6个脉冲"丢失"。

    如果这是您的意思、问题确实仍然存在、我将尝试与能够更好地理解这一点的人联系。 请告诉我。

    最棒的
    Kevin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    是的、您的解释是正确的、我移除晶体振荡器后、6个脉冲将丢失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    我在没有晶体振荡器的 controlCARD 上尝试了实验。 您回答正确、问题出现、前6个脉冲丢失。

    我已将此问题和所有相关信息转发给我们的设计团队、并将随时向您提供最新信息。

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

    尊敬的 Kevin:

    很高兴听到您能够重现此问题、并感谢您迄今提供的所有支持。 我正在等待您的更新。

    谢谢、

    Dave

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

    您好、Dave、

    我收到了设计团队的回复和解释。

    当将 CPU 定时器2的输入切换到外部振荡器引脚时(设置 TMR2CLKSRCSEL = 1;)、由于无毛刺时钟切换电路、将会有几个周期的延迟。 该电路中需要设置许多触发器、这些首次输入的脉冲不会使其进入计时器。 这个延迟的变化取决于时钟的相位以及 INTOSC 和 EXTCLK 之间的时钟比率。 也就是说、如果 EXTCLK 频率大于 INTOSC 频率、则会错过更多边沿。 话虽如此、6个脉冲应为错过的最大脉冲数、尤其是在传入频率远低于 INTOSC 的情况下。 当包含晶体振荡器时、不会出现缺失的脉冲、因为生成的脉冲在切换到外部引脚 GPIO19之前预设了无毛刺脉冲电路。

    我们提出了一种经过测试的方法来解决这一问题:

    如果正在使用 JTAG (连接仿真器)、您可以在设置 TMR2CLKSRCSEL 和 XCLKINSEL 之间的代码中添加延迟、以允许 JTAG TCK 脉冲通过 GPIO38 (也是默认的 XCLKIN)来设置无干扰电路。 这将处理在将 CPU 定时器2设置为将外部源用作输入(TMR2CLKSRCSEL)和将外部源引脚切换到 GPIO19 (XCLKINSEL)之间的时间内丢失的脉冲。 这只有在使用 JTAG 时才有效。 (注意:以下示例代码中使用的延迟可能不需要为100us)

    2.如果 JTAG 未被使用(仿真器未连接)、则必须在设置 TMR2CLKSRCSEL 和 XCLKINSEL 之间切换 GPIO38六次(或更多)才能为无毛刺脉冲电路供电。

    我将在下面提供一些包含这两种情况的示例代码。

    void
    InitCPUTimer2 (void)
    {
    int i = 0;
    
    EALLOW;
    
    SysCtrlRegs.PCLKCR3.bit.CPUTIME2ENCLK = 1;//启用 CPU 计时器2
    
    SysCtrlRegs.CLKCTL.bit.TMR2CLKSRCSEL = 1;//设置计时器2的输入时钟以使用外部引脚
    
    SysCtrlRegs.CLKCTL.bit.TMR2CLKPRESCALE = 0;//将输入时钟源的预分频器设置为/1
    
    GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1; //将 GPIO38设置为输出
    
    
    //如果不使用仿真器,则至少打开和关闭6次
    对于(i = 0;i < 6;i++){
    GpioDataRegs.GPBDAT.bit.GPIO38 = 1;
    DELAY_US (10);
    GpioDataRegs.GPBDAT.bit.GPIO38 = 0;
    }
    
    //DELAY_US (100);//等待来自 JTAG TCK 的脉冲
    
    SysCtrlRegs.XCLK.bit.XCLKINSEL = 1;//将外部时钟源引脚设置为 GPIO19
    
    EDIS;
    } 

    我希望所有这些都是有道理的、并且对我们有所帮助。

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    感谢您在此问题上的所有帮助! 我在我的身边测试了您的两种解决方案、它们都能完美地工作。 希望我们的交流也能帮助将来可能遇到这种情况的其他人。