历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2018年02月18日 | ARM内核的移植实例介绍

2018-02-18 来源:eefocus

    uC/GUI是MICrigm公司推出的用于嵌入式系统的图形用户接口(graphics user interface,GUI)软件包,由于uC/GUI完全以ANSI-C编写,因此它与处理器无关,可以很方便地移植到不同的操作系统和嵌入式微处理器上,并可支持不同尺寸的图形液晶显示器。它采用层次化的设计,功能强大,移植方便,被广泛地应用于嵌入式领域,如PDA、机顶盒以及DVD NCD播放机等。本文详细介绍了uC/GUI在ARM 内核S3C44B0X的移植。实践证明uC/GUI具有良好的实时性和稳定性以及广泛的应用前景。

 

    1、硬件连接与液晶显示原理

    本设计使用的硬件采用ARM7开发板,液晶模块为L78C64,它是7.8in 256色STN型LCD显示屏,分辨率为640×480。

    LCD控制器外部接口信号的定义及其与LCD模块各信号之间的对应关系如下:

    (1)VFRAME:LCD控制器与LCD驱动器之间的帧同步信号。该信号负责指出LCD屏新的一帧开始的时间。LCD控制器在一个完整帧显示完成后立即插入一个VFRAME信号,并开始新一帧的显示。该信号与LCD模块的YD信号相对应;

    (2)VLINE:LCD控制器和LCD驱动器之间的线同步脉冲信号。该信号用于将LCD驱动器水平线(行)移位寄存器的内容传送给LCD屏显示。LCD控制器在整个水平线(整行)数据移入LCD控制器后,插入一个VLINE信号。该信号与LCD模块的LP信号相对应;

    (3)VCLK:LCD控制器和LCD驱动器之间的像素时钟信号。由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿被LCD驱动器采样。该信号与LCD模块的XCK信号相对应;

    (4)VM:LCD驱动器的AC信号。VM信号被LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示和熄灭。VM信号可以与每个帧同步,也可以与可变数量的VLINE信号同步;

    (5)VD3~0 LCD:像素点的数据输入端口。与LCD模块的D3~0相对应:

    (6)VD7~4 LCD:像素点的数据输入端口。与LCD模块的D7~4相对应。

    液晶显示原理:写满整个屏的数据称为1个“帧”数据,YD是帧同步信号,该信号启动LCD屏的新一帧数据。两个YD脉冲之间的时间长度称为帧周期。根据LCD模块的特性,刷新时间为12~14ms,频率为70~80Hz。每一帧包括480个LP脉冲。LP为行(共480行)数据输入锁存信号,也就是行同步脉冲信号。该信号启动LCD屏的新一行数据。XCK为行数据输入信号,也就是每1行中像素点数据传输的时钟信号。每组8位的数据在XCK的下降沿被输入锁存,因此,每1行包括640×3/8个XCK脉冲信号。D0~D7是8位的显示数据输入信号。

    2、驱动程序设计

    下面分三步完成液晶的初始化。

    (1)I/O口的初始化

    由于采用S3C44B0X的PC接口和PD接口作为LCD驱动接口,因此,需要设置PC接口工作在第3功能状态和PD接口工作在第2功能状态。

    (2)相应控制寄存器的设置方法

    S3C44B0X包括一个LCD控制器时序发生器TIMEGEN, 由它来产生VFRAM,VLINE,VCLK和VM 控制时序。这些控制信号由寄存器LCOCON1和LCDCON2进行配置。通过对寄存器种配置项目的设置,TIMEGEN就可以产生适应于各种LCD屏的控制信号了。

    VFRAM和VLINE脉冲的产生是通过对LCDCON2寄存器的HOZVAL和LINEVAL进行配置来完成的。每个域都与LCD的尺寸和显示模式有关。

    其中,HOZVAL=(显示宽度/VD数据线位数)-1。

    在彩色模式下,显示宽度=3×每行的像素点数。

    对所选的液晶模块,HOZVAL=(640×3/8)-1;LINEVAL=(显示宽度)-1。

    对所选的液晶模块,LlNEVAL=480-1。

    VCLK信号的频率可以通过LCDCON1寄存器的CLKVAL域来确定,即

    VCLK=MCLK/(CLKVAL×2)

    LCD控制器的最大VCLK频率为16.5MHz,几乎支持所有已有的LCD驱动器。由于上述关系,CLKVAL的值决定了VCLK的频率。为了确定CLKVAL的值,应该计算一下LCD控制器向VD端口传输数据的速率,以便使VCLK的值大于数据传输的速率。

    数据传输速率的公式为:

    数据传输速率=HS×VS×FR×MV

    其中,HS—LCD的行像素值;VS—LCD的列像素值:FR—帧速率;MV—模式值,这里取8位单扫描,彩色。

    对于所选用的液晶模块:HS=640;VS=480;FR=70Hz:MV=3/8。因此,数据传输速率=640×480×70×3/8=8,064,000Hz。

    VCLK值应该大于8MHz而小于16MHz,因此,CLKVAL可以取9~15。

    (3)完整的液晶初始化程序

    C程序

    void LCD_Init_Controler()

    {rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);

    //dISAble,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21);

    //LINEBLANK=10(without any calculation)

    rLCDSADDR1= (0x3<<27) | (((U32)frameBuffer256>>22)<<21)|M5D((U32)frameBuffer256>>1);

    //256-color,LCDBANK,LCDBASEU

    rLCDSADDR2=M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1))|(MVAL<<21);

    rLCDSADDR3= (LCD_XSIZE/2) | (((SCR_XSIZE-LCD_XSIZE)/2)<<9);

    //The following valuehas to be changed forbetter display.

    rREDLUT=0xfdb96420;

    rGREENLUT=0xfdb96420;

    rBLUELUT=0xfb40;

    rDITHMODE=0x0;

    rDP1_2=0xa5a5;

    rDP4_7=0xba5da65;

    rDP3_5=0xa5a5f;

    rDP2_3=0xd6b;

    rDP5_7=0xeb7b5ed;

    rDP3_4=0x7dbe;

    rDP4_5=0x7ebdf;

    rDP6_7=0x7fdfbfe;

    rLCDCON1= (1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);

    }

    经过以上几步,就完成了液晶的硬件驱动,下面就是移植软件包,调用底层驱动,完成复杂的显示任务。

    3、uC/GUI软件包的移植

    3.1 uC/GUI特点

    (1)支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI-C编译器即可;

    (2)所有硬件接口定义都使用可配置的宏;

    (3)字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址;

    (4)所有程序在长度和速度方面都进行了优化,结构清晰;

    (5)对于慢速的LCD控制器,可以使用缓冲存储器减少访问时间,提高显示速度。

    3.2 uC/GUl移植步骤

    在使用uC/GUI时,可以按照以下几个步骤来进行:

 

    (1)按照需要,定制uC/GUI;

    (2)指定硬件设备的地址,编写接口驱动代码;

    (3)编译、链接、调试例子程序;

    (4)修改例子程序,并测试增加需要的功能;

    (5)编写自己的应用程序。

    3.3 具体实现

    (1)首先介绍uC/GUI的目录结构和基本配置。

    uC/GUI主要目录如下:

    GUI/ConvertMono 使用黑白显示设备时,所要使用的灰度转换函数

    GUI/ConvertColor 使用彩色显示设备时,使用的色彩转换函数

    GUI/Config 包含了对uC/GUI进行配置的一些文件

    GUI/Core uC/GUI核心代码

    GUI/Font uC/GUI与字体相关的代码文件

    GUI/LCDDriver LCD驱动代码文件

    GUI/MemDev 内存设备支持文件代码

    GUI/Touch 输入设备支持的文件代码

    GUI/Widget uC/GU1支持的控件代码,包括编辑框、列表框、按钮和选择框等

    GUI/WM uC/GUI窗口管理部分代码

    (2)修改uC/GUI,使之适于移植。

    在ADS环境中新建一个工程,将上述gui文件夹下的所有文件加入工程。

    将Config文件夹下的3个文件GUIConf.h、

    GUITouchConf.h和LCDConf.h加入新工程,如下修改LCDConf.h的内容:

    C程序

    /*LCDConf.h*/

    #ifndef LCDCONF_H

    #define LCDCONF_H

    #define LCDG4 //lcd颜色数,必须定义,LCDMONO(单色),LCDG4(四级灰度),LCDG16(16级灰度)

    #define LCD_XSIZE(640) /* LCD水平分辨率 */

    #define LCD_YSIZE(480) /* LCD垂直分辨率 */

    #define LCD BITSPERPIXEL(8)#endif /*LCDC0NF_H*//*以下是S3C44B0X LCD控制器的配置*/

    #include "..incoption.h"

    #define SCR_XSIZE (640) //视窗屏幕大小

    #define SCR_YSIZE (480)#define LCD_XSIZE (640) //液晶屏幕大小

    #define LCD_YSIZE (480)#define M5D(n)((n)&0x1fffff)

    #define ARRAY_SIZE_G4(SCR_XSIZE/4*SCR_YSIZE)

    #define HOZVAL (LCD_XSIZE/4-1)

    #define HOZVAL_COLOR (LCD_XSIZE*3/8-1)

    #define LINEVAL (LCD_YSIZE-1)

    #define MVAL (13)

    #define CLKVAL_G4 (10)

    #define MVAL_USED 0

    #endif /*LCDCONF_H */

    (3)加载LCD驱动。

    LCD驱动程序如前面所述,保存在lcd44b0.c中。出了底层的初始化函数LCD_Init_Controler()以外,还需要做以下修改,这里只提关键部分。

    主要进行相关的寄存器配置,以及和GUI的接口程序。这里只提及关键部分。

    ① 定义显示缓冲区时使用的char数据类型,它是8bit的:

    unsigned char Bmp[ARRAY_SIZE_G16];//液晶显示缓冲数组

    ② 定义读写缓冲区时使用的数据类型,也是8bit的U8:

    #define LCD_READ_MEM (Off)*((U8*)(frameBuffer256+(((U32)(Off)))))

    #define LCD_WRRITE_MEM(Off,data)*((U8*)frameBuffer256+(((U32)(Off)))))=data

    #define LCD_WRITE_REG(Off,data)

    ⑧ 定义液晶总线宽度定义位8bit:

    #ifndef LCD_BUSWIDTH

    #define LCD_BUSWIDTH(8)

    #endif

    ④ 定义字节顺序:

    #define LCD_SWAP_BYTE_ORDER(0)

    至此uC/GUI的移植基本上已经完成了。当然这里只提供了移植的关键部分,更多更完整的移植还需要做不少的工作,如触控屏的移植、键盘鼠标的移植以及中文字体的移植等。详情请参阅uC/GUI手册中Getting Started一章。

    4、数据显示程序设计

    数据显示程序主要是基于uC/GUI平台的GUI函数库,完成字符、曲线的绘制。与画线相关的GUI函数有:

    GUI DrawHLine()

    原型:void GUI_DrawLine(int x0,int y0,int x1,int y1);

    其中,x0、y0、x1、y1分别为UGI坐标系下的起点和终点的横坐标和纵坐标。

    GUI DispDec()

    原型:void GUI_DispDec(I32 v,U8 Len);

    其中,v为要显示的十进制变量值,Len为要显示的数据的位数。

    5、总结

    本文主要介绍了基于ARM7内核S3C44B0X和L78C64液晶模块硬件平台的uC/GUI的移植,以及在工程上的应用,经过实际应用发现,uC/GUI功能强大,响应迅速,稳定性高,具有广泛的应用前景。


