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.

[参考译文] TM4C129XNCZAD:适用于 TM4C129XNCZAD 的 TIDM-TM4CFLASHSRAM、LCD 屏幕更改缓慢

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1348010/tm4c129xnczad-tidm-tm4cflashsram-for-tm4c129xnczad-slow-lcd-screen-change

器件型号:TM4C129XNCZAD

您好!

目前我即将完成一个设备,我们已经工作了一段时间。 我只是不能得到通过这个最后的问题,问题是,每当我们改变屏幕它需要明显长的时间屏幕转换. 我们使用外部并行 SRAM 闪存、其中8位数据存储在闪存中。 有一个旧的 DMA 传递函数被改变、从闪存中取出8位数据、将其转换为24位数据、然后将该24位数据写入用作 LCD 缓冲器的 SRAM。

  现在、我还想强调几个其他问题。 除了这是我们的瓶颈(我想)、我无法配置并行 SRAM 闪存使 SRAM 保持在0x6000000、闪存保持在0x8000000、而必须将我们的闪存映射到 EPI_ADDR_RAM_BASE_8、使 SRAM 保持在 EPI_ADDR_PER_BASE_A。 这意味着我们的 LCD 缓冲区没有位于0x60000000。 我想知道这是否也可能导致我的问题、我还尝试了将其移动到0x10000000、但没有运气。 除了这两个问题外,我只想就如何取得进展发表意见。 我已经开始配置 uDMA、计划是使用 uDMA 将像素数据块从闪存复制到内部存储器中、执行转换、然后使用 uDMA 将它们移动到 SRAM。 我认为这将比它目前所做的要快得多。 即从闪存中复制每个单独的像素、对其进行转换、然后将其写入 SRAM 上的两个不同位置。 在正常操作下、整个屏幕以大约10Hz 的频率工作、当我们更改屏幕时、大约需要半秒的时间才能完成屏幕转换。  

