SAM4的TI图形库移植

分享到:

前几天一直了UCGUI的图形库部分,今天又接着把TIgrlib图形库移植到了Atmel SAM4的套件中。显示效果还可以。

图形库其实都是都是由底层的画点,画线等这些基本函数组成。大家以前上数学都有学过点成线,线成面这些的,而图形库也是基于此的。
TI的图形库分3层,如下图:
我们只需要修改显示驱动层即可。上面两层都是在调用最低层的驱动层。
显示驱动层函数要我们重写,不是很多,就只有几个函数而已:

 

如下截图:

 

分别是:
画点函数:void PixelDraw(void *pvDisplayData, long x, long y, unsigned longcolor)
画多点的函数:void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
画横线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
画竖线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
矩形填充函数:void RectFill (void *pvDisplayData, const tRectangle *pRect,unsigned long ulValue)
以下是我重写的源代码,我用的屏幕是2.4寸的TFT屏,主控是ILI9341SPI通信的。
画点函数:
void PixelDraw(void *pvDisplayData, long x,long y, unsigned long color)
{
         TFT_setXY(x,y);
         TFT_sendData16(color);
}
画线横线的函数:
void LineDrawH (void *pvDisplayData,longx1,long x2, long y, unsigned long color)
{
         int32_ti = 0;
         int32_tlength = x2 - x1;
         TFT_setCol(x1,x2);
         TFT_setPage(y,y);
         TFT_sendCMD(0x2c);

 

         TFT_DC_HIGH;

 

         //TFT_CS_LOW;

 

         for(; i < length; i++)

 

         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

 

         //TFT_CS_HIGH;   

 

 

}

 

画竖线的函数:
void LineDrawV (void *pvDisplayData,longx,long y1, long y2, unsigned long color)
{
int32_t i = 0;
         int32_tlength = y2 - y1;
         TFT_setCol(x,x);
         TFT_setPage(y1,y2);
         TFT_sendCMD(0x2c);
         TFT_DC_HIGH;
         //TFT_CS_LOW;

 

 

         for(; i < length; i++)

 

 

         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

 

         //TFT_CS_HIGH;   

 

}        
填充矩形的函数:
void RectFill (void *pvDisplayData, consttRectangle *pRect, unsigned long ulValue)
{

 

         uint32_tuY;

 

         for(uY = pRect->sYMin; uY <= pRect->sYMax; uY++)
         {
                   LineDrawH(0,pRect->sXMin, pRect->sXMax, uY, ulValue);
         }

 

}

 

最后的函数有些长的画多点的函数:
void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
         uint32_tulPixel = 0;
         uint32_tulColor = 0;
         TFT_setCol(x,DISPLAY_WIDTH);
         TFT_setPage(y,DISPLAY_HEIGHT);
         TFT_sendCMD(0x2c);

 

 

 

         if(BPP == 1)

 

 

 

         {
                   //1 bit per pixel in pucData
                   //lX0 is the index of the bit processed within a byte
                   //pucPalette holds the pre-translated 32bit display color
                   while(lCount)
                   {
                            ulPixel= *pucData++;

 

                            while(lCount && x0 < 8) // whilethere are pixels in this byte

 

                            {
                                     ulColor= ((uint32_t *) pucPalette)[ulPixel & 1];// retrieve already translatedcolor
                                     TFT_sendData16(ulColor);

 

                                     lCount--;            // processed another pixel

 

                                     x0++;                           // done with this bit
                                     ulPixel>>= 1;   // prepare next bit
                            }

 

                            x0= 0;      // process next byte, reset bitcounter

 

                   }
         }
         elseif (BPP == 4)
         {
                   //4 bits per pixel in pucData
                   //lX0 holds 0/1 to indicate 4-bit nibble within byte
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            if(x0 == 0)         // read first nibble
                            {
                                     ulPixel= *pucData >> 4;
                                     x0= 1;      // set index to second nibble
                            }
                            else
                            {                                    // readsecond nibble
                                     ulPixel= *pucData & 0x0f;
                                     pucData++;//increase byte pointer as we're done reading this byte
                                     x0= 0;      // set index to first nibble
                            }

 

                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color

 

                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display

 

                            lCount--;  // processed another pixel

 

                   }
         }
         elseif (BPP == 8)
         {
                   //8 bits per pixel in pucData
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            ulPixel= *pucData++;               // read pixel
                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color
                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display
                            lCount--;  // processed another pixel
                   }
         }
         elseif (BPP == 16)
         {
                   //16 bits per pixel
                   //Pixel is in 16bit color, 5R 6G 5B format
                   //No color translation needed for this display
                   while(lCount)
                   {
                            ulPixel= *((uint16_t *) pucData);
                            TFT_sendData16(ulPixel);
                            pucData+= 2;
                            lCount--;
                   }
         }
}
如果你的屏幕是控制芯片是其他的,可以拿厂家提供的底层驱动文件整合到TI的图形库的底层驱动中。

 