推荐阅读

史海拾趣

Andersen Laboratories Inc公司的发展小趣事

在不断追求技术创新和市场扩张的过程中,AnalogicTech始终坚持多元化发展战略。公司不仅在LED背光液晶电视市场取得了显著成绩,还积极拓展其他领域,如智能手机、平板电脑等消费电子产品市场。通过不断推出创新产品和解决方案,AnalogicTech成功实现了市场的多元化发展,为公司的长期稳定发展奠定了坚实基础。

这五个故事展示了AnalogicTech公司在电子行业中发展起来的关键阶段和重要举措。凭借其卓越的技术创新、全球化的运营策略、高效的物流配送体系以及市场扩张与多元化战略的推进,AnalogicTech成功地在竞争激烈的电子行业中脱颖而出,成为了一家备受瞩目的企业。

Amprobe公司的发展小趣事

在不断追求技术创新和市场扩张的过程中,AnalogicTech始终坚持多元化发展战略。公司不仅在LED背光液晶电视市场取得了显著成绩,还积极拓展其他领域,如智能手机、平板电脑等消费电子产品市场。通过不断推出创新产品和解决方案,AnalogicTech成功实现了市场的多元化发展,为公司的长期稳定发展奠定了坚实基础。

这五个故事展示了AnalogicTech公司在电子行业中发展起来的关键阶段和重要举措。凭借其卓越的技术创新、全球化的运营策略、高效的物流配送体系以及市场扩张与多元化战略的推进,AnalogicTech成功地在竞争激烈的电子行业中脱颖而出,成为了一家备受瞩目的企业。

