基于LINUX系统的嵌入式LED显示的设计 - 图文

更新时间:2024-04-23 12:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘要

嵌入式系统是先进的计算机技术、半导体技术、电子技术以及各种具体应用相结合的产物,是技术密集、资金密集、高度分散、不断创新的新型集成知识系统。本次课程设计的目的是在有C语言基础,掌握在Linux下常用编辑器的使用Makefile 的编写和使用以及Linux下的程序编译与交叉编译过程需要部分数字电路的知识的基础上。学习LED的相关知识, 掌握74HC273芯片的工作原理以及了解SPI接口的相关知识。主要内容是学习LED相关知识,了解74HC273芯片对LED点亮的工作机制,熟练阅读74HC273芯片资料,掌握对它的使用。 关键词:嵌入式系统、LED、点阵

目录

一、引言............................................................ 1 二、嵌入式系统的特点................................................ 2

1、概念 ......................................................... 2 2、8段LED原理.................................................. 3 3、点阵式LED原理 ............................................... 3 4、LED数码管电路图.............................................. 4 5、74HC273在开发板上的连接...................................... 5 四、实验部分........................................................ 6

1、实验设备及工具 ............................................... 6 2、实验基础 ..................................................... 6 3、实验环境连接 ................................................. 7 五、 实验步骤...................................................... 12

1、阅读理解源码 ................................................ 12 2、编译应用程序 ................................................ 12 3、下载调试 .................................................... 13 六、心得体会....................................................... 15 七、参考文献....................................................... 16 附录:............................................................. 17

一、引言

目前,嵌入式技术已成为通信和消费类产品的共同发展方向。嵌入式系统几乎包括了生活中的所有电器设备,如掌上PDA、移动计算设备、电视机顶盒、手机上网、数字电视、多媒体、汽车、微波炉、数字相机、家庭自动化系统、电梯、空调、安全系统、自动售货机、蜂窝式电话、消费电子设备、工业自动化仪表与医疗仪器等。

嵌入式系统是先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合的产物,这就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。嵌入式系统一般指非PC系统。它是以应用为中心、软硬件可裁减的、能适应应用系统对功能、可靠性、成本、体积、功耗等综合性要求的专用计算机系统。简单地说,嵌入式系统是集系统的应用软件与硬件于一体,类似于PC中BIOS的工作方式,具有软件代码小、高度自动化、响应速度快等特点,因此特别适合于要求实时和多任务的系统。嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成。

1

二、嵌入式系统的特点

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适应引用系统对功能、可靠性、成本、体积、功耗严格要求的计算机系统。

1)嵌入式系统通常是面向特定应用的,嵌入式CPU与通用型的最大不同就是,嵌入式CPU大多工作在为特定用户群设计的系统中,它通常都具有低功耗、小体积、高集成度等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,因此,器件的移动能力大大增强,同时跟网络的耦合也越来越紧密。

2)嵌入式系统的硬件和软件都必须高效地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。

3)因为嵌入式系统和具体应用有机地结合在一起,它的升级换代也和具体产品同步进行,所以,嵌入式系统产品一旦进入市场,一般都具有较长的生命周期。

4)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机之中,而不是存贮于磁盘等载体中。

嵌入式系统本身不具备自举开发能力,即使在设计完成后,用户也不能对其中的程序进行修改,而是必须有一套开发工具和环境才能进行开发。

三、LED基本原理

1、概念

在某些半导体材料的 PN 结中,注入的少数载流子与多数载流子复合时会

把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN 结加反 向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制 作的二极管叫发光二极管,通称 LED。

LED 的发光颜色和发光效率与制作 LED 的材料和工艺有关,目前广泛使用 的有红、绿、蓝三种。由于 LED 工作电压低(仅 1.5-3V),能主动发光且有 一定亮度,亮度又能用电压(或电流)调节,本身又耐冲击、抗振动、寿命 长(10 万小时),所以在大型的显示设备中,目前尚无其他的显示方式与 LED 显示方式匹敌。 把红色和绿色的 LED 放在一起作为一个像素制作的显示屏叫双基色屏或 伪彩色屏;把红、绿、蓝三种 LED 管放在一起作为一个像素的显示屏叫

2

