主题:SysConfig 中讨论的其他器件
工具/软件:
您好、
我们希望从多个内核访问某些外设、即使通过 syscfg 在一个内核上初始化外设也是如此。
只有一个初始化程序和一个用户用于我们的目的。
作为示例。 我们希望内核 0_0 初始化 GPIO(在 syscfg 中配置)、并希望内核 0_1 打开和关闭 GPIO。
我们想象这是可能的、因为多个内核可能 知道硬件寄存器地址并更改它。
这是可能的吗? 如果没有、限制因素是什么?
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.
工具/软件:
您好、
我们希望从多个内核访问某些外设、即使通过 syscfg 在一个内核上初始化外设也是如此。
只有一个初始化程序和一个用户用于我们的目的。
作为示例。 我们希望内核 0_0 初始化 GPIO(在 syscfg 中配置)、并希望内核 0_1 打开和关闭 GPIO。
我们想象这是可能的、因为多个内核可能 知道硬件寄存器地址并更改它。
这是可能的吗? 如果没有、限制因素是什么?
意识到我应该 更具体一点、GPIO 示例是我们遇到问题的概念验证。
我们希望两个内核能够侦听相同的 CAN FD RX 消息、但 TX 消息只需要一个内核
我们希望一个内核能够 设置 ePWM 外设、另一个内核能够更新 CMPA 值
了解 上面的 GPIO 示例(一个内核配置 GPIO、另一个内核设置 GPIO)仍然会很好、因为我们可以使用该示例、但另外两个特定的用例示例 对于我们找到答案也很重要。
谢谢!
对延迟深表歉意、
您是否还看过 IPC 或 SPINLOCK 示例/功能? 这可能是通过 IPC 传输数据来实现 ePWM 应用的理想方法。
对于 GPIO、我知道可以跨内核共享数据、但我正在与其他团队成员一起检查是否可以通过多个内核控制单个外设。 我记得对端口访问有一些限制(即一个内核一次可以访问一个端口)、但不记得细节。 
至于 CAN、请咨询我们的 CAN 专家。 我是否正确理解您希望同时接收两个内核? 
此致、
Susan
您好、Susan、
对于 ePWM CMPA 寄存器更新、我们可以使用 IPC 将 cmpa 值从一个内核传递到下一个内核、但我们正在尝试尽可能减少任何邮箱的增加计算。 如果可能、最好允许一个内核直接写入 HW 寄存器。
对于 GPIO 响应、了解内核之间共享外设之间的限制非常有价值。 如果您能提供这些 非常棒的细节。
对于 CAN、是的、我们希望两个内核同时接收代码。
感谢您、期待您的答复!
您好:
我做了一些研究并与我们的一些其他专家进行了交谈、是的、可以使用一个 CPU 内核配置外设、然后让其他内核更新、运行和/或控制不同的外设。 遗憾的是、我们的大多数示例都假设您只使用一个内核。 使用多个内核时、建议使用 SPINLOCK 来帮助缓解多个内核访问共享存储器时的问题。
因此、我将在这里尽力回答您的问题、因为我了解这些问题: 
对于 GPIO、可以使用一个内核来配置任何 GPIO、然后使用另一个内核来控制该 GPIO。 在此情况下、需要牢记两个重要事项: 
对于 ePWM、我想我误解了您的使用意图。 据我所知、与 GPIO 一样、完全可以从一个 CPU 内核设置和启动 EPWM、然后减轻外设控制的负担、并从不同的 CPU 内核更新 CMPA 寄存器。
对于 CAN、额外的内核配置用于扩展的 MCAN 功能、而不是 CPU 内核。
在同时接收 CAN 数据方面、查看它的方法是、当接收到 CAN 数据时、数据存储在 MSG RAM 中、然后可由各个 CPU 内核访问。 多个内核无法同时访问 MSG RAM。 但是、可以让 DMA 将数据从 MSG RAM 移动到一个共享的存储位置、然后可由多个内核访问该位置。
一般来说、不同的 CPU 内核在外设中可以访问的内容存在限制、但确切的限制取决于您尝试实现的目标。 请注意、包含所有内核上整个系统的目标方框图将有助于了解内核之间的分布。 如果您能提供系统方框图、我会更好地说明您可以采取哪些措施来实现这些目标。
我希望这对您有所帮助、
Susan
您好、Susan、感谢您的答复。
您能否提供使用 SDK 的说明、说明如何更改在运行期间哪个内核控制 GPIO 引脚。
此外、请提供类似的 SDK 指令、以允许 使用单独的内核控制 EPWM 和 CMPA 寄存器。
对于 CAN、一个内核是否打算设置 CAN TX/RX 和一个 DMA 通道、在该通道中、会触发 DMA 以将数据从 MSG RAM 移动到共享存储器、从 CAN RX 中断? 请您在此处提出最佳流程。
最后、为了提供我们项目的详细信息、我们很高兴离线分享。
谢谢!
为延迟道歉、  
通过一些示例和详细说明花费的时间比计划的时间长。 
对于 GPIO:
MSS_IOMUX 寄存器的 GPIO_SEL 位控制哪个 CPU 连接到哪个 GPIO:

赋值(使用相应的 API)如下:
要更新内核所有权、您需要重新定义 GPIO 引脚的 PINMUX 配置。
SysConfig 会自动为您执行此操作(请参阅 ti_pinmux_config.c 文件)
以 gpio_led_blink_am263x-cc 示例为例、GPIO 配置如下:

您必须为 GPIO1 写入新的配置并为其重新配置 Pinmux:

最好在更改配置后通过调用 gpio_init () 重新初始化 GPIO;
如果您将使用 GPIO 中断、我建议取消初始化 GPIO、重新配置、然后重新初始化 GPIO:

对于 ePWM、每个内核都可以作为启动器连接到每个 ePWM。 对于 EPWMx 的每个实例、都有一个 Y 组(对于 Y =[0:4])。 为防止冲突、我们通常将一个组分配给每个启动器、然后将该组分配给 EPWM 实例。 每个 ePWMx_GROUPy 都有自己的一组具有自己基址的寄存器。
使用下图作为参考、您可以通过内核 1 的组 0 寄存器(橙色)或组 1 寄存器(红色)访问 EPWM0(TRM 的“系统互连“一章中详细介绍了更多信息):

通过 SysConfig 配置 EPWM 实例时、它会自动将 EPWM 实例分配给组。 以 ePWM_UP_AQ_am263x-cc 为例、由 Core0 配置的 EPWM0、EPWM1 和 EPWM2 实例分配给组 0(G0,上图中是黑色):

为了更新 CMPA、有专用的 ePWM API。 此代码示例中使用的是 EPWM_setCounterCompareValue():

无论您使用哪个内核来更新 CMPA 值、您需要确保使用分配给 EPWM 实例的基地址(使用此处的代码示例,对于 EPWM0、您需要使用 CONFIG_EPWM0_BASE_ADDR)。 应该可以直接从另一个内核调用它。
对于 CAN、根据 CAN 专家的建议、您应该遵循以下流程:
我在文本中还添加了指向 SDK 中 PINMUX 和 EPWM API 的链接。
此致、
Susan