0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解TI的grlib图形库移植到Atmel SAM4套件

电子工程师 作者:工程师陈翠 2018-06-18 12:59 次阅读

图形库其实都是都是由底层的画点,画线等这些基本函数组成。大家以前上数学都有学过点成线,线成面这些的,而图形库也是基于此的。

TI的图形库分3层,如下图:

一文详解TI的grlib图形库移植到Atmel SAM4套件

我们只需要修改显示驱动层即可。上面两层都是在调用最低层的驱动层。

显示驱动层函数要我们重写,不是很多,就只有几个函数而已:

如下截图:

一文详解TI的grlib图形库移植到Atmel SAM4套件

分别是:

画点函数: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屏,主控是ILI9341,SPI通信的。

画点函数:

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的grlib图形库移植到Atmel SAM4套件

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

具体在目录是StellarisWare oolsin;

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

一文详解TI的grlib图形库移植到Atmel SAM4套件

一文详解TI的grlib图形库移植到Atmel SAM4套件

一文详解TI的grlib图形库移植到Atmel SAM4套件

一文详解TI的grlib图形库移植到Atmel SAM4套件

一文详解TI的grlib图形库移植到Atmel SAM4套件

软件默认转化后的文件放值得位置是在图片所在的目录:

一文详解TI的grlib图形库移植到Atmel SAM4套件

软件默认是第一个选项,但这样生成的图片数据太大,转换软件会爆出:颜色太多的信息而导致转换失败。所以我就选择了网页优化版。

我们启动cmd,把目录切换到我们工具所在的位置,这些windows的命令自行百度去。我这里就不多说了,都是常用的命令。

一文详解TI的grlib图形库移植到Atmel SAM4套件

一文详解TI的grlib图形库移植到Atmel SAM4套件

然后打上pnmtoc -c image.pnm 》 image.c,image是你图片的文件名,回车后就会生成一个c的文本。

一文详解TI的grlib图形库移植到Atmel SAM4套件

以下是我的测试图片:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ti
    ti
    +关注

    关注

    112

    文章

    7955

    浏览量

    211994
  • Atmel
    +关注

    关注

    17

    文章

    311

    浏览量

    107081
收藏 人收藏

    评论

    相关推荐

    STM32移植U8g2图形的方法 实现OLED图形显示

    本篇介绍了如何将U8g2图形移植STM32中。
    的头像 发表于 06-07 08:29 1.2w次阅读
    STM32<b class='flag-5'>移植</b>U8g2<b class='flag-5'>图形</b><b class='flag-5'>库</b>的方法 实现OLED<b class='flag-5'>图形</b>显示

    新手求助 Atmel SAM4S

    Atmel家的单片机我从来没接触过,以前用过STM32。因为最近要研究 Atmel SAM4S,但是网上基本找不到相关的中文讲义或者教程{:4_106:}。关于AVR的倒是铺天盖地的,
    发表于 05-21 20:12

    【AT91SAM9261申请】基于AT91SAM9261评估套件的物联网系统

    申请理由:1、对ATMEL芯片有定的使用能力;2、使用过Atmel Studio集成开发环境;3、希望能够使用AT91SAM9261评估套件
    发表于 05-23 15:49

    图书推荐:《ARM Cortex-M4微控制器原理与应用:基于Atmel SAM4系列》

    《ARM Cortex-M4微控制器原理与应用:基于Atmel SAM4系列》以具有ARM Cortex—M4内核的Atmel公司
    发表于 06-12 13:32

    基于Atmel SAM4系列配套源代码

    《ARM Cortex-M4微控制器原理与应用:基于Atmel SAM4系列》配套源代码,包括简单IO,按键中断响应,UART,SPI,CAN,SysTick,ADC,PWM,DSP以及综合实例,供大家参考
    发表于 06-19 08:30

    SMART SAM4C微控制器有哪些应用?

    PWM定时器,2个3通道通用16位定时器、校准低功耗RTC(备份域运行,0.5μA)和个50×6分段LCD控制器。  SAM4C系列是个可扩展的平台,具有爱特梅尔公司业界的SAM4
    发表于 11-23 12:19

    IHM001套件和IHM002套件有什么区别?

    P-NUCLEO-IHM001套件这是个什么东西?IHM001套件和IHM002套件有什么区别?
    发表于 07-21 09:02

    Atmel宣布推出SAM3U-EK评测工具套件

    Atmel宣布推出SAM3U-EK评测工具套件 爱特梅尔公司(Atmel Corporation)宣布推出SAM3U-EK评测工具
    发表于 07-28 07:50 1529次阅读

    Atmel SAM4L应用指南

    The Atmel SAM4L Xplained Pro evaluation kit is hardware platform to evaluate the ATSAM4LC4C microcontroller.
    发表于 09-12 17:52 10次下载

    Atmel SAM4S应用指南

      The Atmel SAM4S Xplained Pro evaluation kit is a hardware platform to evaluate the ATSAM4SD32C microcontroller.
    发表于 09-12 18:47 16次下载

    关于Atmel SAM4L方案设计的介绍讲解

    Atmel - SAM4L方案设计
    的头像 发表于 07-10 01:15 2306次阅读

    关于Atmel推出的 SAM4L工具包的特点及应用介绍

    Atmel SAM4L工具包
    的头像 发表于 07-08 00:18 2764次阅读

    Atmel SAME70-Xplained评估套件功能作用详解

    Atmel SAME70-Xplained评估套件面向寻求SAM4E微控制器升级或者转移的工程师用户。该评估套件能够助力工程师针对工业控制、消费电子或计算机外设应用进行嵌入式系统设计。
    的头像 发表于 08-04 11:03 4990次阅读

    TI StellarisWare图形的使用指南详细说明

    StellarisWare 软件包的部分,StellarisWare 图形Grlib)提供了一套比较完整的 MCU
    发表于 05-18 08:00 1次下载
    <b class='flag-5'>TI</b> StellarisWare<b class='flag-5'>图形</b><b class='flag-5'>库</b>的使用指南详细说明

    SAM9x5移植SAM9X60

    本应用笔记介绍将基于 SAM9x5 的设计移植 SAM9X60 器件需进行的硬件和软件更改。SAM9X60 器件的性能优于
    发表于 03-30 16:26 3次下载
    从<b class='flag-5'>SAM</b>9x5<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>SAM</b>9X60