三基 色屏或全彩屏。制作室内 LED 屏的像素尺寸一般是 2-10 毫米,常常采用把几 种能产生不同基色的 LED 管芯封装成一体,室外 LED 屏的像素尺寸多为 12-26 毫米,每个像素由若干个各种单色 LED 组成,常见的成品称像素筒或像素模 块。 LED显示屏如果想要显示图象,则需要构成像素的每个 LED 的发光亮度都 必须能调节,其调节的精细程度就是显示屏的灰度等级。灰度等级越高,显 示的图像就越细腻,色彩也越丰富,相应的显示控制系统也越复杂。在当前 的技术水平下,256 级灰度的图像,颜色过渡已十分柔和,图像还原效果比 较令人满意。 资料显示,LED 光源比白炽灯节电 87%、比荧光灯节电 50%,而寿命比白 炽灯长 20~30 倍、比荧光灯长 10 倍。LED 光源因具有节能、环保、长寿命、安 全、响应快、体积小、色彩丰富、可控等系列独特优点,被认为是节电降能 耗的最佳实现途径。

2、8段LED原理

LED的7个字段分别称为a、b、c、d、e、f、g,有时还有一个小数点段h,图1(a)所示。通过7个(或8个)发光段的不同组合,显示0~9和A~F共16个字母数字,从而实现十六进制的显示。

为使7段显示器显示数字或字符,就需点亮相应的段,每个段分别由数据线进行控制,通常数据线D0~D7顺序控制a~h段,如图11-34(b)所示,所需的控制信号称为段码。

由于数字与段码之间没有规律性,因此必须进行数字与段码之间的转换以便显示数字。常用的转换方法是将要显示字形的段码列成一个表,称为段码表。显示时,根据字符查段码表,取出其对应的段码送到数据线上来控制显示。

edfgch(b) 8段对应的数据线abhD7gD6fD5eD4dD3cD2bD1aD0(a) 8段LED显示器外形3、点阵式LED原理

点阵式LED的显示单元一般由8行8列LED组成,其外形及内部连接如图3所示,可以再由这8行8列的LED拼成更大的LED阵列。点阵式LED显示器能显

3

示各种字符、汉字及图形、图像,并具有色彩。

点阵式LED中,每个LED表示一个像素,通过每个LED的亮与灭来构造出所需的图形,各种字符及汉字也是通过图形方式来显示的。对于单色点阵式LED,每个像素需要1位二进制数表示,1表示亮,0表示灭。对于彩色点阵式LED,则每个像素需要更多的二进制位表示,通常需要一个字节。

点阵式LED显示器的显示控制采用扫描方式,在数据存储器中开辟若干个存储单元作为显示缓冲区,缓冲区中存有所需显示图形的控制信息。显示时依次通过列信号驱动器输出一行所需所有列的信号,然后再驱动对应的行信号,控制该行显示。只要扫描速度适当,显示的图形就不会出现闪烁 7行0列(a) 点阵式LED外形…(b) 点阵式LED内部连接7列0行…

4、LED数码管电路图

其中各个引脚的功能在下面都有描述。

4

图1.LED数码管电路图

5、74HC273在开发板上的连接

74HC273 在 8 字数码管中开发板中的连接如下图所示:

图2. 开发板上的7段LED的连接

5

开发板设置2 个数码管,由74HC273 控制。74HC273是同步串行转并行的锁存器,在此通过SPI 总线和CPU 连接,锁存数据后驱动数码管发光。

图3. 开发板上点阵式LED的连接

四、实验部分

1、实验设备及工具

硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机 Pentium 500 以

上, 硬盘 10G 以上。

软件:PC 机操作系统 REDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境

2、实验基础

目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并

通过编写最简单的HelloWorld程序进行测试。由于实验都要依靠前面的配

6

置,本段只着重叙述实验的具体实现。

3、实验环境连接

(1)、建立工作目录

[root@zxt smile]# mkdir hello [root@zxt smile]# cd hello

(2)、编写程序源代码

用下面的命令来编写 hello.c 的源代码,进入 hello 目录使用 vi 命令来编辑代码:

[root@zxt hello]# vi hello.c

按“i ” 或者“a ” 进入编辑模式,将上面的代码录入进去,完成后按 Esc 键进入命令状态,再用命令“:wq” 保存并退出。这样我们便在当前目录下建立了一个名为 hello.c 的文件。

