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.

[FAQ] 如何在 CCS 中查看和设置 PRU 内核频率

我正在使用带有 PRU_ICSSG 的处理器(AM24x、AM64x、AM65x),并使用 Code Composer Studio (CCS) 连接处理器。如何查看 PRU 内核的运行频率?如何更改 PRU 内核频率?

(客户须知:本文档正在编制中。如需反馈,请随时发表评论。我们将删除所有评论,并在编写完文档后锁定文章)

  • 答:

    此次答复将说明一般步骤,后续将给出具体示例。

    如何实现 ICSSG 内核时钟?

    有关 PRU_ICSSG 时钟如何连接处理器的信息,请参阅处理器的技术参考手册 (TRM),先查看 TRM 的“PRU_ICSSG 集成”部分、“PRU_ICSSG 电源和时钟管理”部分,再看“PRU_ICSSG 时钟”表

    ICSSG 中实际使用的 CORE_CLOCK 是通过 ICSSGn_CORE_CLK 或 ICSSGn_ICLK(250MHz,与接口时钟同步)选择的。CORE_CLOCK 通过寄存器 ICSSG_CORE_SYNC_REG、位 CORE_VBUSP_SYNC_EN 进行选择。

    ICSSGn_CORE_CLK 可从不同的系统时钟中选择,具体取决于器件。ICSSGn_CORE_CLK 通过寄存器 CTRLMMR_ICSSGx_CLKSEL、位 CORE_CLKSEL 进行选择。

    系统时钟是何时配置的?

    在 CCS 中,PLL 输出时钟频率由 DMSC GEL 脚本配置,该脚本在 CCS 连接到处理器的 DMSC 时执行。DMSC GEL 脚本配置 PLL 和分频器设置,依据是... 是否有介绍客户如何查找此文件的通用指南?

    TODO:AM64x_PLL_PARAMS_OFC1.gel 中的设置实际适用于哪些情况?如果用户使用 https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_07/exports/docs/api_guide_am64x/EVM_SETUP_PAGE.html#EVM_SOC_INIT_NOBOOT_MODEhttps://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/08_01_00_07/exports/docs/api_guide_am64x/EVM_SETUP_PAGE.html#EVM_SOC_INIT_SD_BOOT_MODE,它是否会被覆盖?

    如何查看系统时钟频率? 

    提供了用于检查 PLL 配置的 GEL 脚本,该脚本可从 R5F0_0 或 DMSC 执行。要执行此脚本,须连接到所需的内核并执行:Scripts->PLL Configuration->Get PLL Configurations->Get_All_PLL_Configurations。GEL 脚本的输出可用于计算 PLL 输出频率。有关如何计算 PLL 输出频率的详细信息,请参阅 TRM 表“PLLTS16FFCLAFRACF 输出时钟”。

    AM64x 示例: 

    ICSSGn_CORE_CLK 在 MAIN_PLL2_HSDIV0_CLKOUT(225MHz、300MHz)或 MAIN_PLL0_HSDIV9_CLKOUT(200MHz、250MHz、333MHz,即,1GHz/3)之间选择。

    假设我们要将 ICSSG1 配置为 250MHz。

    查看当前的 PRU 内核时钟频率

    TRM ICSSG1 集成图中显示的时钟多路复用器的设置通过以下寄存器进行配置:

    ICSSG1, CTRLMMR_ICSSG1_CLKSEL   :   4300 8044h

    ICSSG1, ICSSG_CORE_SYNC_REG     :   300A 603Ch

    可以在 CCS“Memory”窗口中观察或修改这些寄存器。

    从 CCS“Memory”窗口:

    0x40308044 = 0x00000000 => ICSSG1_CORE_CLK

    0x300a603c = 0x00000000 => MAIN_PLL2_HSDIV0_CLKOUT

    因此,ICSSG1 目前正在使用 MAIN_PLL2_HSDIV0_CLKOUT。

    从 Get_All_PLL_Configurations GEL 脚本:

    MAIN_Cortex_R5_0_0: GEL Output: Base address: 0x00680000

    MAIN_Cortex_R5_0_0: GEL Output: PLL index: 0x00000002

    MAIN_Cortex_R5_0_0: GEL Output: PLL index register base: 0x00002000

    MAIN_Cortex_R5_0_0: GEL Output: Register: 0x00000020

    MAIN_Cortex_R5_0_0: GEL Output: Reference Divider is:     1

    MAIN_Cortex_R5_0_0: GEL Output: Feedback Divider is:      72

    MAIN_Cortex_R5_0_0: GEL Output: Fractional Multiplier is: 0

    MAIN_Cortex_R5_0_0: GEL Output: Output Divider #1 is:     1

    MAIN_Cortex_R5_0_0: GEL Output: Output Divider #2 is:     1

    MAIN_Cortex_R5_0_0: GEL Output: Number of hsdivs: 10

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #0's divider value is: 6

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #0's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #1's divider value is: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #1's clkout_en: 0

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #2's divider value is: 9

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #2's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #3's divider value is: 6

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #3's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #4's divider value is: 18

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #4's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #5's divider value is: 8

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #5's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #6's divider value is: 8

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #6's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #7's divider value is: 18

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #7's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #8's divider value is: 1

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #8's clkout_en: 0

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #9's divider value is: 5

    MAIN_Cortex_R5_0_0: GEL Output: HSDIV #9's clkout_en: 1

    MAIN_Cortex_R5_0_0: GEL Output: Parsed PLL configuration information.

    OSC:25MHz

    FOUTP = (25e6/1) * (72 + 0) / (1*1) = 1.8e9

    FOUTPOSTDIV = 1.8e9/6 = 300e6,300MHz

    因此,ICSSG1 内核时钟当前设置为 300MHz。

    更改 PRU 内核时钟频率 

    TODO

    1) 讨论我们如何使用 ICSSGn_ICLK(如示)或 MAIN_PLL0_HSDIV9_CLKOUT 并更改输出频率(如本示例其余部分所示)。我们是否需要特殊权限来通过“Memory”窗口修改任何寄存器?是否应该以不同的方式更新寄存器?

    2) 讨论如何更改 PLL 和分频器设置。在哪些情况下,以下步骤是正确的?“当启动 CCS 并连接到 DMSC 时,将执行 DMSC GEL 脚本。在这种情况下,PLL 和分频器设置由 AM64x_PLL_PARAMS_OFC1.gel 中的设置决定,并且可以在 GEL 文件中进行修改。”需要记录哪些其他 PLL 初始化案例?