自控笔记

LPC1788 emWIN移植笔记(一)–LCD驱动移植

最近在学习LPC1788的LCD控制器,做完基本的显示和触屏实验后,就想着学习一下emWIN。

于是,在NXP的网站LPCware.com上下载了emWIN的库和例程。可是例程和自己的板子不是配套的,需要对其修改后才可以使用。经过好几个小时的修改,例程终于在我的LPC1788开发板上跑起来了。期间遇到了一些问题,下面就记录一下移植步骤,以供大家参考。但是仍然存在这一些问题,还望大家指教。

 

一、修改emWIN配置文件

移植emWIN需要修改GUIconf.c和LCDconf.c两个配置文件即可(GUIconf.c例程中已经写好,这部份不修改也可)。

GUIconf.c主要为emWIN分配管理空间,这一部分主要是修改GUI_X_Config函数,如下图所示。

emWIN_GUICONF 在MDK中对GUI_X_Config()中起效的是

这句话会把_aMemory数组放在名为GUI_RAM的段中,zero_init属性表示不对这片区域初始化。这需要在分散加载文件中定位。

在LCDConf.c中也有类似的存储空间分配:

LCD_CONF

__align(8) 表示对齐方式,8字节对齐,要求首地址的最后三位为0。_aVRAM数组大小为何为FB_XSIZE * FB_YSIZE / (4 / PIXEL_WIDTH)] 自己可以根据屏幕分辨率和像素位深来计算一下。

GUI_RAM段和VRAM段都需要在分散加载文件中分配好存储区域,例程的分散加载文件(FLASH.sct)如下:

可以在.map文件中看到段对应的地址

mapGUI_RAM首地址 OXA0000000 VRAM首地址0xA0C00000(因为_aMemory大小为(1024 * 1024) * 12 MByte,故偏移量为0xC00000)

下面需要修改LCDconf.c

修改其中的LCD_X_Config和LCD_X_DisplayDriver函数调用的InitController函数(如下图)

emWIN_LCD

原函数:

修改后的函数:

 

#ifndef _WINDOWS

因为暂时还没有加入触摸屏,所以把_InitTouch();也注释掉了。

此外还需把

改为

(因为原程序是靠EEPROM来配置的)

至此配置文件已经修改好了。

二、修改项目的启动文件(startup_LPC177x_8x_Keil.s)

修改上面的程序为:

三、修改主程序文件(main.c)

上面的程序改为:

在主文件中加入自己的SDRAM驱动以及LCD驱动(LCD驱动也可以写在LCDconf.C中的LCD_X_DisplayDriver函数调用的_InitController()函数里)

LPC1788 官方emWIM例程的移植修改大致就是上面的步骤,具体细节需要根据编译出现的细节对一些函数进行删减,编译后下载就可以看到如下画面:

IMG_20140601_222231

如过想尝试SEGGER公司的例程,则需要在项目中移除已存在的上面所示的演示例程,添加SEGGER官方例程,在…\NXP_emWin522_BSP\Start\Application\SEGGERDEMO文件目录下:

sample1sample2 然后添加相应的头文件目录,在主程序中添加头文件GUIDEMO.h,重新编译即可。演示程序的开关在GUIDEMO.h中,可以选择演示哪个例程。

guidemo

 

IMG_20140601_194625IMG_20140601_194708

但是编译下载后,发现LCD显示的动画会出现错位闪屏的现象,在MDK上设置use MicroLIB后情况得到较大幅度好转,但是

问依然存在,不知如何解决。

以后,将会继续添加对触摸程序的移植。

IMG_20140601_221843

IMG_20140601_221851

 

Technorati 标签: ,

Linux文件执行权限

十一假期原来有7天,我竟然以为是五天!晕了,晕了,这日子真是过晕了。

继续学习Python。

在Windows系统中,可以依据Python文件的后缀名来识别是Python文件,从而启动运行。但是在Linux系统中,只是把.py文件当作普通的文本文件。对于此,看到一句话:“不知是Windows把我们的生活变的简单了,还是把我们自己变得更傻了。”对此不做评论,大千世界,天下大同并非很好。

可以在Python文件的第一行加上一行告诉系统,用什么程序来执行此文件:

#!/usr/bin/env python

于是在Linux下编写了一个简单的程序并保存为hello.py:

#!/usr/bin/env python
print(‘hello’)

但是在执行的时候却遇到了问题,省去python,直接在终端上输入:

./hello.py

提示权限不足。但是在提升至root权限后,仍然提示权限不足,如果在文件名前加上python:

python ./hello.py

可以执行。Linux菜鸟一个,所以 不明所以。

Python

最后发现原来是文件没有执行权限。在终端上输入:chmod -x ./hello.py

Python

更改文件的执行权限,在输入:

./hello.py

就可以运行了。

也可以鼠标右键单击hello.py,在快捷菜单中选择属性,选择权限栏,然后勾选“允许以程序执行文件”就OK了。

Python

Linux分区与文件目录结构

一直以来都十分迷惑Linux的分区与文件的关系,只是听说Linux是用文件来管理的分区的,但是由于习惯了Windows的分区与文件的关系,对于Linux的分区与文件还是不甚了解。

这个十一打算学习一下Linux以及Linux C,顺便看一下传说中的Python。于是在十一到来前,在图书馆借了几本厚厚的书。

Linux books

Continue reading “Linux分区与文件目录结构” »

由(void *)0引起的思考

最近准备了解下uC/OS II嵌入式实时操作系统,读代码的时候发现了程序中一个奇怪的的写法:(void *) 0。不明所以,便开始寻找答案。最后发现小小的void的竟隐藏着那么多东西。

一、void

void是空类型的意思,函数表示函数无返回值,或者无参数传递。比如void Delay10ms(void)。同时,void也不能这样定义变量,void p

二、void *p

然而,void *则表示无类型指针,也就是说void *可以指向任何类型的指针。比如:

这在VC++6.0编译是正确的。

编译是错误的,提示”cannot convert from ‘void *’ to ‘int *’”

所以可以把任何类型的指针赋值给无类型的,但是不可以把无类型的指针赋给有类型的。网上对于此的解释有一句话说的好:“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。

void是一个比较抽象的概念,所以不能利用无类型的指针获取指针所指向的数据。

程序输出的结果一样,都是变量b的地址。

运行正确,输出10。

然而

编译会出现错误。

把上面的程序中无类型指针强制转换成整型指针,则可以输出所指向地址内存中存储的值。

这样输出的结果为:10

三 void *p()

由上面可以推断

void *p()是定义一个返回值是无类型指针的函数(通用指针)

四、(void *) 0

所以,(void *) 0就是把0强制转化成无类型指针,它只能赋值给无类型指针,而不能赋值给有类型指针。

编译正确。

编译错误:“cannot convert from ‘void *’ to ‘int *’”

一般

NULL表示一个空指针。

ARM7学习-实时时钟RTC

LPC2138内部含有RTC电路,其RTC时钟可由独立的32.768kHz 振荡器或基于 VPB 时钟的可编程预分频器来提供。使用LPC2138内部的RTC电路,需要把RTC 专用的电源管脚 Vbat接上3.3V的电源。

编程环境:MDK-ARM Professional 4.72a

仿真环境:Protues 8.0

ARM7芯片:LPC2138

SPI芯片:74HC595(串转并)

每次按下按键,四个数码管将显示不同的数字,数字分别显示的是年、月日、时分、秒星期。

按键采用外部中断0,接口采用SPI接口。

ARM7 RTC

程序修改自:《ARM嵌入式系统设计与仿真》