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.

[参考译文] TMS320F2.8377万S -配置50 MHz频率

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635943/tms320f28377s---configure-50-mhz-frequency

主题中讨论的其他部件:TMS320F2.8377万S

我正在尝试将TMS320F2.8377万S控制器的系统时钟频率配置为50MHz。 但它不是从下面的while循环中产生的。

但它在60 MHz频率下工作。

如果我更改为软件库1.0 .0.0 版本,则没有SLIP位检查。 因此,它来自InitSysPll,但无法识别USB设备。

50MHz PLL配置。

InitSysPll (XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_4);
InitAuxPll (XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_4);

函数:void InitSysPll (UINT16 Clock_source,UINT16 imult,UINT16 fmult,UINT16 divsel)

//
//如果Timer1或Timer2计数器溢出,则停止计时器
//
while ((CpuTimer2Regs.tcr.bit.TIF == 0)&&(CpuTimer2Regs.tcr.bit.TIF == 0));

50MHz时钟配置是否有任何问题。

提前感谢。

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

    您是否可以将值TMR2INPCLKCTR更改为0x200 (512)并查看它是否来自While循环?

    此致,
    Nirav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nirav,
    感谢您的更新。
    我已将TMR2INPCLKCTR更新为0x200。 它仍然不是从while循环中产生的。

    请查看我的配置详细信息:

    文件:F2837xS_Examples.h
    #IF CPU_FRQ_50MHz
    #define CPU_RATE 20.00L //用于50MHz CPU时钟速度(SYSCLKOUT)
    #endif

    文件:F2837xS_sysctrl.c.
    函数:void InitFlash_Bank0(void)
    #IF CPU_FRQ_50MHz
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x0;// 50 MHz的闪存等待状态
    #endif

    请查看设置并提供您的反馈。

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

    让我再次重申这个问题,确认当你通过配置SYSCLK=60MHz来运行InitSysPLL时,没有任何问题,但是当你更改SYSCLK=50MHz时,你开始看到一些问题,代码被卡在while循环中,理解是否正确? 如果是,您使用什么配置来配置SYSCLK=60MHz?

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

    是的。当控制器以SYSCLK=50 MHz运行时,代码卡在“void InitSysPll (UINT16 Clock_source,UINT16 imult,UINT16 fmult,UINT16 divsel)”函数上。

    XTAL_OSC频率为20 MHz。

    60 MHz配置:

    InitSysPll (XTAL_OSC,IMULT_12,FMULT_0,PLLCLK_BY_4);

    InitAuxPll (XTAL_OSC,IMULT_12,FMULT_0,PLLCLK_BY_4);



    文件:F2837xS_Examples.h

    #IF CPU_FRQ_60MHz

    #define CPU_RATE 16.66L //用于60MHz CPU时钟速度(SYSCLKOUT)
    #endif

    计时器2时钟计数器:

    #define TMR2INPCLKCTR 0x800

    文件:F2837xS_sysctrl.c.
    函数:void InitFlash_Bank0(void)
    #IF CPU_FRQ_60MHz
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x01;// 60 MHz的闪存等待状态
    #endif

    请检查配置并提供您的观察结果。

    谢谢!

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

    好的,对于50MHz SYSCLK,您可以尝试rwait=1吗?

    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x1;// 50 MHz的闪存等待状态

    此致,
    Nirav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nirav,
    我将闪存等待状态更改为1。 但问题没有解决。
    40 MHz和55 MHz频率也面临同样的问题。
    您如何得出SYSCLK=50 MHz的TMR2INPCLKCTR为0x200 (512)的值?
    请提供详细资料。

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

    我目前正在研究这个问题。

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

    当您运行低于60MHz的SYSCLK时,C200Ware中的示例代码似乎有错误,因此当您以50MHz的速度运行时,您会看到问题。 我们将在下一个版本中修复此问题。 现在,您可以将SYSCLK配置为更高的频率,即SYSCLK=100MHz,然后将其划分为50MHz Outside InitSysPLL (外部InitSysPLL)。 例如:

    InitSysPll (XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_2);
    EALLOW;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = PLLCLK_Y_4;
    EDIS;

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

    你好,Nirav,

    感谢您的更新。

    我尝试了以下配置。 不过,我也面对同样的问题。

    EALLOW;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = PLLCLK_Y_4;
    EDIS;

    循环时代码被以下卡住。 锁定位不正确。  

    //等待SYSPLL锁定计数器
    //
    while (ClkCfgRegs.SYSPLLSTS.bit.locks!= 1)。

    在InitSysPll函数中,  

    IF ((Clock_source == ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL)&&
    (imult == ClkCfgRegs.SYSPLLMULT.bit.IMULT)&&
    (fmult == ClkCfgRegs.SYSPLLMULT.bit.FMULT)&&
    (divsel == ClkCfgRegs.SYSCLKDIVsel.bit.PLLSYSCLKDIV))

    如果divsel值相同,则返回。

    根据您的建议,系统时钟将根据divsel值进行每次配置。

    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV的值始终为1。   

    此问题是由于软件库还是硬件引起的? 请确认。

    谢谢!

    Rajkumar  

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

    您好Rajkumar:

    因此,当您配置SYSCLK=100MHz时,代码会卡在InitSysPLL函数中,您正在观察的是什么? 您是否在SYSCLK=100MHz的情况下使用以下配置配置了PLL?  

    InitSysPll (XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_2);

    我有点困惑,因为根据您之前的消息,当您配置SYSCLK=60MHz时,代码工作正常。 您是否可以共享您的项目? 或者发送代码片段,突出显示函数被卡住的位置?

    硬件或软件库没有问题,但由于您尝试配置SYSCLK=50MHz (低于设备的额定频率 ),因此存在一些硬件限制,可通过软件更新来缓解。

    此致,

    Nirav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nirav,
    感谢您的快速反馈。 请查找时钟配置的代码片段。

    InitSysPll (XTAL_OSC,IMULT_10,FMULT_0,PLLCLK_BY_2);
    EALLOW;
    ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = PLLCLK_Y_4;
    EDIS;
    InitAuxPll (XTAL,OSC,IMULT_10,FMULT_0,PLLCLK_BY_2);
    EALLOW;
    ClkCfgRegs.AUXCLKDIVSEL.bit.AUXPLLDIV = PLLCLK_BY _4;
    EDIS;


    当我在闪存中运行代码时,代码将被以下行删除。
    函数名称:void InitSysPll (UINT16 Clock_source,UINT16 imult,UINT16 fmult,UINT16 divsel)

    While (ClkCfgRegs.SYSPLLSTS.bit.locks!= 1)// stuck here (ClkCfgRegs.SYSPLLSTS.bit.locks!= 1)//卡在此处。



    请提供设备的额定频率。 它将帮助我们确定产品的时钟频率。

    谢谢!
    Rajkumar