进入/arm2410cl/exp/basic/10_led 目录,使用 vi 编辑器或 其他编辑器阅读理解源代码

(3)、编译应用程序

运行 make 产生 test_led 可执行文件 test_led

(4)、编写Makefile (5)、编译应用程序

在 hello 目录下运行“make” 来编译我们的程序了。如果进行了修改,重 新编译则运行:

[root@zxt hello]# make clean [root@zxt hello]# make

(6)、下载调试

在宿主 PC 计算机上启动 NFS 服务,并设置好共享的目录,在建立好 NFS 共享目录以后,我们就可以进入 MINICOM 中建立开发板与宿主 PC 机之间的通讯了。 其步骤如下:

① 服务器设置,输入命令”setup”分别进行对系统服务及防火墙配置。

7

图1 服务器配置

② 为宿主PC机配置了NFS服务

NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。每次重启宿主PC机时,先输入命令”service portmap restart”和”service nfs restart”,以启动nfs服务。 ③ 启动vi编辑器查看网段

输入命令”Vi /etc/exports”查看网段为”192.168.0.*”,按键”ESC”,输入”: wp”存盘退出。

④ 重新启动NFS服务,输入”ifconfig eth0 192.168.0.110”完成主机IP地址设置。

8

图2 NFS服务器配置

⑤ 进入共享文件”cd /root/share/exp/basic/10_led”,输入”ls”查看10_led 下的两个.c文件。

输入”make clean”,”make”生成两个.0文件。转入超级终端

<1>硬件连接:连接宿主机和UP-TECH S2410/P270 DVP 嵌入式实验平台。 <2>打开宿主PC 机电源,进入 Linux操作系统。

(7)、启动实验平台

① 硬件连接: 连接电源,将12V电源线的连到UP-NETARM2410-CL的电源接口;连接串口线,一端连接PC的串口,另一端连接到UP-NETARM2410-CL的串口(RS232-0);连接网线,将随机附带的交叉网线把UP-NETARM2410-CL靠近于电源接口的网口和PC机的网口连接好。

② 建立超级终端:运行Windows系统下(以WindowsXP为例)开始→所有程序→附件→通讯→超级终端(HyperTerminal)。

③ 新建一个通信终端。如果要求输入区号、电话号码等信息请随意输入,出现如图所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮

9

图3 新建超级终端

④ 在接下来的对话框中选择ARM开发平台实际连接的PC机串口(如COM1),按确定后出现如图所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。按确定完成设置。完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC机串口和平台UART0正确连接后,就可以在超级终端上看到程序输出的信息了。

图4 超级终端端口设置

⑤ 启动实验平台 ::打开电源开关,系统会由VIVI开始引导。正常启动时会显示启动信息到“Press Return to start the LINUX now, any other key for vivi”,按

10

除回车键外的其它键则进入vivi控制台。

图5 启动超级终端平台

图6 超级终端命令输入

⑥ 输入”ping192.168.0.122”和”192.168.0.121”查看是否连通,若成功连接,”Ctrl+C”结束,在进行挂载后,查找根目录下的文件”cd /host/exp/basic/10_led”,通过“ls”查看文件,然后使用“insmod

11

s3c2410-led.o ”命令完成将一个可动态加载的模块加载到内核中。输入” lsmod” 显示当前内核加载的模块,输入命令”./test_led”进行程序测试。

图7 下位机运行

五、实验步骤

1、阅读理解源码

进入/arm2410cl/exp/basic/10_led 目录,使用 vi 编辑器或其他编辑器阅读理解源代码

2、编译应用程序

运行 make 产生 test_led 可执行文件 test_led [root@BC exp/basic]# cd 10_led [root@BC 10_led]# make

armv4l-unknown-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/home/kernel/linux-2.4.18-2410cl/include s3c2410-led.o

armv4l-unknown-linux-gcc -I.. -Wall -O -D__KERNEL__ -DMODULE

-I/home/kernel/linux-2.4.18-2410cl/include -c -o test_led.o test_led.c [root@BC 2410-Classics LED]# ls

Makefile readme s3c2410-led.c s3c2410-led.o test_led test_led.c

s3c2410-led.c

-o

12

test_led.o

3、下载调试