Acopian Power Supplies公司的发展小趣事

在不断追求技术创新和市场扩张的过程中,AnalogicTech始终坚持多元化发展战略。公司不仅在LED背光液晶电视市场取得了显著成绩,还积极拓展其他领域,如智能手机、平板电脑等消费电子产品市场。通过不断推出创新产品和解决方案,AnalogicTech成功实现了市场的多元化发展,为公司的长期稳定发展奠定了坚实基础。

这五个故事展示了AnalogicTech公司在电子行业中发展起来的关键阶段和重要举措。凭借其卓越的技术创新、全球化的运营策略、高效的物流配送体系以及市场扩张与多元化战略的推进,AnalogicTech成功地在竞争激烈的电子行业中脱颖而出,成为了一家备受瞩目的企业。

Franz Binder GmbH & Co公司的发展小趣事

为了更好地服务全球客户,AnalogicTech积极实施全球化运营策略。公司在亚洲和大中华地区建立了广泛的晶圆制造和后端合作伙伴网络,包括香港地区、上海和台湾地区的台北。此外,AnalogicTech还迁入香港科技园,将深圳地区纳入业务版图,提高在中国大陆的销售情况,特别是珠江三角洲地区。

Dau Semiconductor Inc公司的发展小趣事

在市场竞争日益激烈的今天,Dau Semiconductor Inc公司深知只有不断创新和升级技术,才能保持市场竞争力。因此,公司不断加大对研发的投入,引进先进的设备和人才,探索新的技术方向。近年来,公司成功研发出了多款具有创新性的半导体芯片产品,如基于人工智能技术的智能芯片、基于物联网技术的低功耗传感器芯片等。这些产品的推出,不仅为公司带来了更多的商业机会,也为行业的发展注入了新的活力。

