![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 基于TMS320LF2407嵌入系统GUI设计新方法 | |||||
作者:朱国华 王… 文章来源:本站原创 点击数: 更新时间:2006-8-1 ![]() |
|||||
|
关键词:DSP TMS320LF2407A SED1335 液晶显示 片上flash。 中图分类号:TP316 文献标识码:A 文章编号:1006-7973(2006)01-0097-03 一、TMS320LF2407存储空间配置特性分析 为了加快运算速度DSP处理器都采用程序空间和数据空间相互独立的哈佛体系结构和COFF数据格式,这种格式是以段(.section)为核心的存储形式,可以随存储系统的不同进行个性化配置,提高了代码对存储空间的利用和管理,特别适合哈佛结构的处理器。TI公司CCS集成开发环境下的C语言编译器将针对DSP的结构特点自动产生7个初始化段)并且对他们所在的存储空间有严格要求:.bss,.sysmem,.stack和.const段必须放在数据空间page1,其它由编译器自动生成的段要放在程序空间page0。 从.cinit和.const段功能看,两个段都是完成对变量的初始化,他们的区别就在于.cinit段是在系统上电时进行全局变量和全局静态变量初始化。由于DSP系统一般的上电工作顺序是:1.开启看门狗和初始化.cinit段的数据,2.创建C语言运行环境,3.进入用户程序入口main(),4.完成用户初始化。从工作顺可以看出如果采用在.cinit段初始化完成以后,程序运行到用户初始化阶段才关闭看门狗的常规方法,那么在设计大容量图文字库时就会因为看门狗超时不断复位DSP系统使整个系统瘫痪。因此必须设计一种新的方法来设计来实现字库设计。由于无法使用.cinit作为存储段。我们就将研究重点转向与.cinit段功能相似的.const段。但是从表1我们可以看出.const只能映射到数据空间(Page1页)但是它映射的物理存储器可以是RAM或者ROM。而TMS320LF2407片内flash是不能映射到page1页。 也就是说如果直接使用.const段来保存大容量字库,就必须外挂flash达不到设计的初衷。如果将字库保存在数据空间的RAM中一旦掉电所有数据将全部丢失,该方案也不可行。因此我们只能利用CCS集成开发环提供的运行地址和装载地址不同的特性,将.const段装载到程序空间的片内flash,运行时从flash拷贝到数据空间的RAM,然后开始执行用户代码,那么就会给DSP处理器一种假象好像.const段一直是在数据空间(即程序空间的物理存储器虚拟映射到数据空间)。从而实现了对片内剩余flash的最大限度的利用,减少了设计成本和体积。 二、TMS320LF2407程序空间flash虚拟映射到数据空间解决方案 首先我们从TI公司TMS320LF2407的运行时间库中提取出boot.asm加入下面代码 CONST_COPY.set 1 .if CONST_COPY .sect ".c_mark" .label __const_load//装载地址 .global __const_run,//运行地址 __const_length //const段长度 .text .endif .if CONST_COPY const_copy: LARPAR3 LRLK AR3,#__const_length BANZ cont,*-,AR2 B quit cont: LRLK AR2,#__const_run LALK #__const_load cloop: TBLR *+,AR3 ADDK 1 BANZ cloop,*–,AR2 quit: LARP AR1 ; RET .endif 具体实现方法如下,在CMD文件中加入如下的脚本命令: .const : load=CODE PAGE 0 run=DATA PAGE 1 { _const_run=.;//(获得当前运行地址) *(.c_mark) *(.const) _const_length=.-_const_run; } 然后对运行时间库中的boot.asm文件进行如下步骤的操作: 1)从rts.rc源文件库中提取boot.asm Dspar -x rts.src boot.asm 2)添加上面的代码到boot.asm 3)重新编译boot.asm 生成boot.obj文件 dspa -v2xx boot.asm 4)把boot.obj归档到到rts.2xx.lib库中。 dspar -r rts2xx.lib boot.obj 此时生成新的文件rts2xx.Lib将代替原来的rts2xx.Lib。在编译时C语言程序将链接到新的rts2xx.lib。当DSP上电初始化时,DSP会自动地将程序空间的.const的数据搬移到数据空间的中运行地址,从而达到了充分利用2407A片内存储器节省成本的目的。 三、图文显示软件设计 cmd文件具体修改方法如下:在命令链接文件的段定义部分(SECTIONS),将原来的const段用下面重新定义的.const段代替。 SECTIONS { .const : load=CODE PAGE 0 run=DATA PAGE 1 { __const_run=.; *(.c_mark) *(.const) __const_length=.-__const_run; } } 为配合DSP片内图文字库正常显示还必须对 SED1335液晶控制器进行各种显示参数设置,完成初始化。 1.SED1335初始化设置 (均以分辨率为240×160的液晶显示面板为例) 初始化设置主要完成以下5个任务。 (1)将SED1335控制器设置为图文模式,为实现图文字库的独立或混合显示做好准备。 (2)设置屏幕显示的行数和列数。 (3)设置LCD屏幕坐标与SED1335控制器显存的映射关系。为简化映射关系便于编程我们以LCD屏幕左上角为坐标原点,沿X轴向右为X正方向,沿Y轴向下为Y正方向,建立屏幕坐标系。将该屏幕坐标系的(0,0)点映射到SED1335控制器显存的0地址然后依次(0,1)...(0,239);(1,0)...(1,239);...(159,0)...(159,239)点顺序映射到显存地址1,2…去。这种映射便于以后图文字库数据显示时的地址计算。 (4)设置显示字符的高度,宽度和屏幕一行所占显存的大小。 (5)显示起始位置,显示区域设置和图文显示叠加方式。 SED1335初始化代码 void LCD1335_init1() { writec(0x40); writed(0x30); writed(0x87);/* 2~0---FX 字符的宽度*/ writed(0x07);/* 3~0---FY 字符的高度 */ writed(0x1d);//每行能显示的字符地址范围 writed(0x21)// TC/R 〉=C/R+4 writed(0x9f)//表示每一帧有多少行=160-1 writed(0x1e);//存储器内每行所占字节数writed(0x00); writec(0x44)//设置显示起始位置和显示区域 ………… writec(0x5a);//设置水平滚动位置 writed(0x00); writec(0x5b);//设置图文显示叠加方式 writed(0x1d); writec(0x58);//开显示 writed(0x77);//光标闪烁0x77 writec(0x5d);//设置光标格式 ……… clear(); writec(0x46);//设置显示地址起始位置 writed(0x00); writed(0x00); writec(0x5d);//设置光标类型 writed(0x04);//设置光标的水平宽度 writed(0x86);//设置光标字符的起始位置距离光标的高度(Pixels)16 writec(0x59); } 2.数据发送函数设计 为实现TMS320LF2407片内字库数据显示。首先必须将指令代码发送到SED1335的命令口,然后再把显示数据送到SED1335的数据口,完成一个显示数据发送周期。因此我们必须设计一个writec函数负责向SED1335发送命令代码,一个writed函数负责向SED1335发送要显示的图文数据。由于DSP属于高速器件为方便和SED1335控制器进行时序匹配。我们采用TMS320LF2407的IOPB口作为SED1335的控制号.具体控制信号定义如下: 1)PB.3为WR读写控制信号 2)PB.1为CS信号(片选) 3)PB.0为A0 控制信号(数据/命令方式选择) 发送函数设计:在头文件中做如下定义:LCD.h #define myport port8000 //SED1335命令口 void writec(unsigned int c)//写命令字 void writed(unsigned int c)//写数据字 写命令函数设计如下: void writec(unsigned int c) { *PBDATDIR=*PBDATDIR|0x0001;//a0=1; *PBDATDIR=*PBDATDIR&0x0FFFD;//cs=0; *PBDATDIR=*PBDATDIR&0x0FFF7;//wr=0; myport=c;// 发送命令代码给SED1335 *PBDATDIR=*PBDATDIR|0x0008;//wr=1; *PBDATDIR=*PBDATDIR|0x0002;//cs=1; *PBDATDIR=*PBDATDIR&0x0FFFE;//a0=0; delay(30); } 写数据函数void writed(unsigned int c)设计与写命令函数设计类似,只需要在LCD头文件中添加SED1335的数据口地址定义,就可实现写数据函数的设计。 3.文本显示函数设计 要让图文字库的数据能够正确的显示就必须根据初始化时设定的屏幕映射坐标,计算出屏幕显示位置对应的显存地址。接着将对应的显存地址通过writed()函数发送到SED1335,然后再将图文数据通过writed()发送给SED1335,完成一个显示周期。由于字模是按从上到下从左到右的规律提取的。以16×16的字符显示为例。那么它提取的数据共有32个字节。左半边字16个字节,右半边16个字节。为了能正确的显示字符,必须先连续写入左边的16个字节,然后再连续写入右边的16个字节,才能正确的显示文字。由于SED1335控制器具有地址自动累加功能。因此可以利用这个功能,每次只在左半边或右半边数据开始时写入地址,然后可以连续发送显示数据。这种功能可以加快文字显示的响应速度,适应屏幕快速刷新的应用。 (1)顶层文本显示函数设计 当显示字符大小为16*16时,在240×160LCD上就可以显示10行每列15个汉字或西文。根据前面定义的屏幕映射坐标和显示字符大小可以得出 显示地址计算公式: addr=16*(x-1)*(0x1e)+2*(y-1) 其中x 表示字符所在的行号(1,2,3,…10),y 表示字符的列号(1,2,…15),其中0x1e是初始化设置的屏幕一行所占显存的大小。具体设计如下: void display_word(const unsigned int* data,unsigned int x,unsigned int y) { unsigned i,addr,temp,temp1; addr=16*(x-1)*(0x1e)+2*(y-1); temp=addr&0x00ff; writec(0x46); writed(addr); temp=((addr&0xff00)>>8); writed(temp);//0x00 writec(CSRDIR_down); writec(0x42); for(i=0;i<16;i++) writed(*p++); temp1=addr+1; temp=(temp1&0x00ff); writec(0x46); writed(temp); temp1=((temp1&0xff00)>>8); writed(temp1); writec(CSRDIR_down); writec(0x42); for(;i<32;i++) writed(*p++); } (2)背景层写数据函数设计 其函数void write_back(const unsigned int* data,unsigned int x,unsigned int y)原理与顶层文本显示相同,只是注意计算起始地址时,地址的偏移量不在是0而是第2层的起始地址。即地址计算公式修正为: addr=16*(x-1)*(0x1e)+2*(y-1)+第二层起始地址。通过对已写入的顶层文本加入背景就可以实现各种特效显示效果。同理对于图像数据的显示也是根据图像数据提取的规律和屏幕映射坐标以及图像的显示大小归纳出地址计算公式。然后利用文本显示的框架函数就可以构建图像显示函数。实现DSP片上图文字库的显示。总之提到的方法和思路以及代码框架对于任何基于LCD的GUI设计都有普遍的适用价值。 四、调试注意事项 (1)在调试SED1335时,如果开机后出现全屏黑色背景,看不到任何显示,要注意调整背光电压,该问题是由于背光电压不合适造成的。 (2)在控制时序调整时,可以先将系统工作时钟设置到最低的工作频率,以便时序调整。 (3)由于SED1335是分层显示的,文本显示在硬件上被设计为第一层,因此在文本显示时必须将文本数据写入第一层否则不能正确显示。 五、结语 该设计在作者参与研制的船舶侧向推进控制系统中的手持终端设计中取得极大的成功。该设计不但节约了成本,而且使产品的体积变小,抗干扰性提高。性能经测试达到进口同类设备性能。该项目中所使用的技术对其它含有片上flash的C2000系列的DSP同样适用。 参考文献 [1] 王潞钢.DSP C2000程序员高手进阶.北京.机械工业出版社2004:164~176. [2] 刘和平,王维俊,江渝,邓力.TMS320LF240x DSP C语言开发应.北京.北京航空航天大学.2003:223~245. [3] 周宏志,王冬青,贾玉兰.手持式仪器中液晶控制板的硬件设计.现代电子技术.2003.1:54~57. |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 基于DSP的电子节气门PID控制 基于DSP的多路音/视频采集处… 低功耗实时可编程DSP数字助听… 基于DSP+CPLD的断路器智能控… 基于DSP+CPLD的交流电机调速… 基于DSP的分布式微机保护测控… 基于DSP的语音实时变速系统设… 以ARM和DSP嵌入式系统为核心… 基于双DSP的运动目标智能跟踪… 基于TMS320LF2407A的SVPWM变… |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|