非常感谢您提供任何建议。 如果任何人有处理问题类型的经验或可以指向我另一个帖子将会大有帮助。 如果被询问、我可以发布更多代码。 提前感谢您。  

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

    您好!

     我有一些评论和问题。

     -你的 DoDMATransfer ()函数似乎使用 CPU 从外部闪存读取数据到内部 SRAM。 这是正确的理解吗?

     -为什么不使用内置的 LCD DMA 从外部闪存读取到内部 SRAM ? 有关 DMA 在 LCD 中的使用的详细信息、请参阅数据表和外设驱动程序库用户指南。 基于 DoDMATransfer (),我的印象是,你是使用 CPU 来读取外部闪存,而不是 DMA。  

     -您的外部闪存是8位,进一步降低性能。 无论使用 DMA 或 CPU 读取外部闪存、以16位读取都会使您的性能提高2倍。 但这意味着您需要从8位存储器更改为16位存储器。  

     -正如数据表中所描述的,首选的配置不仅是使用内置的 DMA 进行数据传输,还使用乒乓模式。 这将允许在一个帧缓冲区补充新数据、同时将另一个帧发送到输入 FIFO。  

    21.3.2 LCD DMA 引擎
    LCD DMA 引擎提供输出图形数据的功能、以不断刷新
    外部 LCD 显示屏、无需加重 CPU 的负担、借助中断或固件定时器即可实现。 它运行于
    一个或两个帧缓冲器、在初始化过程中设置。 使用两个帧缓冲器(乒乓模式)
    缓冲器)允许同时将当前视频帧输出到外部
    显示和更新下一个视频帧。 在大多数应用中、乒乓缓冲方法
    应用程序。


    当使用光栅控制器时、LCD DMA 引擎从帧缓冲区中读取数据并将
    反馈到输入 FIFO 中。 光栅控制器从 FIFO 请求数据以进行帧刷新、
    DMA 用于保持 FIFO 被填满。


    当使用 LIDD 控制器时、LCD DMA 引擎访问 LIDD 控制器的地址
    和/或数据寄存器。 需要执行以下步骤来配置 DMA 引擎:


    在 LCD DMA 控制寄存器(LCDDMACTL)、偏移量0x040配置数据格式。


    2.通过编程 LCD DMA 帧缓冲区0基地址来配置帧缓冲区0
    (LCDDMABAFB0)寄存器、偏移量0x044和 LCD DMA 帧缓冲器0最高地址
    (LCDDMACAFB0)寄存器、偏移量0x048

    3.通过编程 LCD DMA 帧缓冲器1基址来配置帧缓冲器1
    (LCDDMABAFB1)寄存器、偏移量0x04C 和 LCD DMA 帧缓冲器1最高地址
    (LCDDMACAFB1)寄存器、偏移量0x050。


    此外、根据应用是在 LIDD 模式还是光栅模式下运行、
    应适当配置 LCDLIDDCTL 或 LCDRASTRCTL 寄存器、连同
    配置寄存器。 为了使能 DMA 传输、LCDLIDDCTL 中的 DMAEN 位或 LCDEN 位
    在 LCDRASTRCTL 寄存器中、应该写入1。

     -  

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

    编辑:(我删除了下面的段落,因为我不小心选择它解决了事故的问题,我再次张贴它为后人)

    DoDMA 函数使用 CPU 存储器从外部闪存读取数据、然后使用 CPU 存储器将其写入外部 SRAM、目前我正在尝试将 DMA 配置为执行此操作。 我继承了该工程、该工程是由外部承包商完成的旧设备代码的端口。 我正在努力整理它的所有,并修复它的最后几个问题。 我认为这只是所追求的计划,因为我们假定这不会有任何问题。 我也认为他们不想花时间配置调色板查找。 我将尝试使用内置 DMA 来读取闪存、此时由于它采用8位数据格式、我是否必须配置调色板? 我想我会的。 我会尽量落实你的建议,我可能需要进一步的帮助,如果我不能再得到进一步的帮助,我会再作答复。  

    为了进一步说明、所有这些符号和文本数据都位于闪存中不同的位置、在当前设置下、程序将使用如上所示嵌套的 for 循环开始将像素数据写入外部 SRAM、即我们的 LCD 缓冲区。 如果我将 LCD 缓冲区配置为闪存、如何使其切换到闪存上的不同位置、我需要手动更改寄存器值。 当前设置、我们将 LCDFrameBuffer 配置为外部 SRAM 中的位置、然后对于每个像素、我们在所需的定位中访问闪存、转换数据、然后将其写入该特定的帧缓冲区。 如果我想同时使用闪存上的不同位置和 LCD DMA、我该怎么做? 我目前唯一的想法是将寄存器中的 LCD 帧缓冲区更新到每个新位置。 或者使用 uDMA 将闪存块写入内部存储器、然后写入外部 SRAM。 此外、我们的闪存以16位格式存储数据、正如我们的像素数据是8bpp、因为它只是从旧器件复制而来。 我认为我们在使用 LCD DMA (如使用指针将帧缓冲区设置到外部 SRAM)、因为我的值 LCD0DMABAFB0为 0xa000'0020、这是外部 SRAM 的位置。   为了进一步解释、我将使用内置 DMA、但我们使用 CPU 从闪存中提取数据、对数据进行转换、然后逐像素将数据写入该缓冲区。  是否有任何关于我应如何处理的建议?

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

    我只有256KB 的内存、这不足以支持640x480屏幕(即使是8 BPP)的整个帧缓冲。 我无法使用 uDMA 从外设转到外设。 老实说、我不知道如何以比我目前更快的速率将数据从外部闪存中取出并放入帧缓冲区。  目前、我计划使用一个8bpp 调色板、使用 uDMA 将数据块从闪存中移走、然后将其写入 SRAM 帧缓冲区。 内部存储器的大小不足以支持单帧缓冲区 、因此我想知道通常是如何处理的、我是否必须尝试将数据移动到内部闪存?  我想知道其他人是否遇到过类似问题或有任何其他建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DoDMA 函数使用 CPU 内存从外部闪存读取数据,然后使用 CPU 内存将其写入外部 SRAM,目前我正在尝试配置 DMA 来实现此目的。

    您好!

     我想我可能提前给您提供了错误信息。 内置的 LCD DMA 用于将数据从帧缓冲区传输到输入 FIFO。 内置 DMA 不处理从外部闪存到外部 SRAM 的传输。 我想您首先需要将图形数据从外部闪存移动到内部 SRAM。  您需要使用 uDMA 来执行该操作。 我认为您当前的设置是使用 CPU 将数据从"外部"闪存移动到外部"SRM"。 我认为、如果您将数据从外部闪存移动到"内部"SRAM、则会提高性能。 内部 SRAM 是比外部 SRAM 快得多的存储器。 内部 SRAM 是一个单周期存取存储器。  

    我只有256KB 内存,这不足以支持640x480屏幕的整个帧缓冲区,即使是在8 BPP。 我无法使用 uDMA 从外设转到外设。 [/报价]

    我之所以建议内部 SRAM 是为了提高性能、因为外部 SRAM 速度慢、仅为8位。 我知道 保存 640x480x8图形数据的内存容量接近2.5MB。 您可能需要将内部 SRAM 拆分为两个帧缓冲区、在这两个缓冲区中、您可以一次将数据128KB 从外部闪存移动到其中一个帧缓冲区、而另一个将数据输出到外部显示屏。  

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

    谢谢、我会试一下、因为内部 SRAM 速度如此之快、所以我理解、它将有时间移动数据而不会中断屏幕。 我加载到外部闪存上的二进制文件总大小为6.4MB、小于内部闪存的10MB。 我将首先尝试您的方法、但我也认为我可以将外部闪存上的数据移动到内部闪存。 我还必须构建使用8bpp 的调色板、但我必须以任一种方式使用。 谢谢你的建议! 我将尝试使用内部 SRAM 作为闪存缓冲区。