GWM Associates公司的发展小趣事
前置放大器通常具有较高的增益,能够将微弱的信号有效放大,提高信号的可感知性和分析能力。

问答坊 | AI 解惑

晶闸管在电力稳压器中的应用

摘要:在所研制的新型无触点电力稳压器中,采用晶闸管作为开关器件。文中介绍该系统基本工作原理,详细分析晶闸管在使用过程中存在的一些问题及解决方法。目前流行的电力稳压器大多采用伺服电机带动炭刷移动调整电压。它具有整机效率高、输出波形好 ...…

查看全部问答>

(求助)316驱动IGBT,总烧IGBT,包括400A的都烧掉了?

(求助)316驱动IGBT,总烧IGBT,包括400A的都烧掉了(电流应该在400A以下),只是开和关,没用Pwm,另外每次烧掉的那次,IGBT都是关不断的。现在都不敢用了,有人知道为何吗?是不是316的保护特性不行,还是我的管子还是电流不够大(不会的 ...…

查看全部问答>

avr

atmega8资料…

查看全部问答>

帖子刷新太快,再发求救贴

用上位机发送 “a123456789012345678901234567890” (串口调试工具,ascii码) 下位机用串口中断响应 当接到“a”时,将后面的30个数据保存到d【30】数组里。 有很好的解决方案吗? 如果直接用d【i】= RXBUF0的话 波特率的误差会导致有时出错 ...…

查看全部问答>

想买个开发板,大家给推荐推荐!

性价比高的吧,不能太贵,但是功能也不能太少!…

查看全部问答>

提高同步系统的运行速度

同步电路的速度是指同步时钟的速度。同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。 我们先来看一看同步电路中数据传递的一个基本模型:如下图 图1(Tco是触发器时钟到数据输出的延时;Tdelay是组合逻辑的延时 ...…

查看全部问答>

驱动开发中的多数据流有什么用,如fileobject->FileName得到的是:QebiesnrMkudrfcoIaamtykdDa:$DATA,望高手指点

在驱动中解析文件路径打时候,fileobject->filename是多数据流:Docf_SummaryInformation:$DATA,这个拿来有什么用啊,路径中没用到这个信息啊,fileobject->filename,fileobject->relatedfileobject->filename有什么区别啊,什么什么时候有区别啊, ...…

查看全部问答>

救助 用VHDL 设计一个指令寄存器 紧急 谢谢

救助 用VHDL  设计一个指令寄存器  紧急 谢谢  大家新年快乐哈…

查看全部问答>

电源接反的问题

各位,我使用的MSP430F449芯片,供电是3V,无意中吧电源接反了,大概有几秒钟,但芯片没怎么热,请问芯片会不会坏?目前我的仿真器和编程器没回来,无法测。有什么其他的办法在没有程序的情况下判断?…

查看全部问答>

一些运放资料

可能会对为今年大赛做准备的 有帮助 [ 本帖最后由 zhangdaoyu 于 2011-8-6 21:47 编辑 ]…

查看全部问答>