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:kentec 显示屏中的 UDMA 内部使用

Guru**** 2408100 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1017891/tm4c129xnczad-udma-internal-use-in-kentec-display

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:DK-TM4C129X

我将 dk-tm4c129x msu 与8位 kentech 显示屏搭配使用、因为我想在此显示屏上使用内部 uDMA。我尝试使用此显示屏和 grlib 演示参考代码、但未成功。

具体而言、我希望使用显示的内部 uDMA 和 dk tm4c129x msu。


因此、请将该 kentech Dispaly 的 UDMA 代码发送给我

谢谢你。

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

    您好!

    [引用 userid="332083" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1017891/tm4c129xnczad-udma-internal-use-in-kentec-display "]我要特别使用显示的内部 UDMA 和 dk tm4c129x msu。

    我想首先澄清 DMA 的使用。 您指的是 UDMA。 UDMA 是器件上的通用集中 DMA 模块。 您可以使用 UDMA 在存储器和外设之间移动数据。 但是、UDMA 不用于 LCD。 LCD 模块有其自己的 DMA 引擎、它内置于 LCD 模块中。 请参阅以下数据表摘录。 也许您所说的内容与内置 DMA 相同、但我只是想澄清一下。

    光栅控制器提供同步 LCD 接口。 它提供的时序和数据
    不断刷新图形至无源显示。 它支持多种单色和
    通过使用可编程计时控件、内置调色板和来显示全色显示类型和尺寸
    灰度/串行器。 图形数据被处理并存储在帧缓冲区中。 一个帧缓冲器
    是系统中的连续内存块。 内置的 DMA 引擎提供图形数据
    光栅引擎、该引擎反过来输出到外部 LCD 设备。

    [引用 userid="332083" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1017891/tm4c129xnczad-udma-internal-use-in-kentec-display "]因此请向我发送该 kentech Dispaly 的 refreance UDMA 代码

    抱歉、我们没有任何使用内置 DMA 的示例。 但是、TivaWare LCD 外设驱动程序支持 DMA。 请参阅 C:\ti\TivaWare_C_Series-2.2.0.295\driverlib 中的 LCD.c 文件、获取 API、例如 LCDIDDDMAWrite ()、以将数据写入显示屏。  

    grlib 图形库 由三层组成(每个后续层都建立在前一层之上以提供更多功能)。
    •显示驱动程序层。 这必须由应用程序提供、因为它特定于使用中的显示屏。 例如、特定于 kentec320x240x16的驱动程序。
    •图形基元层。  
    •小工具层。  

     特定于 DK 电路板上 kentec320x240x16显示的驱动程序可在 dk-tm4c129x\drivers\kentec320x240x16_ssd2119.c.中找到 如果您查看此文件,您将看到调用 LCD 驱动程序函数 LCDIDDDataWrite()的 API,例如 WriteData()。 请参阅下面的代码段。  LCDIDDDataWrite()是一个非 DMA 版本调用,用于向显示屏写入数据。 我想您可以尝试更改 WriteData()以调用 LCDIDDDMAWrite()。 请再次注意、您必须创建自己的显示驱动程序、才能连接到您的应用所使用的其他显示屏。 由于我们没有任何使用 DMA 的示例、这就是我可以提供的所有提示。 如果您在不同的显示屏上工作、请与社区分享可能会让他人受益的内容。  

    //*****************************************************************************
    //
    // Writes a data word to the SSD2119.
    //
    //*****************************************************************************
    static inline void
    WriteData(uint16_t ui16Data)
    {
        //
        // Split the write into two bytes and pass them to the LCD controller.
        //
        LCDIDDDataWrite(LCD0_BASE, 0, ui16Data >> 8);
        LCDIDDDataWrite(LCD0_BASE, 0, ui16Data & 0xff);
    }

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

    感谢您的回答、

    当您告诉我的代码中的更改、但它不起作用时、它只提供白屏输出。

    我的任务是希望通过 使用显示自己的 DMA 将打印图像附加在此代码中

    如何使用 LCD 自身的 DMA 打印图像?

    下面是要打印的图像的 c 文件。

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #include <stdint.h>
    #include <stdbool.h>
    #include "grlib/grlib.h"
    
    
    
    
     uint8_t g_pui8Blue50x50Press[] =
    {
        IMAGE_FMT_4BPP_COMP,
        50, 0,
        50, 0,
    
        15,
        0x00, 0x00, 0x00,
        0x23, 0x00, 0x00,
        0x52, 0x00, 0x00,
        0x63, 0x00, 0x00,
        0x6f, 0x00, 0x00,
        0x78, 0x00, 0x00,
        0x7c, 0x00, 0x00,
        0x7d, 0x00, 0x00,
        0x7f, 0x00, 0x00,
        0x81, 0x00, 0x00,
        0x85, 0x00, 0x00,
        0x89, 0x00, 0x00,
        0x8d, 0x00, 0x00,
        0x93, 0x00, 0x00,
        0x9b, 0x00, 0x00,
        0xa9, 0x00, 0x00,
    
        0x83, 0x03, 0x01, 0x12, 0x22, 0x22, 0x22, 0xe9, 0xd3, 0x20, 0x21, 0x10,
        0x07, 0x12, 0x22, 0x23, 0x33, 0x33, 0x64, 0x33, 0xe9, 0xd4, 0x32, 0x21,
        0x47, 0x33, 0x34, 0x19, 0x44, 0x44, 0x44, 0xe9, 0xd4, 0x43, 0x33, 0x34,
        0x00, 0x01, 0x22, 0x33, 0x44, 0x45, 0x56, 0x66, 0x66, 0x60, 0x66, 0xe9,
        0xd1, 0x65, 0x55, 0x44, 0x44, 0x32, 0x40, 0x10, 0x32, 0x12, 0x33, 0x44,
        0x55, 0x66, 0x88, 0x30, 0x88, 0x88, 0xe9, 0xd2, 0x87, 0x66, 0x55, 0x54,
        0x20, 0x44, 0x21, 0x39, 0x01, 0x23, 0x34, 0x45, 0x67, 0xc0, 0x47, 0x33,
        0x65, 0x54, 0x43, 0x10, 0x00, 0x00, 0x0c, 0x12, 0x33, 0x45, 0x66, 0x47,
        0x04, 0x66, 0x55, 0x00, 0x54, 0x31, 0x00, 0x00, 0x23, 0x34, 0x56, 0x78,
        0xc0, 0x3f, 0x04, 0x86, 0x66, 0x66, 0x44, 0x00, 0x01, 0x18, 0x23, 0x45,
        0x67, 0x47, 0x2f, 0x86, 0x64, 0x20, 0x0c, 0x02, 0x33, 0x45, 0x68, 0x3f,
        0x06, 0x89, 0x89, 0x06, 0x94, 0x40, 0x12, 0x34, 0x56, 0x47, 0x07, 0x88,
        0x03, 0x99, 0xa8, 0x91, 0x12, 0x34, 0x57, 0x3f, 0x07, 0x01, 0x88, 0x9a,
        0xaa, 0xa2, 0x23, 0x45, 0x68, 0x3f, 0x80, 0x07, 0x89, 0x99, 0xab, 0xa4,
        0x23, 0x45, 0x78, 0xc0, 0x3f, 0x07, 0x88, 0x9a, 0xbc, 0xb9, 0x23, 0x46,
        0xe7, 0x47, 0x3f, 0x39, 0xcc, 0xbc, 0x3f, 0x3f, 0x3b, 0x0f, 0xcd, 0xbc,
        0x23, 0x56, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
        0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
        0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f,
        0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xff, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
        0x3f, 0x3f, 0x3f, 0xb0, 0x39, 0x57, 0x3f, 0x07, 0x88, 0x88, 0x9b, 0xcd,
        0x18, 0xbc, 0x24, 0x56, 0x3f, 0x07, 0x88, 0x89, 0xab, 0xe1, 0x3f, 0x3f,
        0x3c, 0xac, 0xdd, 0xcc, 0x34, 0x3f, 0xc3, 0x3f, 0x39, 0xbc, 0xde, 0xcc,
        0x24, 0x3f, 0x07, 0x03, 0x88, 0x88, 0x9a, 0xbd, 0xee, 0xdb, 0x3f, 0x07,
        0x80, 0x01, 0x9b, 0xcd, 0xee, 0xe5, 0x14, 0x56, 0x68, 0xc0, 0x37, 0x06,
        0x89, 0xab, 0xde, 0xef, 0xe3, 0x14, 0x60, 0x55, 0x3f, 0x07, 0x9a, 0xbc,
        0xde, 0xef, 0xe1, 0x0c, 0x03, 0x45, 0x88, 0x99, 0x37, 0x04, 0x89, 0xab,
        0x00, 0xcd, 0xee, 0xfe, 0xd0, 0x01, 0x46, 0x89, 0x99, 0x60, 0x98, 0x37,
        0x03, 0x9a, 0xbc, 0xde, 0xef, 0xff, 0x06, 0x20, 0x00, 0x35, 0x89, 0x99,
        0x37, 0x03, 0x99, 0x00, 0xab, 0xcd, 0xee, 0xff, 0xfe, 0x00, 0x00, 0x14,
        0x04, 0x89, 0x99, 0xaa, 0x99, 0x99, 0x37, 0x89, 0x99, 0x00, 0xab, 0xcc,
        0xde, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x05, 0x02, 0x59, 0x9a, 0xba, 0xaa,
        0x29, 0x99, 0xe9, 0xa0, 0xd1, 0xaa, 0x41, 0xee, 0xff, 0xff, 0x30, 0x00,
        0x00, 0x00, 0x00, 0x25, 0xab, 0xbc, 0xcc, 0xbb, 0xbb, 0x1a, 0xcc, 0xcc,
        0xcc, 0xe9, 0xd1, 0xcd, 0x42, 0xf3, 0x80, 0x41, 0x00, 0x02, 0xaa, 0xcc,
        0xdc, 0xcd, 0xdd, 0x32, 0xdd, 0xdd, 0xe9, 0xd1, 0xde, 0xee, 0x41, 0xff,
        0x40, 0x30, 0x3a, 0x00, 0x19, 0xcc, 0xdd, 0xee, 0xee, 0x6a, 0xee, 0xe9,
        0xd3, 0xef, 0x41, 0xe1, 0x43, 0x00, 0x3a, 0x00, 0x2a, 0x47, 0x01, 0x41,
        0xe2, 0x45, 0x00, 0x0e, 0x00, 0x13, 0x7d, 0xef, 0x81, 0x69, 0x51, 0xef,
        0x20, 0xe9, 0x31, 0x43,
    };
    

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

    您好、Mariya、

     很抱歉、我不知道它为什么不工作。 当   您调用 LCDIDDDMAWrite()时,我想知道您是否正确传递了图像的起始地址和图像的大小。  

     我 往往认为它不像从 LCDIDDataWrite()更改为调用  LCDIDDDMAWrite()那样简单。 我认为您需要对 kentec320x240x16_ssd2119.c 进行相当大的改进。 以使用 DMA  

    很抱歉、我不是一名专家、我也在学习我们的课程。  

     如上所述、要使用 DMA、您需要提供存储像素数据的图像的起始地址和结束地址。 如果您知道映像的起始地址和结束地址、则可以调用  LCDIDDDMAWrite。 但您需要了解如何使用它。 我认为您不能简单地将 LCDIDDDataWrite 替换为 LCDIDDDMAWrite。 由于我还在学习该模块、因此我将仅提供我在代码中找到的内容。 假设您要绘制一个矩形。 最终、它将调用基元函数 Kentec320x240x16_SSD2119RectFill 来绘制该矩形。 现在、让我们看看 函数 Kentec320x240x16_SSD2119RectFill 中代码的片段。 它将循环显示该矩形中的每个像素,并调用 WriteData()。 WriteData()最终将调用 LCDIDDDataWrite()。 您将需要修改 Kentec320x240x16_SSD2119RectFill 函数、这样它将调用 WriteDataDma 之类的函数(这是一个虚构的新函数名称)、而不是循环遍历每个像素以绘制矩形。 然后、WriteDataDma 将通过传递存储在缓冲区中的像素数据的起始地址和结束地址来调用 LCDIDDDMAWrite。  

     再说一次、我和您一样不熟悉这一点。 您需要自行修改驱动程序。 让我们了解它的工作原理并与社区分享。