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.

[参考译文] RM57L843:DMA 数据传输问题

Guru**** 2549910 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/986517/rm57l843-dma-data-transfer-problem

器件型号:RM57L843

您好!

基本上、加电后、我在"L2 RAM"、"PBIST ROM"、"STC1 ROM"、"STC2 ROM"、"VIM RAM"、 "MibSPI RAM"、"DCAN RAM"和最后的"DMA RAM"都成功了。

在这些测试之后、我将在 RM57微控制器上的所有 SCI/SPI 模块上执行 SCI 回送、SPI 回送等测试。 最后、我将执行 DMA 测试、测试基本如下:

"声明两个大小为100的数组(局部变量)、一个加载1到100之间的数据、另一个为空、并以零初始化。 目的是执行从加载的阵列到另一个空阵列的 DMA 传输。 因此、我使用通道5 (仅随机)、使用以下参数设置控制数据包:

源地址=加载了1到100个元素的数组的地址

目的地址=空数组的地址

通道控制= 0

帧计数= 1

元件数量= 100

元件偏移= 0 (源和目的)

帧偏移= 0 (源和目的)

分配的端口=端口 A 读取和端口 A 写入

读取大小= 8位  

写入大小= 8位(因为声明的两个数组都是字符类型=无符号 INT8)

tType =块传输  

地址模式读取=地址增量

地址模式写=地址增量

我正在调用函数"dmaSetCtrlPacket (DMA_CH5、在控制参数结构之上)"、然后调用"dmaSetChEnable (DMA_CH5、DMA_SW)"。 然后、我将轮询 BTFLAG 寄存器的位5以指示传输完成活动。"

BTCFLAG 寄存器中的标志被置位、但我在目的数组中看不到任何数据。  

我尝试的方法是在上电时绕过上述所有测试、只保留 DMA 测试本身、但仍然看不到目标阵列中的任何数据。 我可能缺少什么?

顺便说一下,我在加电后和执行测试之前调用函数"dmaEnable()"。

此致、

Chetan。

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

    您好、Chetan、

    您可以将存储器区域分配为 DMA 写入的目标、并将该区域配置为缓存写入。

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

    在 sys_main.c 中:

    #pragma SET_DATA_SECTION (".sharedRAM")

    uint32 TXDATA[100];      系统 RAM 中的/*发送缓冲器*/
    uint32 RXDATA[100]={0};//系统 RAM 中的接收缓冲区

    #pragma SET_DATA_SECTION ()

    链接器命令:

    存储器

      (笑声)
     SHAREDRAM (RW):origin=0x0807A000 length=0x0005000

    部分

      (笑声)
     sharedRAM:{}> SHAREDRAM

    HALCoHen MPU 设置:

    为 SHAREDRAM 存储器区域选择一个未使用的 MPU 区域、并将其配置为直写。

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

    你好,王!

    感谢您的回答! 但是、我想了解为什么我们必须执行您的建议? 当栈足够用作局部变量时、在 RAM 中定义单独的存储器区域有什么需要?

    此外、"缓存写入直通"是什么意思? 我只知道、"高速缓存"是存储最直接使用的变量的存储器、其含义非常广泛。

    您能不能在我们的控制器 RM57的上下文中给"高速缓存存储器-它的类型、为什么要使用 ETC "下一些指示灯?

    最后、当我配置为"缓存写入直通"时、到底会发生什么情况?

    此致、

    Chetan。  

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

    您可以将高速缓存视为位于 MCU 内核和主存储器之间的小型高速缓冲器、该缓冲器存储最近称为主存储器的块。  高速缓存的目的是提高内存访问的平均速度。

    使用高速缓存后,每次内存读取都会产生以下两种结果之一:

    1.高速缓存命中–地址的内存已在高速缓存中。

    2.缓存未命中-存储器访问不在缓存中、因此我们必须前往主存储器来访问它。

    有多种高速缓存策略:

    1.回写: 在高速缓存命中时、仅更新数据高速缓存、而不是主存储器。 高速缓存行被标记为脏、写入主存储器的操作被推迟、直到高速缓存行被逐出或显式清理。

    2.直写式: 在高速缓存命中时,数据高速缓存和主内存都会更新。

    3.写分配: 在缓存未命中时,将分配缓存行并 加载主存储器中的数据。 这意味着在处理器上执行存储指令可能会导致突发读取、从而将数据从主存储器缓存。

    4、无写分配: 高速缓存未命中时、不会分配高速缓存行、数据直接写入主存储器。 在这里、只有在读取时出现缓存未命中时才会缓存一行、然后使用读取分配策略加载缓存。

    5、读分配(不可配置): Cortex-R5F Hercules MCU 上的所有可缓存位置均为读分配。 这意味着数据高速缓存行在发生高速缓存缺失时被分配、 从而将32字节数据从主存储器输入高速缓存存储器。 因此、对这些存储器位置的后续访问将导致高速缓存命中条件、数据直接从高速缓存存储器中读取。

    从上面的高速缓存策略中、具有读取分配和写入分配的高速缓存回写可提供最佳性能。 不进行写分配的直写操作可以部分解决高速缓存一致性问题、但它抵消了拥有高速缓存的主要优势。 因此、我们可以为 CPU 和 DMA 分配一个直写存储器区域或一个不可高速缓冲存储器区域、并将其他存储器区域仅由 CPU 访问作为回写。   

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

    你好,王!

    感谢您的回复!  

    根据您的回答、这是否意味着始终建议使用此类不可高速缓冲存储器区域在 DMA 和 CPU 之间进行数据传输、并且任何在全局 RAM 中声明的缓冲器都可能导致此问题?

    此外、这种问题是否具有概率性、也就是说它可能会发生也可能不会发生。 我的意思是、有时 DMA 传输(根据我在这个线程中的第一个帖子)可以发生、如果发生一次、那么它将每次发生(由于高速缓存)、而如果不发生、则可能永远不会发生?

    我的理解是否正确? 我之所以提出这一问题、是因为我的一位同事在自己的定制板中执行了相同的功能(如第一篇文章中所述)、并且发生了 DMA 传输。 我们也使用相同的启动文件、内存配置也相同。

    此致、

    Chetan。

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

    DMA 传输不会通过 MCU 缓存。 它直接写入主存储器。 如果启用了高速缓存、则 CPU 看不到 DMA 在主存储器上进行的任何更新。 MCU 可能仍会看到旧内容、因为它是从缓存读取的(如果缓存命中)。 但由于缓存缺失、CPU 首次读取可以从主存储器获取更新的内容。  

    解决 DMA 一致性的方法有多种。 使用不可高速缓冲存储器区域是最简单的方法。 直写式存储器区域可以部分解决 DMA 一致性问题(CPU 写入、DMA 读取)。