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.

[参考译文] SK-AM64B:PRU GPIO 输出不工作

Guru**** 2473260 points
Other Parts Discussed in Thread: SK-AM64B, SYSCONFIG, AM6442

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1465633/sk-am64b-pru-gpio-output-not-working

器件型号:SK-AM64B
主题中讨论的其他器件: SysConfigAM6442

工具与软件:

我的 PRU GPO10输出无法正常工作、我不知道原因。

我对有关 TI 产品的 PRU 和多核编程比较陌生、因此在这篇文章中、我会试图强调我所做的假设-请纠正你认为错误的任何内容! 我渴望更好地了解这一系统。


我的最终目标是使用 PRU 读取 Σ-Δ ADC 信号、并将该数据放入 A53内核上的 Linux 进程中、同时 R5F 内核也会进行一些处理。 我想我可以从很大程度上复制 AM243x 电机控制示例中的代码。
假设0:从一些存储器映射进行更改后、为 AM243x 编写的代码也可以在 R5F 和 PRU 内核上运行、因为它们基本相同。
我的第一个小步骤是使用调试器逐步执行 PRU 程序、并在 CCS Debug Register 窗口和示波器上看到 GPIO 引脚切换。
假设1:可以同时调试 R5F 内核和 PRU。



Setup (设置)

开发软件

CCS v12.8
TI ARM 编译器 v20.2.7
TI PRU 编译器 v2.3.3
MCU+ SDK AM64x v09.02.01
Windows 11.
XDS110 USB 调试探针

董事会