切换到 minicom 终端窗口,使用 NFS mount 开发主机的/arm2410cl 到/host 目录,然后进入/host/exp/basic/10_led 目录,用 insmod s3c2410-led.o 命令插入 led 驱动,并用 lsmod命令查看是否已经插入。 [/mnt/yaffs]mount -t nfs -o nolock 192.168.0.189:/arm2410cl /host [/host/exp/basic]cd 10_led/ [/host/exp/10_led]ls

Makefile readme s3c2410-led.c s3c2410-led.o test_led test_led.c test_led.o

[/host/exp/10_led]insmod s3c2410-led.o Using s3c2410-led.o

0-numeric tube : Dprintk device open s3c2410-hc273 initializedUsing exio.o [/host/exp/10_led]lsmod Module Size Used by Tainted: P s3c2410-led 2048 0 (unused) [/host/exp/10_led]./test_led

即可以看到8字数码管和点阵数码管工作。

13

六、结果分析

14

七、心得体会

通过做这次ARM嵌入式课程设计我深深的体会到,专心投入去完成一件事情是多么让人激动不已的,当某个环节的问题被你解决后,那种成就感能带给自己更大的信心和激发你对学习的热情,可能这是大学最后一个课程设计的原因,我把大量的精力和激情都投入到这次课程设计中,所以在整个学习过程中,我解决了一些平时没有碰到的问题,这更让我对技术这个行业产生强烈的兴趣,下面是我这两周的课程设计心得。

这次课程设计我们做的是在ARM嵌入式平台上通过LED显示不同的符号,这是一个具有挑战性的功课,我们组分完每个人的任务后,接下来查资料,设计,分析,和同学讨论,在电脑上用软件仿真,这几天,紧张而又充实。这次课程设计是对我所学知识的全面检验。我们在课堂上掌握的仅仅是专业基础课的理论面,如何去面对实际的设计是一个值得我们思考的问题,又如何把我们学的书本内容运用到实际中呢?我想做本次课程设计就给我们提供了良好的实践平台。在本次课程设计中我感触很深的就是要查阅很多指导书籍。在此次设计中,我学会了自上而下的系统设计思想,掌握了综合应用所学理论的能力,而且对我的毅力是个考验,我是连续将近两周周做下来的。对我而言,知识上的收获重要,精神上的丰收喜。挫折是一份财富,经历是一份拥有。此次课程设计将对我今后的进步产生积极影响。最后由衷感谢老师的指导,同学的帮助。

15

八、参考文献

【1】赵宏,曹洁.Linux系统指南.成都:西南交通大学出版社,2008

【2】张晓林,崔迎炜.嵌入式系统设计与实现。北京:北京航空航天大学出版社,2006

【3】杨刚.嵌入式基础实验教程.北京:北京大学出版社,2007

【4】陈文智.嵌入式系统开发原理与实践 .北京:清华大学出版社,2005 【5】杜春雷.ARM体系结构与编程.清华大学出版社,2007

【6】博创公司.2410经典实验指导书3.2.北京博创兴业科技有限公司,2007 【7】郑慕德.嵌入式微型计算机系统实例教程.北京:科学出版社,2006 【8】刘洪涛,孙天泽.嵌入式技术与设计.北京:人民邮电出版社,2009 【9】http://www.arm.com/chinese,2009.2.1 【10】http://www.arm.com,2009.8.6

【11】http://wwww.broadex-tech.com,2009.1.2

16

附录:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

/* debug macros */ //#undef DEBUG #define DEBUG #ifdef DEBUG

#define DPRINTK( x... ) printk(\ x) #else

#define DPRINTK( x... ) #endif

#define DEVICE_NAME \#define LED_TUBE_PHY_START 0x08000110 #define LED_DIG_PHY_START 0x08000100

17

#define LED_TUBE_IOCTRL 0x11 #define LED_DIG_IOCTRL 0x12

static int ledMajor = 0; #define LED_MINOR 1

#ifdef CONFIG_DEVFS_FS

static devfs_handle_t devfs_led_dir,devfs_led; #endif

static u32 s3c2410_led_tube_addr = IDE_BASE + 0x100; static u32 s3c2410_led_dig_vaddr = IDE_BASE + 0x110;

static int s3c2410_led_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned int arg) {

//printk(\

switch(cmd){

case LED_DIG_IOCTRL:

return *(volatile unsigned long *)s3c2410_led_dig_vaddr=(arg>>8) | arg << 16; ; default :

return printk(\); }

return 0; }

