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.

[参考译文] EK-TM4C1294XL:PLL 初始化/配置步骤

Guru**** 2481985 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/704908/ek-tm4c1294xl-pll-initialization-configuration-steps

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C1294NCPDT

您好!

寻求有关使用 MOSC (外部25MHz xtal)配置 PLL 以驱动 SYSCLK 的说明、并对数据表中的步骤有一些疑问。

在2014年6月18日 TM4C1294NCPDT 数据表第5.3节(第246页) PLL 配置的修订版中、第4步说明将 RSCLKCFG 寄存器中的 OSCSRC 域设置为0x3 = MOSC、但它并未说明如何将 PLLSRC 域设置为 MOSC、 这对于配置 PLL 而言似乎很重要。  在 SysCtlClockFreqSet()的 TivaWare 实现中、它将 OSCSRC PLLSRC 设置为0x3 = MOSC、但随后它会恢复 OSCSRC 以在退出前使用 PIOSC。  第一和第二个问题是:

第4步是正确的、还是应该改为将 PLLSRC 字段设置为0x3?  如果您的唯一目的是使能 PLL 来驱动 SYSCLK、那么在配置期间是否有任何理由将 OSCSRC 和 PLLSRC 都设置为 MOSC?

数据表中也没有提到如何设置 MOSCTL 中的 OSCRNG 位。  我不确定在使用 PLL 或 OSC (PLL 被绕过)或两者时是否需要这个、但 SysCtlClockFreqSet 实现确实将其置位。  第三个问题:

使用 PLL (频率> 10MHz)时、是否应设置 OSCRNG?

更重要的是步骤7 (写入 MEMTIME0)和8 (等待 PLLSTAT)是否必须按该顺序执行。  似乎可以在 PLL 锁定后、但在设置 MEMTIU 之前设置 MEMTIME0 (以启用新的 EPROM 和闪存时序)。  最后一个问题是:

在 PLL 状态变为锁定状态之前、是否有理由写入 MEMTIME0?

我已经能够使用下面的代码配置 PLL 以将 SYSCLK 成功驱动至120MHz、使 OSCSRC = 0x0 PIOSC、到目前为止一切似乎都正常。  我将其分解为三个主要步骤。  感谢您提供任何反馈/更正。