这次使用了TI图形库的库文件grlib.a,我加上grlib.h的头文件即可。工程结构如下图:

 

ti的图像库可以支持多种文件格式的输出到屏幕显示,还有画图像的函数。我也是参考坛友的帖子进行操作的。TI的图形库有个工具可以把图像转换成c的代码。只不过只支持pnm后缀的图片格式。我们可以用图像编辑软件转换格式。我使用了GIMP的软件进行转换。
具体在目录是StellarisWare\tools\bin

 

首先我们打开GMIP软件,然后可以直接把图片拖到编辑区,然后设置导出的参数,步奏如下:

 

软件默认转化后的文件放值得位置是在图片所在的目录:
软件默认是第一个选项,但这样生成的图片数据太大,转换软件会爆出:颜色太多的信息而导致转换失败。所以我就选择了网页优化版。
我们启动cmd,把目录切换到我们工具所在的位置,这些windows的命令自行百度去。我这里就不多说了,都是常用的命令。

 

 

然后打上pnmtoc -c image.pnm > image.cimage是你图片的文件名,回车后就会生成一个c的文本。
以下是我的测试图片:
 
 

更多Atmel及科技资讯请关注:  
Atmel中文官网:http://www.atmel.com/zh/cn/
Atmel技术论坛:http://atmel.eefocus.com/
Atmel中文博客:http://blog.sina.com.cn/u/2253031744
Atmel新浪微博:http://www.weibo.com/atmelcn

 

继续阅读
ARM:人工智能学习的未来是分散式AI

人工智能(AI)现在以机器学习与深度学习技术,让性能提升到更高端段,但英国半导体设计大厂安谋(ARM)指出,由于人工智能的学习仍面临网路频宽、耗电、隐私、资安等种种课题待克服,解决这些课题的方式,就是分散式人工智能(Distributed Intelligance)。

ARM Cortex-A55,Cortex-A57, 从端到云实现高效能

ARM Cortex-A75 和Cortex-A55,即首批基于新近发布的DynamIQ 技术的Cortex-A系列处理器。本文我们讨论的就是 Cortex-A55:一款对为未来数字世界举足轻重的处理器。

ARM并入豪门软银之后,从幕后走到前台,积极开拓物联网市场

2016 年 7 月,日本软银集团以 243 亿英镑天价收购英国 IP 矽智财大厂 ARM,带给行业巨大的震惊。9个月之后,ARM都发生了哪些改变呢?其一,ARM 为了扩大生态圈,更积极从幕后走到台前和市场沟通。其二,内部不间断地组织改造,新建物联网事业群,将来ARM 要做的是提供一个快速进入物联网的管道,降低大家的门槛。

骁龙835版Win10 ARM笔记本国行下半年推出

在台北电脑展上,微软和高通再次介绍了搭载骁龙835处理器的Win10 ARM笔记本,华硕、联想、惠普已经做好准备计划在今年下半年推出Win10 ARM版笔记本产品,支持千兆网速,无风扇设计、续航额外增加4-5小时,支持运行Win32和Windows10 UWP应用程序。

Windows 10正式引进ARM架构装置 微软移动装置执行PC软件成真

微软(Microsoft)宣布旗下Windows 10操作系统将正式引进采ARM架构装置,未来该公司将与高通(Qualcomm)合作,推出采高通Snapdragon处理器芯片且可执行完整Windows 10的装置。评论认为,最快预计2017年便有厂商可推出相关产品。

©2017 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss