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] [参考译文] [常见问题解答] PRU_ICSSG:如何在 CCS 中检查和设置 PRU 内核频率?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1041347/faq-pru_icssg-how-to-check-and-set-pru-core-frequency-in-ccs

Thread 中讨论的其他器件:SysConfig

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

注意:这些步骤介绍了如何使用 CCS 设置 PRU 内核频率。 CCS 在开发和调试 PRU 应用时非常有用。 但是、在 由 Linux、RTOS 或裸机内核初始化 PRU 的生产代码中、需要执行不同的步骤来设置 PRU 时钟频率。

从 Linux 设置 PRU 内核频率:参考 [常见问题解答] PRU_ICSSG:如何在 Linux 中检查和设置 PRU 内核频率?

通过 RTOS 或裸机设置 PRU 内核频率:使用 MCU+ SDK 中的 SOC 驱动程序。 在 MCU+ SDK 文档中、参考"SOC 外设驱动程序">"SOC"。  在 SysConfig 的 PRU-ICSS 模块中选择特定频率会添加自动生成的代码,以便在初始化期间调用“SOC_moduleSetClockFrequency”API。 如果需要在稍后的运行期间更改 PRU-ICSS 时钟频率、则可以再次使用相同的 API。 请注意、适用于 SDK 8.0及更早版本的 AM24x/AM64x SysConfig 仅提供针对时钟频率200MHz - 250MHz 的选项。  适用于 SDK 8.1及更高版本的 AM24x/AM64x SysConfig 提供200MHz 至333MHz (1GHz/3)的完整 ICSSG 时钟频率范围

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

    此响应将介绍一般步骤。 稍后的回答将提供具体示例。

    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 中有多种初始化 EVM 的方法。 本常见问题解答将假设您按照 [常见问题解答] AM64x/AM24x:如何使用 Code Composer Studio (CCS)连接到 PRU_ICSSG?中的步骤操作。  

    对于 AM24x/AM64x SDK 8.1及更早版本、 OPSI SBL NULL 初始化二进制文件不启用 PRU 时钟。 因此、必须在  CCS 连接到处理器的 DMSC 时执行的 DMSC GEL 脚本中修改 PLL 输出时钟频率。

    TODO:此方法是否适用于 AM65x 处理器?

    TODO:是否有关于客户如何跨不同处理器找到此 DMSC GEL 文件的通用指南?

    如何检查系统时钟频率?  

    提供了一个 GEL 脚本、用于检查 PLL 配置。 该脚本可从 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 存储器窗口中观察或修改这些寄存器。  连接到 R5内核。 如果内存浏览器不可见、请使用 View > Memory Browser 将其打开。 现在、您可以通过键入要查看的十六进制地址导航到不同的存储器区域。

    从 CCS 存储器窗口:

    0x40308044 = 0x00000000 => ICSSG1_CORE_CLK
    
    0x300a603c = 0x00000000 => MAIN_PLL2_HSDIV0_CLKOUT

    因此、ICSSG1当前正在使用  ICSSG1_CORE_CLK。 ICSSG1_CORE_CLK 来自  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 内核时钟频率  

    GEL 文件在哪里?  

    ccs_base\emulation\gel\AM64x\AM64x.gel --> OnTargetConnect()-->运行 Set_All_PLL_OFC1()。 Set_All_PLL_OFC1 ()在 ccs_base\emulation\gel\AM64x\AM64_PLL\AM64x_PLL_OFC1.gel 中定义。

    Set_All_PLL_OFC1 ()运行 Setup(),该设置在 ccs_base\emulation\gel\AM64x\AM64_PLL\AM64x_PLL.gel 中定义。 Setup()调用 Program_PLL()。 由于 Clocking_Scheme = OFC1、因此 MAIN_PLL2_HSDIV0_CLKOUT 分频器由 MAIN_PLL2_OFC1_HSDIV0_DIV_VAL 设置、MAIN_PLL0_HSDIV9_CLKOUT 分频器由 MAIN_PLL0_OFC1_HSDIV9_DIV_VAL 设置。

    如果我们选中 CCS_base\emulation\gel\AM64x\AM64_PLL\25MHz_HFOSC\AM64x_PLL_PARAMS_OFC1.gel、我们会看到这一点
    MAIN_PLL2_OFC1_HSDIV0_DIV_VAL = 5 (6分频)
    MAIN_PLL0_OFC1_HSDIV9_DIV_VAL = 2 (3分频)

    对于 PLL2、HSDIV0:1800MHz 除以6可得到300MHz、这与 Get_All_PLL_Configurations GEL 脚本的输出相匹配。


    如何更改 PLL 分频器?  

    假设我们要使用  MAIN_PLL2_HSDIV0_CLKOUT、但使用225MHz 时钟而不是300MHz 时钟。 然后、我们将更新 ccs_base\emulation\gel\AM64x\AM64_PLL\25MHz_HFOSC\AM64x_PLL_PARAMS_OFC1.gel 条目 MAIN_PLL2_OFC1_HSDIV0_DIV_VAL、将1800MHz 除以8、以获得225MHz 的输出时钟:

    #define MAIN_PLL2_OFC1_HSDIV0_DIV_VAL    7      //8


    如何选择不同的时钟源?  

    请注意、以下是选择进入 AM64x ICSSG1内核的时钟的 ICSSG1寄存器:

    ICSSG1, CTRLMMR_ICSSG1_CLKSEL   :   4300 8044h
    
    ICSSG1, ICSSG_CORE_SYNC_REG     :   300A 603Ch

    假设我们要选择250MHz ICSSG1_ICLK、而不是  ICSSG1_CORE_CLK。 然后、我们需要将寄存器 ICSSG_CORE_SYNC_REG 的 CORE_VBUSP_SYNC_EN 位从0更新为1。

    转至存储器浏览器并导航至0x300A603C。 将鼠标悬停在8个字节上、直到您悬停在上面的地址出现、从而验证您正在查看的32位地址是否为正确的存储器地址。 现在、您可以通过双击地址来编辑寄存器值。

    PRU 内核时钟现在将由250MHz 接口时钟提供。

    如果我们希望 运行 PRU 内核、以便每个 PRU 时钟周期恰好有3ns、该怎么办? 然后、我们需要 由 MAIN_PLL0_HSDIV9_CLKOUT 提供333MHz 时钟。

    首先、检查 寄存  器 ICSSG_CORE_SYNC_REG 的 CORE_VBUSP_SYNC_EN 位的值是否为0 (即、我们使用的是 ICSSG1_CORE_CLK)。

    接下来、我们需要写入 CTRLMMR_ICSSG1_CLKSEL。 但是、CTRLMMR 寄存器受写保护。 为了向 CTRLMMR 寄存器写入新值、我们需要先解锁 KICK 寄存器。 有关更多信息、请参阅 TRM 部分的"KICK 保护寄存器"。

    CCS 中有一个 GEL 脚本、可用于解锁 MCU_CTRL_MMR 寄存器。 首先、确保您已连接到 R5内核。 然后转至 Scripts->Lock-Unlock->Unlock_Register、并输入要解锁的地址:0x43008044。 现在、您可以导航到 存储器浏览器中的0x43008044并更新 CORE_CLKSEL 位。 在此示例中、IEP_CLKSEL 位已设置为0、我将其保持不变。


    PRU 内核时钟现在将由 MAIN_PLL0_HSDIV9_CLKOUT 提供。 默认 GEL 脚本已 根据"GEL 文件在哪里?"部分将 MAIN_PLL0_HSDIV9_CLKOUT 设置为333MHz (1GHz/3、或恰好为3ns)、因此无需更新 GEL 脚本。 如果您想使用与 MAIN_PLL0_HSDIV9_CLKOUT 不同的频率、您将需要如上所述更新 PLL 分频器。