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.

[参考译文] AM2432:AM2432 - PRU GPO 切换问题

Guru**** 2854810 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1613207/am2432-am2432---pru-gpo-toggling-issue

器件型号: AM2432
主题: SysConfig 中讨论的其他器件

尊敬的 TI 支持团队:

由于我们需要以最大切换速度(以 MHz 为单位)切换 PRU 引脚、因此我获取了 R5F - FreeRTOS 内核和 PRU 内核的参考固件。 对于 R5F FreeRTOS 工程、我使用了参考固件:- empty_PRU_IO_am243x-lp_r5fss0-0_freertos_ti-arm-clang  PRU 内核、并将其加载到

/*
 * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
 *
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *	* Redistributions of source code must retain the above copyright
 *	  notice, this list of conditions and the following disclaimer.
 *
 *	* Redistributions in binary form must reproduce the above copyright
 *	  notice, this list of conditions and the following disclaimer in the
 *	  documentation and/or other materials provided with the
 *	  distribution.
 *
 *	* Neither the name of Texas Instruments Incorporated nor the names of
 *	  its contributors may be used to endorse or promote products derived
 *	  from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <stdint.h>
#include <pru_cfg.h>

volatile register uint32_t __R30;

/*
 * main.c
 */
int main(void)
{
	volatile uint32_t gpo;

	/* GPI Mode 0, GPO Mode 0 */
	CT_CFG.GPCFG0 = 0;

	/* Clear GPO pins */
	gpo = 0x0000;

	while (1) {
		gpo = __R30;
		gpo ^= 0xF;
		__R30 = gpo;
		__delay_cycles(100000000); // half-second delay
	}
}

MWare;同样、对于切换 PRU 引脚、我已经采取了措施 empty_am243x-LP_ICSS_g0_pru0_fw_ti-PRU-CGT 并写入了 PRU 引脚切换代码。

遵守上述规定后、我构建了固件并对 AM243x_LP 板进行了编程、从而无法切换 PRU 引脚。  

我已经阅读了几个文档并遵循了其中提到的程序。 但是、问题仍然是一样的。

您能介绍一下控制 PRU 引脚的过程吗?

此外、我还会附加我的两个固件。 请进行审核、如果可能、请在最终确认您有 AM243x_LP 电路板、并提供相关措施建议。

R5F-FreeRTOS 项目:empty_pru_io_am243x-lp_r5fss0-0_freertos_ti-arm-clang.zip 

PRU 内核工程: empty_am243x-lp_icss_g0_pru0_fw_ti-pru-cgt.zip 

此致、