// 加电复位(POR)后、CPU 将使用精确内部
// 运行频率为16MHz 的振荡器(PIOSC)。
//有三个主要步骤 初始化/使用 PLL:
// 1) 1)启用主振荡器(MOSC)。
// 2) 2)配置和启用 PLL。
// 3) 3)重新配置 SYSCLK 以使用 PLL 作为其源。
// 每个主步骤都有一个或多个子步骤、涉及直接寄存器访问。
//
void PLL_Init120MHz (void)
{
//
//步骤1:启用 MOSC
//

//同时应用子步骤1-3以保留当前 MOSCCTL 位值。
uint32_t mosc = sysctl_MOSCCTL_R;

// 1)通过清除"no crystal"位来为 MOSC (主振荡器)加电。
// EK-TM4C1294XL 电路板上的晶振为25MHz 并连接到 OSC0和 OSC1。
mosc &=~SYSCTL_MOSCCTL_NOXTAL;

// 2)通过清除断电位来启用主振荡器的电源。
mosc &=~SYSCTL_MOSCCTL_PWRDN;

// 3)指定高振荡器范围(>=10MHz)。
//此子步由 SysCtlClockFreqSet 执行、其表述为"增加
// 10MHz 及以上 MOSC 的驱动强度"。 Valvano 不使用它
//或数据表配置中提到的。
mosc |= SYSCTL_MOSCCTL_OSCRNG;

// 3)设置并等待 MOSC 经过足够的时间到达
晶体的预期25MHz 频率//。 得到的 MOSCCTL 值将为0x10。
SYSCTL_MOSCCTL_R = mosc;

//这将检查加电屏蔽的中断状态位。
while (((SYSCTL_RIS_R & SYSCTL_RIS_MOSCPUPRIS)==0){}

//
//步骤2:配置和启用 PLL
//

// 5)清除 PLL 输入时钟源并将其设置为 MOSC。
//由于拼写错误(?)、数据表中似乎未提及此子步骤 也就是这样
//改为设置 OSCSRC 字段。 SysCtlClockFreqSet 和 Valvano 都设置了 PLLSRC、
//但它们也设置了 OSCSRC。 SysCtlClockFreqSet 在之后恢复 OSCSRC
//启用 PLL,但 Valvano 没有。 似乎没有必要设置给定的 OSCSRC
// PLL 不会被旁路(?)。 数据表中没有说明原因
//必须将 OSCCRC 配置为在 PLL 配置时临时使用 MOSC、以此类推
//跳过这里。
SYSCTL_RSCLKCFG_R =(SYSCTL_RSCLKCFG_R &~SYSCTL_RSCLKCFG_PLLSRC_M)| SYSCTL_RSCLKCFG_PLLSRC_MOSC;

//步骤6-8在数据表中进行了说明(pgs.237-238)
//=
1
(dfin +
1)

/(dfin = 1)/(1)/(dfin = 1)/(dfin + 1)/(1)/(dtin = 1)/(dtin + 1)/(dtin = 1)/fin + 1) 对于 fxtal= 25MHz、设置 Q = 0、N = 4 => fin = 25MHz/((0+1)(4+1))= 5MHz
SYSCTL_PLLFREQ1_R = 0x4;

// 7)设置 M分数= 0
SYSCTL_PLLFREQ0_R &&~SYSCTL_PLLFREQ0_MFRAC_M;

// 8)设置 Mint = 96 = 0x60 => fvco =(5MHz * 96)= 480MHz
SYSCTL_PLLFREQ0_R =(SYSCTL_PLL_PLQ0_R

)| 0_Rp =(SYSCTL_PLQ0_PLLVM_R_Rp)| 0_Rp =(SYSC0_PLQ0_PLQ0)+ 0_Rp =) 0 ~0_Rp + 0)/0 + 稳定并锁定请求的频率需要一些时间。
SYSCTL_PLLFREQ0_R |= SYSCTL_PLLFREQ0_PLLPWR;

// 10)等待 PLL 上电并锁定。
while ((SYSCTL_PLLSTAT_R & SYSCTL_PLLSTAT_LOCK)==0){}

//
//步骤3:重新配置 SYSCLK 以使用 PLL。
//

// 11)设置主闪存和 EEPROM 存储器的时序参数。
//这些设置将在下面设置 MEMTIU 位后生效。
//因此,清除相关的字段位,确保保留的位保持不变。
//对于 CPU 频率100MHz < f <= 120MHz:
// EBCHT = FBCHT = 0x6
// EBCE = FBCE = 0
// FWS = EWS = 0x5;
//由于保留的位20和4显示为0x1,因此得到的 MEMTIME0值应为:0x01950195
UINT32_t timim0 = SYSCTL_MEMOR_0;
memtim0 &=~(SYSCTL_MEMTIME0_EBCHT_M | SYSCTL_MEMTIME0_EBCE | SYSCTL_MEMTIME0_EWS_M |
SYSCTL_MEMTIME0_FBCHT_M | SYSCTL_MEMTIME0_FBCE | SYSCTL_MEMTIME0_FWS_M);
memtim0 ||(SYSCTL_MEMTIME0_EBCHT_3_5 | SYSCTL_MEMTIME0_FBWS_3_5 |(0x5 < SYSCTL_MEMOR_0 |


)= SYSCT14_MEMTR0 | SYSCTTR_MEMCTL_0 |(0x5 < 0x5)+ SYSCTR_MEMCTL_MEMOR_MEMOR_MEMOR_0 =同时应用 SYSCTR0)。
uint32_t rsclkcfg = SYSCTL_RSCLKCFG_R;