SK-AM64B HS-AM64B FS
引导模式:OSPI
引导加载程序:SBL-NULL (在对标准 COM 串行输出进行下电上电时、显示"Starting NULL Bootloader ...)
DMSC 固件 v09.02.08、ABI 版本3.1
我在 PRU 连接器(J10)上的引脚47 (DGND)和53 (PRG0_PRU0GPO10)之间进行一个示波器测量。

系统设置

我参考了 MCU+ SDK 文档中的"入门"部分。
我将 CCS 和 MCU+ SDK 安装到它们的默认位置(C:\ti)、并  为我的电路板创建了"Target Configuration"。 我在下文中将其称为"手动创建的目标配置"。 我所绕过的唯一内核是 ICSSG1和 M4F 中的 PRU。
在这项工作之前,我一直从 SD 卡引导 Linux ,所以我首先删除了该卡。 在 MCU+ SDK 文档的"EVM 设置"部分之后、我将"SOC 初始化二进制文件"刷写到 SK 中。  将引导模式切换到 OSPI 后、我在 UART 终端上看到了 NULL 引导加载程序输出、如文档中所示。 在使用 SBL NULL 进行开发时、我还遵循"注意"块后面关于不必要 GEL 文件的注释。 我修改了我在上面创建的目标配置。 注意:每次我清除 Cortex A53_0 CPU 属性下的"初始化脚本"字段时、CCS 都会使用"..\CCSTargetConfigurations"重新填充该字段。 不确定这是否是问题。
然后、我按照 构建 Hello World 示例 指令以及 CCS 启动、加载和运行 指令运行了 Hello World 应用、且运行正常。

应用程序

我从 PRU IO 空项目开始、我从 MCU+ SDK 的"examples/pru_io/empty"目录导入了 empty_pru_io_am64x-evm_r5fss0_freertos_ti-arm-clang 和 empty_am64x-evm_icssg0-pru0_fw_ti-pru-cGT 工程。 我注意到、每个工程中包含的 targetConfig 在"Board or Device"下都有"AM64x_GP_EVM"、因此对于 PRU 和 R5F 工程、我将其更改为"AM64x_SK_EVM"。 我还更改了每个 targetConfig 中的 GEL 文件、以便与上述"EVM 设置"部分结束时所述的更改相匹配。

按照 PRU IO 空工程的"Steps to Run Example"、我首先构建了 PRU 工程、然后构建了 R5F 工程。 按照这些步骤、我应该"启动 CCS 调试会话并运行可执行文件、请参阅 CCS 启动、加载和运行"。 这些说明显示了如何使用手动创建的目标配置、我就是这么做的。

假设3:在此双 CCS 工程示例中、构建的 PRU 二进制文件的副本存储为 R5F 工程可以访问的文件夹中的"pru0_load_bin.h"、因此构建的 R5F 二进制文件包含烘烤的 PRU 二进制文件、R5F 驱动程序在运行时将其加载到 PRU 中。

要调试空项目、我需要启动手动创建的目标配置、连接到 R5_0_0和 ICSS_G0_PRU_0内核并对其进行复位、然后使用"Run > Load..." 选项卡、以将二进制文件分别加载到 R5F 和 PRU。 然后、我可以在 R5F 和 PRU 上分步执行代码、它似乎有效。

尝试使用 GPIO

PRU IO Empty Project 中的一行吸引了我的注意力:"注意:PRU 项目无法独立运行、因为它依赖于 R5F 项目生成的 SysConfig 文件来初始化 PRU。" 我绘制这意味着我需要使用 R5F 工程的 SysConfig、以保证 AM64主引脚多路复用允许 PRU GPO 位于实际器件之外。 我将 PRG0_PRU0_GPO10配置为输出、并强制它使用焊盘 AA5上的引脚、如下所示。

我还找到了 AM64X:如何切换 PRU 上的 GPIO 引脚? 常见问题解答文章。 我的 SysConfig 看起来相同。 我唯一做的与常见问题解答不同的事情是、在调试期间不连接到 DMSC 内核、但代码仍然运行、所以我认为没关系。

我将以下内容添加到 PRU IO 空 main.asm 文件中、并在顶部添加了 time_macros.inc"标头。 如果我以某种方式得到了引脚数错误、则从 SET/CLR 切换到写入所有16个最低 GPO 引脚。

我重新构建了 PRU 项目、然后是 R5F 项目、并为这两者启动了调试会话。 程序运行正常、我可以看到 R30变化的值、但物理板上的 GPO10保持在0V 左右。我尝试写入此环路以输出1kHz 方波。 我在示波器前面确认了示波器探头是1kHz 输出、因此我认为这不是仪表问题。

R5F 程序和 PRU 都保留在断点处、我在这些寄存器周围进行了计数、以查看是否有任何东西消失。 AM6442数据表显示信号 PRG0_PRU0_GPO10是焊球 AA5/PADCONFIG98的多路复用器模式0、我在这里已经展示了这一点:

GPCFG0寄存器应具有 MUX SEL 0、如此处所示(从 R5F 角度查看寄存器):

假设4:为了将 PRU GPO 信号路由到 AM64x 之外、SoC 宽的 PADCFG 和 ICSSG_CFG 都需要适当的多路复用。

那么... 我缺少什么? 我看到的是错误的寄存器吗?

感谢您提前阅读这篇文章、我真的很感激!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tim、您好!

    感谢您提供有关您遵循的步骤的详细信息。

    [quote userid="547746" url="~/support/processors-group/processors/f/processors-forum/1465633/sk-am64b-pru-gpio-output-not-working 假设0:从一些内存映射进行更改之后、为 AM243x 编写的代码也可以在 R5F 和 PRU 内核上运行、因为它们基本相同。

    我相信您的意思是、AM243x 的代码也可用于 AM64x、这是正确的。

    我还想补充一点、我们在 MCU+ SDK 中也有专用的 ADC 接口示例。 您可以针对 ADC 连接的最终用例对其进行评估。 请参阅 examples_PRU_ADC

    [报价 userid="547746" url="~/support/processors-group/processors/f/processors-forum/1465633/sk-am64b-pru-gpio-output-not-working 假设3:在此双 ccs-project 示例中、构建的 PRU 二进制文件的副本存储为"pru0_load_bin.h"、存储在 R5F 项目可以访问的文件夹中、因此构建的 R5F 二进制文件包含 PRU 二进制文件、R5F 驱动程序在运行时加载到 PRU[/pru]。

    正确、一旦 PRU 工程编译完成、 固件头文件 pru_load_bin.h 就会复制到/examples/pru_io/empty/firmware/{device}/ 默认情况下 R5F 工程包含选项中存在的目录。

    使用   R5F 代码中的 PRUICSS_loadFirmware API 调用、将固件头文件中的指令写入 PRU IRAM 存储器。

    [报价 USERID="547746" URL"~/support/processors-group/processors/f/processors-forum/1465633/sk-am64b-pru-gpio-output-not-working 假设4:对于将 PRU GPO 信号路由到 AM64x 之外、需要在 SoC 宽 PADCFG 和 ICSSG_CFG 上进行适当的多路复用。[/QUOT]

    关于 Pinmux 设置、您无需手动设置任何内容。 在 SysConfig 中选择所需的 PRU 引脚后、将自动处理 pinmux 设置。



    现在、关于此处的问题可能是什么、

    [报价 userid="547746" url="~/support/processors-group/processors/f/processors-forum/1465633/sk-am64b-pru-gpio-output-not-working ]我有一个示波器用于测量 PRU 连接器(J10)的引脚47 (DGND)和引脚53 (PRG0_PRU0GPO10)之间的电压。[/QUOT]

    从原理图中可以看出、您为 PRU0GPO10信号使用了错误的引脚。 您能否尝试下面所示的引脚、并告诉我这是否有帮助?

    此致、

    Nitika

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

    嗨、Nitika、

    非常感谢您提供的极好的答案。  

    对未来用户的建议:请查看原理图上的标题块。 PROC100和 PROC100A 具有不同的 PRU 引脚排列。
    请将其与 SK-AM64x 上的贴纸进行比较。 我最初使用的电路板是 GP 板、即适用于 Proc100版本 E3的 PROC100E3。 我一直使用的 SK-AM64B 是 PROC100A。  

    我一直使用不同的原理图、如下所示。

    尝试 Pin 23作为你建议的工作,非常感谢你!

    此致!
    Tim Krentz