Other Parts Discussed in Thread: AM62A7, SYSCONFIG
器件型号: AM62A7
主题: SysConfig 中讨论的其他器件
我想利用 AM62A7 中的 R5F MCU 来捕获传感器数据。 由于传感器的数量以及数据采样和到达的频率、我希望在不占用 CPU 并尽可能减少上下文切换的情况下在硬件中尽可能做到这一点。
需要使用 GPIO 引脚上的外部源触发、通过 SPI 以高频 (3.6kHz) 定期采样一个传感器。 以 18 个采样间隔对收集的数据进行处理并复制到共享存储器空间。 该传感器连接到主域 SPI0 通道、但交叉连接到 R5F 控制、与触发 GPIO 引脚类似。 由于 SPI0 属于主域、因此它应该具有 DMSS 功能。 MCU 域外设没有 DMA。
我认为应该有 GPIO 事件来触发 DMA 发送/接收 32 个 16 位字。 在其中 18 个事件之后、DMA 会触发一个完成中断、通知任务处理要复制到共享存储器空间的数据。 我的理解是、DMA 即使在 R5 控制下交叉运行、也仍然可以用于主域外设。 但是、用于触发 DMA 的 GPIO 也必须在主域中。 PKTDMA 不能由 GPIO 直接触发。 相反、我们必须设置 GPIO 以触发 BCDMA、使 PKTDMA 能够与 SPI0 进行通信。
我没有看到任何设置 GPIO 以在 R5F 上为主域外设触发 PKTDMA/PDMA 的示例。 根据我的搜索、以下是需要设置的内容:
- SysConfig 将 SPI0 “intriminEnable“配置为“已轮询“、useMcuDomainPeripherals 配置为“错误“。
- SysConfig 添加两个 UDMA 实例:一个作为 PKTDMA、另一个作为 BCDMA
- SysConfig 将触发 GPIO 添加为“输入“、三角类型添加为“FALL_EDGE“、useMcuDomainPeripherals 添加为“FALSE “。
- 通过 SYSFW 路由 GPIO (E18)、方法是将主 GPIOMUX INTROUTER 的源定义为 ID 索引 E18 处的输出 ID、该源已在分配给 R5 的 sciclient_defaultBoardcfg_rm.c 中定义。
- 将路由器输出 ID 转换为全局事件编号、即 50176+ID。
- 设置和初始化 PKTDMA - Tx 和 Rx 的 2 个通道。 这需要为 MCSPI0 设置相应的 PSI-L 线程、并为 FQ 和 CQ 设置元素计数、环存储器和环大小。 将 BCDMA 设置为具有适当数量的元素计数、振铃内存和振铃大小
- 分别使用 UDMA_chConfigTx () 和 UDMA_chConfigRx () 将默认通道配置应用于 PKTDMA、这两者都用于 BCDMA。
- 设置 PDMA 元素大小和计数(基于 SPI0 FIFO 大小)并将它们绑定到各自的 PKTDMA。
- 设置在发生全局事件时触发的“Kick“传输请求 (TR) BCDMA、以将“1“传输到 Tx PKTDMA 的“Doorbell“物理地址。 将此 TR 配置为无限期循环。 为 Tx PKTDMA 设置 TR、以将固定数据写入 SPI0。 将此 TR 预装到 Tx PKTDMA 的环形内存中的所有插槽中、以便始终可以执行 TR 而无需重新排队。 在触发完成中断之前、设置 Rx PKTDMA TR 以从 SPI0 读取数据、18 次进入存储器。
- 设置 UDMA 事件以在 Rx PKTDMA 完成中断时触发、从而运行回调。
- 回调将 Rx TR 取消排队并重新排队、并通知任务以获取和处理 18 条数据记录。
这是正确的吗? 如果是、是否有办法在每个步骤中检查设置是否正确完成?