// 12)设置 PLL 系统时钟分频值= 3 => SYSCLK = 480MHz /(1+3)= 120MHz。
rsclkcfg =(rsclkcfg &~sysctl_RSCLKCFG_PSYSDIV_M)| 0x3;

// 13)使用 PLL 作为系统时钟源
rssclkcfg |= sysctl_RSCLKCFG_USEPLL;

// 14)应用 MEMTIMEU 寄存器值并在设置的内存时序中更新。
rsclkcfg |= SYSCTL_RSCLKCFG_MEMTIU;

SYSCTL_RSCLKCFG_R = rsclkcfg;

} 

谢谢!

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

    您好、J spicer、

    [引用 user="j spicer">第4步是否正确、或者是否应将 PLLSRC 字段设置为0x3?  如果您的唯一目的是使 PLL 能够驱动 SYSCLK、那么在配置期间是否有任何理由将 OSCSRC 和 PLLSRC 都设置为 MOSC?[/QUERP]

    本文档似乎遗漏了 有关从 MOSC 驱动 PLL 的 PLLSRC 要求的步骤。 如果您看看表5-3、可以清楚地看到 、当从 MOSC 驱动 PLL 时、PLLSRC 需要被设置为0x3。

    [引用 user="j spicer"]

    数据表中也没有提到如何设置 MOSCTL 中的 OSCRNG 位。  我不确定在使用 PLL 或 OSC (PLL 被绕过)或两者时是否需要这个、但 SysCtlClockFreqSet 实现确实将其置位。  第三个问题:

    使用 PLL (频率> 10MHz)时、是否应设置 OSCRNG?

    [/报价]

    MOSC 的 OSCRNG 取决于器件所使用的外部晶体。 可使用低至5MHz 的频率、在这种情况下 不应设置 OSCRNG 位。 当任一大于10MHz 的晶振被使用时、 OSCRNG 位应该被置位。 我认为、由于 PLL 使用低至5MHz 的输入晶振运行、因此未提及此步骤、因为在某些情况下它不适用、但最好将其作为系统特定的步骤。

    [引用 user="j spicer"]

    更重要的是步骤7 (写入 MEMTIME0)和8 (等待 PLLSTAT)是否必须按该顺序执行。  似乎可以在 PLL 锁定后、但在设置 MEMTIU 之前设置 MEMTIME0 (以启用新的 EPROM 和闪存时序)。  最后一个问题是:

     在 PLL 状态变为锁定状态之前、是否有理由写入 MEMTIME0?

    [/报价]

    从我看到的内容来看、我认为你可以毫无问题地更改该顺序、但我没有为 SysCtlClockFreqSet 编写代码、所以我无法100%确定。

    [引用 user="j spicer">我已经能够使用以下代码配置 PLL 以将 SYSCLK 成功驱动至120MHz、使 OSCSRC = 0x0 PIOSC、到目前为止一切似乎都正常。  我将其分解为三个主要步骤。  感谢您提供任何反馈/更正。[/引述]

    我不明白为什么您要努力重新构建 TivaWare 已经处理的函数。 无论如何,这不是我们将要审查的问题。 TivaWare 实现方案经过数百个客户的充分测试、因此我们致力于支持经过充分测试和验证的 TivaWare API。 我们的论坛指南第4点: e2e.ti.com/.../695568中对此进行了说明

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

    您好 Ralph!

    本文档似乎遗漏了 有关从 MOSC 驱动 PLL 的 PLLSRC 要求的步骤。 如果您看看表5-3、可以清楚地看到 、当从 MOSC 驱动 PLL 时、PLLSRC 需要被设置为0x3。

    是文档未完成某个步骤还是错误地键入了某个步骤?  我的第二个问题是 是否必须同时设置 OSCSCR 和 PLLSRC、在这种情况下、有一个关于设置 PLLSRC 的遗漏步骤。  另一方面、如果在配置 PLL 时不需要设置 OSCSRC、那么它似乎只是一个拼写错误、"OSCSCR"应该被"PLLSRC"取代。

    MOSC 的 OSCRNG 取决于器件所使用的外部晶体。

    谢谢!  不清楚> 10MHz 频率是指晶体、但这与 SysCtlClockFreqSet 在设置前检查的内容相吻合。

    从我看到的内容来看、我认为您可以毫无问题地更改订单...

    海事组织似乎也是合理的。  感谢您的确认、了解这可能不是100%。

     

      

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

    感谢后续问题。 答案实际上并不是很简单明了。 根据预期的器件操作、本文档在 PLLSRC 设置方面"一步"。

    但是、正如您所注意到的、OSCSRC 被设置为 SysCtlClockFreqSet 末尾的 PIOSC、所以看起来 OSCSRC 只是一个拼写错误、对吧? 将 OSCSRC 设置为 PIOSC 的原因实际上是一个勘误项 SYSCTL#23、此项在 www.ti.com/.../spmz850g.pdf 中有相关说明

    由于 SYSCTL#23、时钟配置结束时 OSCSRC 的设置是将 OSCCLK 设置为采用 PIOSC 而不是 MOSC。 因此、如果勘误项不存在、则数据表指令 RE:OSCSRC 不会成为问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    我认为这可能是一个拼写错误,因为第5.3节(第246页)中的步骤明确地涉及在 POR 之后为 SYSCLK 配置 PLL。  如果目的是使用 PLL、那么为什么要更改 OSCSRC?  它已默认为 PIOSC、如果您不使用它、为什么要更改它?  我也是基于图5-5的时钟树、其中 SYSCLK 似乎完全由 OSCCLK VCO 驱动、具体取决于 USEPLL 的设置。  

    勘误表#23似乎确认了相同的情况:

    在 TivaWare 2.1.2或更早版本中、当使用参数 SYSCTL_OSC_main 调用 API 时、SysCtlClockFreqSet 会将 PLL 源设置为 MOSC。 它将 OSCCLK 设置为 MOSC、这不是必需的、可能会导致此问题

    我对 SysCtlClockFreqSet 的解释是、它将 OSCSRC 设置为 MOSC 作为回退位置、例如、如果未选择 PLL 选项或在 这种情况下无法锁定、您最终会得到由主振荡器通过 OSCCLK 驱动的 SYSCLK。  但最终恢复到 PIOSC 毫无意义、直到现在。

    无论如何、对于 PLL、勘误表中的关键字是"不需要"的、这就是为什么我在我的修订步骤中没有设置 OSCSRC、尽管步骤4和 SysCtlClockFreqSet 说过、因为它看起来并不必要。

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

    我不反对你的思维方式、但不幸的是、当 SysCtlClockFreqSet API 针对勘误项进行了写入或修改时、我不知道为什么要执行该步骤。 这本来是很好的,因为 DS 永远不应该这样做。

    此时、由于 API 的使用没有问题、因此对于拥有广泛使用案例、系统和操作环境的数百个客户而言、我们不会研究对 SysCtlClockFreqSet 的任何修改、也不会研究可能出现的不可预见问题。 老话说:“如果没有坏,就不要解决”。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ralph、

    我认为你也不应该修改 SysCtlClockFreqSet、但是你应该至少对数据表为什么在 PLL 的初始化/配置部分中说将 OSCSRC 设置为 MOSC 进行一些调查。 如果该信息不正确并且 SysCtlClockFreqSet 编程器过去也遵循了该信息(与其他人一样、现在仍然如此)、那么这可能是函数被中断的原因、必须发布之前的勘误表。 无论如何、在这里不能获得有关 OSCSRC <-MOSC 的确切答案是令人失望的、但我确实理解这个论坛的重点是 TivaWare API、我感谢您的时间和支持。 谢谢!

    此致、
    Jspicer