基于LINUX系统的嵌入式LED显示的设计.docx
- 文档编号:6340762
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:30
- 大小:1.05MB
基于LINUX系统的嵌入式LED显示的设计.docx
《基于LINUX系统的嵌入式LED显示的设计.docx》由会员分享,可在线阅读,更多相关《基于LINUX系统的嵌入式LED显示的设计.docx(30页珍藏版)》请在冰豆网上搜索。
基于LINUX系统的嵌入式LED显示的设计
摘要
本次课程设计利用实验室提供的博创经典UP-TECH-S2410/P270-DVP实验箱,通过上位机编程控制下位机进行点阵式LED显示简单的图案,我们小组主要操作显示的图形很多,我主要负责的是“0”形图案和心形图案。
通过这次课程设计了解如何编写C语言程序,生成makefile文件,实现用软件使LED显示相应的图案,并且通过对宿主机下位机的相关上机操作,实现对书本内容的实际操作,巩固加深对嵌入式系统的认知和了解,最终在此基础上进行创新设计,我们共同编写C程序实现对点阵式LED显示动态文字。
关键词:
嵌入式C程序点阵式LED
目录
前言3
一、基本原理4
1.1嵌入式系统简介4
1.2嵌入式Linux发平台简介4
1.3嵌入式Linux发环境的5
1.4点阵式LED6
1.5LED的段码表7
1.6点阵式LED的显示缓冲区7
二、硬件连接与配置9
2.1硬件配置过程图9
2.2建立开发环境9
2.3配置服务10
1.配置TFTP10
2.防火墙设置11
3.配置NFS服务12
4.启动实验平台13
三、程序设计与makefile编译调试16
3.1软件程序流程图16
3.2程序设计16
3.3makefile21
四、实验结果与结果分析22
4.1程序运行22
4.2LED显示结果23
4.3结果分析23
五、总结24
参考文献25
附录26
前言
嵌入式系统是指对应用场合,对功能,可靠性,成本,体积,功耗有严格要求的专用计算机系统。
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同一般由嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序4个部分组成。
用于实现对其他设备的控制,监视或管理等功能。
嵌入式系统已经广泛应用于科学研究,工业控制,军事技术,交通通信,医疗卫生,消费娱乐等领域,人们常用的手机,PDA,汽车,智能家电,GPS等均是嵌入式系统的典型代表。
本课程设计要求学生利用实验室提供的ARM2410实验箱进行相应的设计,主要包括理解LED原理,掌握在LINUX下常用编辑器的使用,掌握MAKEFILE的编写和使用,掌握LINUX下的程序编译与交叉编译过程,有一定的数字电路的知识,能够设计出新颖的显示图样,最后通过上下位机实现结果的显示,以及了解嵌入式开发的流程和一些基础知识,另外主要注重培养我们对嵌入式开发的兴趣,与此同时,我们还能巩固一下C语言编程和Makefile文件的编写规则,还有一些硬件的连接等,为将来的嵌入式学习和工作做好充足的准备。
一、基本原理
1.1嵌入式系统简介
嵌入式系统是基于单片机的一种升级版,它是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
我们可从几方面来理解嵌入式系统:
1、嵌入式系统是面向用户、面向产品、面向应用的,嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的裁减利用。
嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。
2、嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物。
这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
3、嵌入式系统必须根据应用需求对软硬件进行裁剪,满足应用系统的功能、可靠性、成本、体积等要求。
为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
4、嵌入式系统本身不具备自主开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。
实际上,凡是与产品结合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统。
现在人们讲嵌入式系统时,某种程度上指近些年比较热的具有操作系统的嵌入式系统。
1.2嵌入式Linux发平台简介
Linux价格低廉,功能强,可以运行在X86,Alpha,Sparc,MIPS,PPC,MOTOROLA,NEC,ARM等硬件平台上,而且放源代码,可以定制。
我们所介绍的硬件平台是基于ARM体系结构,由北京博创兴业科技有限公司发的UP-NetARM3000、UP-NetARM2410系列以及UP-TECHPXA270系列实验仪器。
UP-NetARM3000的CPU为ARM7TDMI内核的三星S3C44B0X01芯片,由于没有MMU(内存管理单元)只能运行uClinux,UP-NetARM2410系列的CPU为ARM920T内核的三星S3c2410芯片,由于有MMU可以运行标准的ARM-LINUX内核。
UP-TECHPXA270系列实验仪器为IntelPXAARM10系列CPU。
通过这些硬件平台,我们可以学习嵌入式LINUX中的针对有MMU和无MMU的不同发过程。
图1-1UP-TECHS2410DVP硬件实物图
1.3嵌入式Linux的开发环境
嵌入式LINUX发环境有几个方案:
(1)基于PC机WINDOWS操作系统下的CYGWIN;
(2)在WINDOWS下安装虚拟机后,再在虚拟机中安装LINXUX操作系统;
(3)直接安装LINUX操作系统。
基于WINDOWS的环境要么有兼容性问题,要么速度有影响,所以我推荐大家使用纯LINUX+操作系统发环境。
我们实际的发环境为REDHAT9,它已经支持中文,并且包含了绝大部分的发工具,不用担心装了LINUX就不能使用WINDOWS的问题。
一般的情况都是用户已经有了WINDOWS操作系统,再安装LINUX,LINUX会自动安装一个叫作GRUB的启动引导软件,可以选择引导多个操作系统。
本次课设选择第二种方案。
首先在安装有windows7操作系统下安装vmware虚拟机(安装工具),然后在虚拟机中安装REDHATLINUX9.0。
在虚拟机上安装RedHatLINUX9.0,选择Custom定制安装,在选择软件Package时好将所有包都安装,需要空间约2.7G,如果选择后一项:
everything,即完全安装,将安装3张光盘的全部软件,需要磁盘空间大约5G。
因此建议提前为REDHATLINUX的安装预留大约5-15G的空间,具体视用户的硬盘空间大小来确定,在安装完Redhat后还要安装Linux的编译器和发库以及ARM-Linux的所有源代码,这些包安装后的总共需要空间大约为800M
图1-2嵌入式界面
1.4点阵式LED
首先,什么是LED?
在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。
点阵式LED显示器的显示单元一般由8行8列的LED组成,其外形以及内部连接图
(1)所示,可以再由这8行8列的LED拼成更大的LED阵列。
点阵式LED显示器能显示各种字符,汉子和图形,并具有色彩。
LED是发光二极管英文LightEmittingDiode的缩写格式,LED器件种类繁多,早期的LED产品是单个发光管,随着数字化设备的出现,LED数码管和字符管得到了广泛的应用,LED点阵等显示器件的出现,适应了信息化社会发展的需要,成为了大众传媒的重要工具。
点阵式LED显示器的显示控制采用扫描方式,在数据存储器中开辟若干个存储单元作为显示缓冲区,缓冲区中存有所需显示图形的控制信息。
显示时依次通过列信号驱动器输出一行所有列的信号,然后在驱动对应的行信号,控制该行显示。
只要扫描速度适当,显示图形,就不会出现闪烁。
本次实验中,利用LED驱动程序“s3c2410-led.o”提供的open、IOCtl、write、release等函数控制LED显示。
可在相同目录下找到其源程序“s3c2410-led.c”进行分析。
图1-3点阵式LED
1.5LED的段码表
由于开发板上两个数码管的连接是共阳极,分别显示“十位”和“个位”数字,中间是一个点号,总是让它置“1”。
所以当想要其中之一显示为“0”时,那么其对应的段码应为“11000000”,转化为十六进制即为0xc0。
同理可以给出“1”~“9”的段码,从而形成如下段码表:
unsignedcharLEDCODE[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
注意:
前10个表示字符“0”~“9”的段码,最后一个表示各段全灭,不显示。
用户程序使用ioctl函数用来控制2个数码管的显示:
ioctl(fd,0x12,LEDWORD);
由于两个8字数码管需要同时显示,故需要将“十位”的段码左移8位,拼接上“个位”的段码,形成一个16位的LEDWORD。
1.6点阵式LED的显示缓冲区
点阵式LED驱动器逻辑中设置了8个字节的缓冲区,每个字节按位对应点阵式LED模块上的一列8个点。
如要显示字符或图形,需要先给出对应点阵数据存储在缓冲区才能显示。
通过调用write函数控制点阵式LED显示对应字符或图形。
图1-48*8点阵硬件连接图
二、硬件连接与配置
2.1硬件配置过程图
硬件的配置过程图:
图2-1硬件的配置过程图
2.2建立开发环境
1.在下位机断电的情况下,利用实验箱中自带的串口线将上位机的com1口与下位机的RS232-0口进行连接。
2.利用实验箱中自带的直连网线将上位机与下位机进行连接。
3.打开宿主PC机电源,进入Linux操作系统
4.将上位机配置为NFS服务器,设置共享目录为“/shanre”。
5.在上位机中启动NFS服务,下位机使用命令mount挂载上位机的共享目录。
mount–tnfs192.168.0.252:
arm2410cl/mnt/nfs
6.启动minicom超级终端程序,选择“Serialportsetup”进入串口配置界面进行串口配置。
然后可以打开下位机的电源,通过minicom对下位机进行操作。
图2-2串口配置界面
7.使用命令ifconfig分别查看上位机和下位机的IP地址,判断上位机与下位机是否处于同一个网段。
若它们不在同一网段,使用命令ifconfig或者KDE桌面的工具,将它们配置在同一网段。
使用命令ping查看上位机与下位机的网络连接是否正常,如不正常,请检查网线的连接、IP地址的配置、IP地址是否冲突等。
2.3配置服务
在宿主PC计算机上启动NFS服务,并设置好共享的目录,在建立好NFS共享目录以后,我们就可以进入MINICOM中建立开发板与宿主PC机之间的通讯了。
1.配置TFTP
TFTP的全称是TrivialFileTransferProtocol,即简单文件传输协议。
使用此服务传送文件时没有数据校验、密码验证,非常适合小型文件的传输。
在通过TFTP传送文件时,需要服务端和客户端,对于我们嵌入式系统来讲,服务端就是我们的宿主机,下面我们来对他进行配置:
(1)在终端中输入命令安装TFTP服务:
sudoapt-getinstalltftp-hpa
sudoapt-getinstalltftpd-hpa//服务器
(2)在终端中输入命令:
sudogedit/etc/default/tftpd-hpa,打开文件后,将文件内容更改为如下所示的内容:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/temp/tftpboot"
TFTP_ADDRESS="0.0.0.0:
69"
TFTP_OPTIONS="--secure-c"
文件内容更改完毕,保存并退出,回到终端界面
(3)重新启动TFTP服务:
sudo/etc/init.d/tftpd-hparestart
(4)测试TFTP,首先在TFTP服务端所在目录下新建测试文件test0,然后输入以下命令:
tftplocalhosttftp>gettest0tftp>puttest1tftp>q
在任意目录下,输入以上命令,能够正常的和tftpboot服务端进行文件传输,即表示TFTP服务已经安装并配置成功了,测试图如下图(12)所示:
图2-3tftp的配置界面
2.防火墙设置
输入命令”setup”分别进行对系统服务及防火墙配置。
图2-4minicom启动画面
3.配置NFS服务
NFS(NetworkFileSystem)指网络文件系统,它实现了文件在不同的系统间使用。
当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。
每次重启宿主PC机时,先输入命令”serviceportmaprestart”和”servicenfsrestart”,以启动nfs服务。
(1)启动vi编辑器查看网段
输入命令”Vi/etc/exports”查看网段为”192.168.0.*”,按键”ESC”,输入”:
wp”存盘退出。
(2)重新启动NFS服务,输入”ifconfigeth0192.168.0.110”完成主机IP地址设置。
图2-5主机IP地址设置
(3)进入共享文件”cd/root/share/exp/basic/10_led”,输入”ls”查看10_led下的两个.c文件。
输入”makeclean”,”make”生成两个.0文件,转入超级终端。
4.启动实验平台
(1)建立超级终端:
运行Windows系统下(以WindowsXP为例)开始→所有程序→附件→通讯→超级终端(HyperTerminal)。
(2)新建一个通信终端。
如果要求输入区号、电话号码等信息请随意输入,出现如图所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。
单击“确定”按钮
图2-6启动实验平台界面
(3)在接下来的对话框中选择ARM开发平台实际连接的PC机串口(如COM1),按确定后出现如图所示的属性对话框,设置通信的格式和协议。
这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。
按确定完成设置。
完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。
用串口线将PC机串口和平台UART0正确连接后,就可以在超级终端上看到程序输出的信息了。
图2-6COM1的参数设置
(4)启动实验平台:
:
打开电源开关,系统会由VIVI开始引导。
正常启动时会显示启动信息到“PressReturntostarttheLINUXnow,anyotherkeyforvivi”,按除回车键外的其它键则进入vivi控制台。
图2-7vivi的编辑界面
(1)
图2-8vivi的编辑界面
(2)
(5)输入”ping192.168.0.110”和”192.168.0.121”查看是否连通,若成功连接,”Ctrl+C”结束,在进行挂载后,查找根目录下的文件”cd/host/exp/basic/10_led”,通过“ls”查看文件,然后使用“insmods3c2410-led.o”命令完成将一个可动态加载的模块加载到内核中。
输入”lsmod”显示当前内核加载的模块,输入命令”./test_led”进行程序测试。
图2-9在目录下的查看界面
三、程序设计与makefile编译调试
3.1软件程序流程图
图3-1软件程序流程图
3.2程序设计
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*debugmacros*/
//#undefDEBUG
#defineDEBUG
#ifdefDEBUG
#defineDPRINTK(x...)printk("s3c2410-led:
"x)
#else
#defineDPRINTK(x...)
#endif
#defineDEVICE_NAME"s3c2410led"
#defineLED_TUBE_PHY_START0x08000110
#defineLED_DIG_PHY_START0x08000100
#defineLED_TUBE_IOCTRL0x11
#defineLED_DIG_IOCTRL0x12
staticintledMajor=0;
#defineLED_MINOR1
#ifdefCONFIG_DEVFS_FS
staticdevfs_handle_tdevfs_led_dir,devfs_led;
#endif
staticu32s3c2410_led_tube_addr=IDE_BASE+0x100;
staticu32s3c2410_led_dig_vaddr=IDE_BASE+0x110;
staticints3c2410_led_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedintarg)
{
//printk("DOTbufferis%x\n",arg>>8);
switch(cmd){
caseLED_DIG_IOCTRL:
return*(volatileunsignedlong*)s3c2410_led_dig_vaddr=((arg>>8)|(arg<<16));
default:
returnprintk("yourcommandisnotexist");
}
return0;
}
staticssize_ts3c2410_led_write(structfile*filp,constchar*buf,size_tcount,loff_t*f_pos)
{
inti;
unsignedcharmdata[16];
if(copy_from_user(mdata,buf,10)){
return-EFAULT;
}
for(i=0;i<8;i++){
//printk(":
:
%d",mdata[i]);
//*((volatileunsignedchar*)(s3c2410_led_tube_addr+i))=0xff;
*((volatileunsignedchar*)(s3c2410_led_tube_addr+i*2))=mdata[i];
//printk(":
:
%x",*((volatileunsignedshort*)(s3c2410_led_tube_addr+i)));
}
//printk("\n");
return0;
}
staticints3c2410_led_open(structinode*inode,structfile*filp)
{
MOD_INC_USE_COUNT;
printk("leddeviceopensucess!
\n");
return0;
}
staticints3c2410_led_release(structinode*inode,structfile*filp)
{
MOD_DEC_USE_COUNT;
printk("leddevicerelease\n");
return0;
}
staticstructfile_operationss3c2410_led_fops={
owner:
THIS_MODULE,
open:
s3c2410_led_open,
ioctl:
s3c2410_led_ioctl,
write:
s3c2410_led_write,
release:
s3c2410_led_release,
};
int__inits3c2410_led_init(void)
{
intret;
BWSCON=((BWSCON&~(BWSCON_ST1|BWSCON_WS1|BWSCON_DW1))|(BWSCON_ST1|BWSCON_DW(1,BWSCON_DW_16)));
BANKCON1=BANKCON_Tacs4|BANKCON_Tcos4|BANKCON_Tacc14|BANKCON_Toch4|BANKCON_Tcah4|BANKCON_Tacp6|BANKCON_PMC1;
GPACON|=(1<<12);
ret=register_chrdev(0,DEVICE_NAME,&s3c2410_led_fops);
if(ret<0){
DPRINTK(DEVICE_NAME"can'tgetmajornumber\n");
returnret;
}
#ifdefCONFIG_DEVFS_FS
devfs_led_dir=devfs_mk_dir(NULL,"led",NULL);
devfs_led=devfs_register(devfs_led_dir,"0raw",DEVFS_FL_DEFAULT,
ledMajor,LED_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410_led_fops,NULL);
#endif
DPRINTK(DEVICE_NAME"\tdeviceinitialized\n");
return0;
}
void__exits3c2410_led_exit(void)
{
#ifdefCONFIG_DEVFS_FS
devfs_unregister(devfs_led);
devfs_unregister(devfs_led_dir);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 LINUX 系统 嵌入式 LED 显示 设计