static ssize_t s3c2410_led_write(struct file *filp, const char *buf, size_t count, loff_t * f_pos) {

18

int i;

unsigned char mdata[16];

if (copy_from_user(mdata,buf,10)) { }

for (i=0;i<8;i++){

printk(\return -EFAULT;

//

// *((volatile unsigned char *)(s3c2410_led_tube_addr+i))=0xff;

*((volatile unsigned char

*)(s3c2410_led_tube_addr+i*2))=mdata[i]; //

printk(\

*)(s3c2410_led_tube_addr+i)));

}

// printk(\ return 0; }

static int s3c2410_led_open(struct inode *inode, struct file *filp) {

MOD_INC_USE_COUNT;

printk(\); return 0; }

static int s3c2410_led_release(struct inode *inode, struct file *filp) {

MOD_DEC_USE_COUNT;

printk(\); return 0; }

19

static struct file_operations s3c2410_led_fops = { owner:THIS_MODULE, open:s3c2410_led_open, ioctl:s3c2410_led_ioctl, write:s3c2410_led_write, release:s3c2410_led_release, };

int __init s3c2410_led_init(void) {

int ret;

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;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_led_fops); if (ret < 0) {

DPRINTK(DEVICE_NAME \); return ret; }

#ifdef CONFIG_DEVFS_FS

devfs_led_dir = devfs_mk_dir(NULL, \, NULL);

devfs_led = devfs_register(devfs_led_dir, \, DEVFS_FL_DEFAULT, ledMajor,LED_MINOR, S_IFCHR | S_IRUSR | S_IWUSR, &s3c2410_led_fops, NULL); #endif

GPACON|=(1<<12);

20

DPRINTK (DEVICE_NAME\); return 0; }

void __exit s3c2410_led_exit(void) {

#ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_led); devfs_unregister(devfs_led_dir);

#endif }

module_init(s3c2410_led_init); module_exit(s3c2410_led_exit);

unregister_chrdev(ledMajor, DEVICE_NAME);

21

#include #include #include #include #include #include ///#include

#define TUBE_IOCTROL 0x11 #define DOT_IOCTROL 0x12

void jmdelay(int n) { int i,j,k; for (i=0;i

int main() { int fd; int i,j,k;

unsigned int LEDWORD; unsigned int MLEDA[8]; unsigned char

LEDCODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char dd_data[16][10]={{0xff,0,0,0,0,0,0,0,0,0},

{0,0xff,0,0,0,0,0,0,0,0}, {0,0,0xff,0,0,0,0,0,0,0}, {0,0,0,0xff,0,0,0,0,0,0}, {0,0,0,0,0xff,0,0,0,0,0}, {0,0,0,0,0,0xff,0,0,0,0},

22

{0,0,0,0,0,0,0xff,0,0,0}, {0,0,0,0,0,0,0,0xff,0,0},

{0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0,0}, {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0,0}, {0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4,0,0}, {0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0,0},

{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0}, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0}, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0}, {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0,0},

\,O_RDWR); if (fd < 0) {

\); return (-1); \for (j=0;j<2;j++) for (i=0;i<10;i++) 23

);

};

fd=open( printf( }

LEDWORD=0xff00;

printf( LEDWORD=0xff00; ioctl(fd,0x12,LEDWORD); sleep(1);

{

LEDWORD=(LEDCODE[i]<<8)|LEDCODE[9-i]; ioctl(fd,0x12,LEDWORD); jmdelay(1500); }

printf(\);

sleep(1);

for (i=0;i<16;i++) { write(fd,dd_data[i],10);

jmdelay(1000);

}

while(1){

unsigned char a[10];

for (i=0;i<10;i++)

a[i] = rand() % 255;

write(fd,a,10);

jmdelay(500);

}

close(fd); return 0; }

24

printf(\);

sleep(1);

for (i=0;i<16;i++) { write(fd,dd_data[i],10);

jmdelay(1000);

}

while(1){

unsigned char a[10];

for (i=0;i<10;i++)

a[i] = rand() % 255;

write(fd,a,10);

jmdelay(500);

}

close(fd); return 0; }

24

本文来源:https://www.bwwdw.com/article/jy8p.html

Top