Nilesh V Parmar

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

    您好、

    线程所有者将在 2 月 17 日的一周内停止工作。 如果您在这周内没有收到更新、请 ping 通该线程。

    感谢您的耐心。

    此致、
    Harshith

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

    你(们)好
    我看到 PRU 引脚缺少 SysConfig。 根据使用的 PRU-ICSS 实例、请在 SysConfig 视图中使用 PRU-ICSS 模块配置引脚多路复用。  

    此外、如果您希望切换引脚的频率为最大值、建议进行基于组装的编程。每个  PRU GPIO 引脚都可以通过在 1 个 PRU 周期内直接更新 R30 寄存器进行切换(在 333MHz 200MHz PRU 内核时钟时为 3ns、在 200MHz PRU 内核时钟时为 5ns,依此类推)

    此致

    Dhaval

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

    尊敬的 Dhaval:

    感谢您的答复。

    问题已解决、我可以切换 PRU GPIO。 因此、我们已经实现了我们的第一个目标。

    第二个目标是创建 R5F 内核和 PRU 内核之间的通信通道。 我相信这可以通过 PRU IPC 实现。

    但我找不到演示 PRU 内核和 R5F 内核与 IPC 之间通信的示例。  

    能否 以 C 语言提供 PRU 内核和 R5F 内核及 IPC 的资源/示例? 不在汇编语言中。

    正在等待您的回答。 请尽快回复。

    此致、

    Nilesh

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

    Nilesh

    能否在此处分享有关您尝试使用 PRU 实施的用例的更多详细信息?
    在此基础上、我们可以提供适当的建议。

    此致

    Dhaval

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

    尊敬的 Dhruv:

    您能否在此处分享有关您尝试使用 PRU 实施的用例的更多详细信息?

    是的。 没问题。

    我们在 R5F 内核中有通过 USB 传输的数据、这些数据将传输到 PRU 内核、以便根据这些数据在 PRU 引脚上生成模式。 最终、我们必须根据来自 R5F 内核的数据驱动 PRU 引脚。

    为了满足此要求、应通过 PRU IPC 在 R5F 内核和 PRU 内核之间建立连接。 但是、PRU API 的 PRU 内核固件仅在不符合我们要求的装配体中提供。 是否有任何使用 C 语言为 PRU IPC 编写 PRU 固件的资源/示例?

    data ->通过 USB 传输-> R5F 内核->在可共享存储器中写入-> PRU 内核从可共享存储器读取数据->根据从可共享存储器读取的数据切换 PRU 引脚。

    此外、提供您的建议以满足这些要求。

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

    您好、Nilesh

    我是从度假回来的。 感谢您的耐心。

    我们来谈谈一些基本概念。

    培训资源  

    我是全新 AM243x PRU Academy 的作者。 这与全新的 OpenPRU 存储库相结合、可为您提供完整的 PRU 培训资源。

    您可以在下面找到 AM243x 学院中的 PRU Academy:
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AB.mSUi9ihL.a5hIt1grfw__AM24X-ACADEMY__ZPSnq-h__LATEST

    我目前正在编写 PRU Academy 的下一稿。 如果您有问题或反馈、请创建新的 e2e 主题、稍后将回复给我。

    您可以在此处找到 OpenPRU 存储库:
    https://github.com/TexasInstruments/open-pru

    示例代码

    用于开始开发的大多数新代码都位于 OpenPRU 存储库中、或者将迁移到 OpenPRU 存储库。 但是、其他地方也有示例项目:

    我们在 MCU+ SDK 中为 ADC 提供了一些非常基本的 PRU 代码、并在 R5F 和 PRU 之间实现了处理器间通信 (IPC)。 以下 ADC 示例中使用了该 IPC 实现:  
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/PRU_IO.html 
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/EXAMPLES_PRU_IO.html 

    电机控制 SDK 中有更复杂的 PRU 固件。 还记得目前我们是否在工业通信 SDK 中包含任何源代码。 在软件开发的这一阶段,我不建议参考该源代码 — 它并非用作教学资源。

    我还将参考较旧的 PRU 软件支持包 (PSSP) 中的示例:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/

    最终、我会将所有示例从 PSSP 迁移到 OpenPRU、但这仍是一项正在进行的工作。

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

    用例讨论:位拆裂引脚  

    PRU 内核能够确定地将引脚上的信号驱动为高电平或低电平(或读取引脚值)、且延迟比市场上任何其他处理器内核、TI 或我们任何竞争对手的处理器内核低得多。

    有关更多信息、请参阅 AM243x PRU Academy > Intro >什么是 PRU、PRU 有什么用途? >  
    PRU GPIO 信号与常规 GPIO 有何不同?
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AR2tkkLXaXMRE32fbWnq0w__AM24X-ACADEMY__ZPSnq-h__LATEST 

    如果您的波形不需要完全精确、则可以使用 C 代码编写。 然而、如果您需要在波形变为高电平或低电平时具有精确的精度、那么我们建议使用汇编语言进行编程。 您还可以将 C 代码和汇编代码合并到同一个项目中。 在 PRU 入门实验室中 、您将了解如何开始使用 C 语言、汇编语言或混合 C 语言和汇编语言。

    使用案例讨论:IPC  

    IPC 是指内核之间的任何类型的通信。 您在 MCU+ SDK 中提到的 PRU IPC 驱动程序是 R5F 和 Linux 之间的一种通信方式、但这并不是唯一的通信方式。

    听起来您的用例好像是共享存储器+通知机制。 虽然我没有为您提供一个示例、但我们可以提供多个不同的示例。 我们来一次讨论一个用例部分。

    通知机制

    每个内核如何判断数据已准备好供使用? 波形来读取中断? 通过 将共享存储器位置的前 32 位设置为 软件定义的“状态寄存器“、然后轮询状态寄存器以查看数据何时就绪? 等

    加密功能  

    R5F 内核可以使用 PRUICSS API 与 PRU 内核之间接收和发送中断。

    有关 PRU  中断控制器 (INTC) 工作原理的更多信息、请参阅 PRU Academy > HW > PRU INTC
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AevsxGpIzHNOT9QB-MgrNA__AM24X-ACADEMY__ZPSnq-h__LATEST 

    您可以在 PRU 初始化期间从 R5F 内核或在 PRU 内核初始化后从 PRU 内核的固件配置 PRU 的 INTC。 有关如何使用 SysConfig 从 R5F 内核配置 INTC 的更多信息、请参阅 PRUICSS 驱动程序文档: https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/DRIVERS_PRUICSS_PAGE.html 

    有关使用 R5F 配置 PRU、然后在 R5F 和 PRU 内核之间发送和接收中断的示例、请参阅 OpenPRU 培训实验 INTC_MCU: https://github.com/TexasInstruments/open-pru/tree/main/academy/intc/intc_mcu 

    我还没有时间将这些实验移植到 AM243x、但所有相同的概念都适用于 AM243x。

    但等待、该示例中的 PRU 固件已组装好! 如果我想使用来自 C 程序的 PRU 中断、该怎么办?

    让我向您重点介绍 AM64x 的 Linux RPMsg 示例。 同样的概念也适用于 AM243x(尽管 AM243x 上显然不存在 Linux A53 内核):
    https://github.com/TexasInstruments/open-pru/blob/main/examples/rpmsg_echo_linux/firmware/main.c

    helper information:
    some variables set in makefile:
    github.com/.../makefile
    constant table registers are defined here:
    github.com/.../pru_intc.h
    
    	while (1) {
    		/* Check register R31 to see if an interrupt has been received */
    		if (__R31 & HOST_INT) {
    			/* check the status of system event FROM_ARM_HOST to see if the ARM has kicked us */
    			if (CT_INTC.ENA_STATUS_REG0 & FROM_ARM_HOST_BIT) {
    				/* Clear the event status */
    				CT_INTC.STATUS_CLR_INDEX_REG_bit.STATUS_CLR_INDEX = FROM_ARM_HOST;
    				
    				/* the rest of your code goes here */
    			}
    		}
    	}

    是否有任何其他使用 PRU C 代码发送和接收中断的示例?

    是的。

    您还可以参阅 Direct_Connect 中的 PRU_PSSP.X 工程。 我还没有时间将这些工程移植到 OpenPRU 并移植到 AM243x:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am64x 

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

    如果我想轮询软件定义的状态寄存器、该怎么办?  

    当然、您可以这样做。 请看一下 PRU 入门实验、我在其中提供了一个直接从存储器值读取和写入的示例: https://github.com/TexasInstruments/open-pru/blob/main/academy/getting_started_labs/c_code/solution/firmware/main.c 

    定义共享存储器区域会怎么样?  

    今天就足够了。 我会让您通读所有内容并在我键入任何其他内容之前作出回应。

    此致、

    Nick

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

    请告诉我、如何定义共享内存区域、以及在单个事务中、我可以在共享内存中传输多少最大数据?

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

    您好、Nilesh

    共享存储器区域  

    您可以将一个共享存储器区域定义为两个内核都可以访问的任何位置。

    因此、共享存储器区域可以位于 DDR(如果这是一个非常大的存储器区域,则会更好)、片上 SRAM(如果需要更低的读取/写入延迟)、甚至可以位于 R5F 子系统或 PRU 子系统中。

    有关在 SysConfig Memory Configurator 工具中从 R5F 侧定义共享存储器区域的示例、请参阅页面 Remote Cores 上的应用开发> Allocate memory in AM64x Multicore Academy。 忽略对 Linux 的引用、因为 AM243x 没有 A53 内核:
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AXdlNVv-3hxEuToJ8O8ivg__AM64-ACADEMY__WI1KRXP__LATEST

    在 PRU 方面、您如何访问共享存储器将取决于存储器的位置、您的时序要求有多严格、等等

    我将您的线程重新分配给另一个团队成员、以便就我们是否有任何 R5F 读取和写入共享存储器区域的示例进行评论。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请告诉我如何定义共享内存区域、以及在单个事务中可以在共享内存中传输多少最大数据?

    有关共享内存日志记录、请参阅  kernel_DPL_debug 以了解详细信息。

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

    您好、Tushar、

    我已在代码中实现 PRU IPC、并按预期运行。 但是、我们在数据传输过程中面临一些问题。

    我们在应用程序中执行了两个案例、并观察到一个案例已成功执行、第二个案例失败。

    用例 0:(读写 128BYTES(块大小:32)- Buffer0 的块 0

    1.  在 R5F 工程中、按照下图所述配置了 PRU IPC。

    2.为地址共享内存分配内存区域 0x30010000。

    3.在 PRU 项目中、PRU 项目的链接器脚本根据在 R5F 项目中为共享存储器分配的存储器区域进行更新。 下图展示了链接器的编辑方式。

    3. 对于数据传输和接收、 R5F 内核在共享存储器中写入 128 字节(32 字) (地址:0x30010000) 并为 PRU0 内核生成中断事件。

     PRU0 固件轮询中断状态寄存器持续并检查是否发生中断。 一旦发生中断、它就会从 共享存储器(地址:0x30010000)读取数据 并存储在缓冲区中。

    5.读取数据后、PRU0 固件向 R5F 内核发送中断、以确认成功接收数据。

    案例 0 按预期运行。

    用例 0:(读写 256BYTES(块大小:64)- Buffer0 的块 0

    1. 在 R5F 工程中、按照下图所述配置了 PRU IPC。

    2.步骤 2 和步骤 3 与案例 0 中提到的相同。

    3、 对于数据传输和接收、 R5F 内核在共享存储器中写入 256KB(64 字)  (地址:0x30010000)  并为 PRU0 内核生成中断事件。

     PRU0 固件轮询中断状态寄存器持续并检查是否发生中断。 一旦发生中断、它就会从 共享存储器(地址:0x30010000)读取数据 并存储在缓冲区中。

    5.读取数据后、PRU0 固件向 R5F 内核发送中断、以确认成功接收数据。

    因此、PRU 固件从共享存储器读取的数据不超过 128 字节。

    以下是 PRU 固件中的数据读取逻辑:

    PRU_IPC_MEM_BASE = 0x30010000

    正如我观察到 R5F 固件中共享存储器的存储器数据一样、R5F 内核成功写入 256 字节的数据。 (地址:0x30010000 至 0x30010100)

    下面的图像表示我要写入共享存储器(在 R5F 项目中)的数据。

    下图展示了我从 PRU 固件的共享存储器中读取的数据:

    可以观察到 PRU 固件正在正确读取前 128 个字节(32 个字)、但之后是从 0x30010000 而不是 0x30010080 读取值。  

    背后的原因/错误可能是什么? 如何正确配置 PRU IPC?

    请查看上述图片并尽快提供回复。

    如果您有一个示例表明我可以发送超过 128 字节的数据、请与我们分享。

    此致、

    Nilesh

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

    您好、Nilesh

    假设:可能是 memcpy 未生成正确的汇编读取指令

    单个加载字节突发命令 (LBBO 或 LBCO) 只能复制多达 124 字节的数据(参见 https://www.ti.com/lit/spruij2 。

    如果 memcpy 足够智能、那么我希望它会使读取命令拆分多条指令、并更新每条新指令的读取偏移。 但也许它在做别的事情。

    从你身边的行动

    当您尝试读取大量数据时、请分享根据 C 代码生成的 PRU 汇编代码。  有关如何保留生成的汇编代码的指导、请参阅 PRU 入门实验>实验 3:编译>高级选项>汇编器选项
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AanXU02bdxmfZM6lEn3iHA__AM24X-ACADEMY__ZPSnq-h__LATEST 

    我没有太多时间将汇编代码映射到 C 代码、因此 请在汇编代码文件中添加一些注释、展示读取命令的开始位置。

    您可以在 CCS 中逐步执行 C 代码、并在“Dissassembly"窗口“窗口中查看生成的汇编代码、从而查看 C 代码与生成的汇编代码之间的关联。 有关更多信息、请参阅 PRU 入门实验>实验 5:调试>查看和导航汇编代码
    https://dev.ti.com/tirex/explore/node?isTheia=false&node=A__AX1K.lD2Cl7kpC-fonM13A__AM24X-ACADEMY__ZPSnq-h__LATEST 

    此致、

    Nick

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

    您好、Nick、

    我附加了系统工程、其中包括 R5F 工程和 PRU 工程。

    在 PRU 工程中、我们有两个文件、即 C 文件和汇编文件。

    中断处理和配置在汇编文件中完成。

    从共享存储器读取的数据在 C 文件中完成。

    e2e.ti.com/.../7120.empty_5F00_am243x_2D00_lp_5F00_system_5F00_freertos_5F00_March19.zip

    请查看 PRU 和 R5F 固件并提供您的反馈。

    如果您需要更多信息、请联系我们。

    此致、

    Nilesh

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

    您好、Nick、

    请更新上面的内容。