嵌入式系统原理与设计实验报告.docx
- 文档编号:28872770
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:24
- 大小:428.74KB
嵌入式系统原理与设计实验报告.docx
《嵌入式系统原理与设计实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统原理与设计实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
嵌入式系统原理与设计实验报告
嵌入式系统实验报告
指导教师:
学科专业:
班级:
学号:
姓名:
2014年6月
前言
从20世纪七十年代单片机的出现到各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史,并在全世界各行业得到广泛应用。
嵌入式系统产品的研制与应用已经成为我国信息化带动工业化、工业化促进信息化发展的新的国民经济增长点。
经过几十年的发展,嵌入式系统已经在很大程度改变了人们的生活、工作与娱乐方式,而且这些改变还在加速。
嵌入式系统具有无数的种类,每类都具有自己独特的个性。
例如,MP3、数码相机与打印机就有很大的不同。
汽车中更就是具有多个嵌入式系统,使汽车更轻快、更干净、更容易驾驶,机顶盒、高清电视、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等,都就是典型的嵌入式系统。
事实上,几乎所有带有一点“智能”的家电(全自动洗衣机、电脑电饭煲…)都就是嵌入式系统。
嵌入式系统广泛的适应能力与多样性,使得视听、工作场所甚至健身设备中到处都有嵌入式系统。
高端的嵌入式系统与工业软件的发展,实际上与我们对该行业最先进的科学技术前沿的掌握有关,换言之,与我国该行业的科学技术水平有关。
学习与研究嵌入式系统,具有重大意义。
这学期的嵌入式系统的学习过程中我们在2410RP这一实验开发平台上进行了诸多嵌入式的基础实验。
在本报告中,将把其中两个具有代表性的实验的原理、内容、结果以及驱动与测试程序写出来。
目录
实验一数码管显示
1、1实验目的
学习串并转换的相关知识,并编写驱动程序。
1、2实验内容
1)了解数码管显示的工作原理;
2)掌握数码管驱动的编写及测试过程;
3)对zlg7289A的驱动程序进行编写;
4)驱动数码管并显示个人学号。
1、3实验原理
1、3、1LED的发光原理
LED(LightEmittingDiode),即发光二极管。
就是一种半导体固体发光器件。
它就是利用固体半导体置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。
发光二极管的核心部分就是由p型半导体与n型半导体组成的晶片,如图所示,在p型半导体与n型半导体之间有一个过渡层,称为p-n结。
在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。
PN结加反向电压,少数载流子难以注入,故不发光。
这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。
当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。
图1-1LED发光原理图
1、3、2八段LED显示器
八段LED显示器由8个发光二极管组成,如图1-2、图1-3所示。
基中7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。
LED显示器有两种不同的形式:
一种就是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种就是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。
共阴与共阳结构的LED显示器各笔划段名与安排位置就是相同的。
当二极管导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。
8个笔划段hgfedcba对应于一个字节(8位)的D7D6D5D4D3D2D1D0,于就是用8位二进制码就可以表示欲显示字符的字形代码。
例如,对于共阴LED显示器,当共阴极接地(为零电平),而阳极hgfedcba各段为0111011时,显示器显示"P"字符,即对于共阴极LED显示器,“P”字符的字形码就是73H。
如果就是共阳LED显示器,共阳极接高电平,显示“P”字符的字形代码应为10001100(8CH)。
这里必须注意的就是:
很多产品为方便接线,常不按规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了。
图1-2LED数码管组成图
图1-3LED数码管原理图
1、3、3芯片zlg7289A的介绍
zlg7289A就是一片具有串行接口的可同时驱动8位共阴式数码管或64只独立LED的智能显示驱动芯片该芯片同时还可连接多达64键的键盘矩阵单片即可完成LED显示﹑键盘接口的全部功能。
zlg7289A内部含有译码器可直接接受BCD码或16进制码并同时具有2种译码方式参瞧后文此外还具有多种控制指令如消隐﹑闪烁﹑左移﹑右移﹑段寻址等zlg7289A具有片选信号可方便地实现多于8位的显示或多于64键的键盘接口。
芯片zlg7289A的典型应用:
仪器仪表、工业控制器、条形显示器、控制面板。
芯片zlg7289A的特点:
1)串行接口无需外围元件可直接驱动LED;
2)各位独立控制译码/不译码及消隐与闪烁属性;
3))循环左移/循环右移指令;
4)具有段寻址指令方便控制独立LED;
5)64键键盘控制器内含去抖动电路。
1、3、4数码管的连接电路
图1-4数码管连接电路
1、4实验步骤
1)连接号宿主PC机与一台S3C2410-RP目标板;
2)编写数码管驱动程序spi_led、c文件;
3)启动系统终端设置S3C2410-RP目标板的地址;
4)将宿主PC机的根目录挂载到S3C2410-RP目标板的mnt目录下;
5)加载驱动程序;
6)执行并测试程序。
1、5实验源代码解释与说明
A、头文件keypad、h
#ifndef__KEYPAD_H__
#define__KEYPAD_H__
//Keypad扫描码
#defineKEYPADNUMLK0x33
#defineKEYPADDIV0x34
#defineKEYPADMUL0x35
#defineKEYPADSUB0x3d
#defineKEYPADADD0x2e
#defineKEYPADENTER0x1e
#defineKEYPADDOT0x15//DEL
#defineKEYPAD00x14//INS
#defineKEYPAD10x1b//END
#defineKEYPAD20x1c//DOWN
#defineKEYPAD30x1d//PDN
#defineKEYPAD40x23//LEFT
#defineKEYPAD50x24
#defineKEYPAD60x25//RIGHT
#defineKEYPAD70x2b//HOME
#defineKEYPAD80x2c//UP
#defineKEYPAD90x2d//PUP
#endif
头文件定义了嵌入式开发板上输入键盘各个按键的逻辑地址。
B、驱动程序源文件spi_led、c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//------------------------------------------------------------------------------
#defineHR_DEBUG1
//------------------------------------------------------------------------------
#defineIRQ_spi_led_INTIRQ_EINT4
#defineGPIO_SimpleINT_EINT4(GPIO_MODE_ALT0|GPIO_PULLUP_EN|GPIO_F4)
#defineONEBIT0x1
#defineKEYPADCSDIS(GPGDAT|=(ONEBIT<<3))
#defineKEYPADCSEN(GPGDAT&=~(ONEBIT<<3))
#defineKEYPADDIRMO(GPBDAT&=~(ONEBIT<<0))
#defineKEYPADDIRMI(GPBDAT|=(ONEBIT<<0))
#definespi_led_MAJOR104//定义led_ary_MAJOR设备的主设备号
devfs_handle_tspi_led_handle;//系统支持devfs的数据结构
intspi_led_temp_count=0;//定义的系统全局变量,防止文件被多重打开
staticintDELAY_TIME=100;//时间延迟为100
intputcToKBCTL(u8c)
{
u32i;
KEYPADCSEN;
KEYPADDIRMO;
udelay(60);
while((SPSTA1&ONEBIT)==0);//waitwhilebusy
SPTDAT1=c;//writeleftjustifieddata
while((SPSTA1&ONEBIT)==0);//waitwhilebusy
KEYPADCSDIS;
i=SPRDAT1;
return(i);
}//功能概要:
将所给数据写入指定的寄存器中
intspi_ledInit()
{
intt;
chardummy=(char)0xff;
printk("GPGCON=%x\n",GPGCON);
GPGCON&=~((0x3<<6)|(0x3<10)|(0x3<<12)|(0x3<<14));
GPGCON|=((0x1<<6)|(0x3<10)|(0x3<<12)|(0x3<<14));
printk("GPGCON=%x\n",GPGCON);
KEYPADCSDIS;//设置为高电平
//setupDirsignal(KEYBOARD)CPU->7289
GPBCON&=~(0x3<<0);//清除GPB0端口数据
GPBCON|=(ONEBIT<<0);//设置端口GPB0用于_PWR_OK信号输出
//rGPDDAT&=~(ONEBIT<<0);//将_PWR_OKt置0
KEYPADDIRMO;//设置SPI(串行外设接口)寄存器
//中断模式,可用分频,主模式,高电平时钟,形式B,正常模式
//rSPCON1=(ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1);
//查询模式,可用分频,主模式,高电平时钟,形式A,正常模式
SPCON1=(0<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(0<<1);
/*开发者必须根据PCLK时钟的变化正确地调节分频器的值*/
SPPRE1=255;
/*99、121K=203M/4/2/(255+1)PCLK=50、75Mhz
FCLK=203MhzSPICLK=99、121Khz*/
putcToKBCTL(0xbf);//传送初始化指令
printk("KeyPadInitcomplete:
\n");//显示键盘初始化成功
putcToKBCTL(0xc8);//第一个数码管的地址为0xc8
putcToKBCTL(0x01);//设置第一个数码管显示的数值为1
KEYPADCSDIS;
putcToKBCTL(0xc9);//第二个数码管的地址为0xc9
putcToKBCTL(0x02);//设置第二个数码管显示的数值为2
KEYPADCSDIS;
putcToKBCTL(0xca);//第三个数码管的地址为0xca
putcToKBCTL(0x09);//设置第三个数码管显示的数值为9
KEYPADCSDIS;
putcToKBCTL(0xcb);//第三个数码管的地址为0xcb
putcToKBCTL(0x00);//设置第三个数码管显示的数值为0
KEYPADCSDIS;
return
(1);
}//函数实现LED数码管的初始化,返回值为1时,则完成系统初始化
u8readKBValue(void)
{
unsignedchari;
KEYPADCSEN;
KEYPADDIRMO;
udelay(60);
while((SPSTA1&ONEBIT)==0);//waitwhilebusy
SPTDAT1=0x15;//传送读取键值的命令
while((SPSTA1&ONEBIT)==0);//waitwhilebusy
udelay(30);//delay30us
KEYPADDIRMI;
SPTDAT1=0xff;//传送读取键值的命令
while((SPSTA1&ONEBIT)==0);//waitwhilebusy
i=SPRDAT1;
//printk("%x\n",i);
KEYPADCSDIS;
KEYPADDIRMO;
return(i);
}//函数实现的主要功能为读取键盘输入的值。
ssize_tspi_led_read(structfile**buf,size_tcount,loff_t*f_ops)
{
returncount;
}
//函数返回:
读取数据的长度count。
//功能概要:
对字符性设备进行读操作
/*===========SimpleDWrite=======================*/
ssize_tspi_led_write(structfile*char*buf,size_tcount,loff_t*f_ops)
{
printk("s3c2410:
deviceoperation!
\n");
returncount;
}
//函数返回:
写入数据的长度count。
//功能概要:
对字符性设备进行写入操作
/*===========SimpleDIoctl=======================*/
ssize_tspi_led_ioctl(structinode*inode,structfile*file,
unsignedintcmd,longdata)
{
printk("s3c2410:
deviceioctloperation!
\n");
}//函数可重新定义用来I/O口的其她控制操作
/*============SimpleDdeviceopen==============*/
ssize_tspi_led_open(structinode*inode,structfile*file)
{
return0;
}//当用户态调用函数时,对应内核态次函数被调用
/*============SimpleDdeviceclose=============*/
ssize_tspi_led_release(structinode*inode,structfile*file)
{
return0;
}//定义内核态release函数,当用户态调用close函数时,release函数被调用
structspi_led_ops={
open:
spi_led_open,
read:
spi_led_read,
write:
spi_led_write,
ioctl:
spi_led_ioctl,
release:
spi_led_release,
};
//结构体在头文件linux/fs、h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针
staticvoidIRQ_spi_led_interrupt(intnr,void*devid,structpt_regs*regs)
{
u8ui8ScanCode;
ui8ScanCode=readKBValue();
//HR_del_pre_scancode(ui8ScanCode);
}//定义静态函数IRQ_spi_led_interrupt,请求中断
staticint__initHW_spi_led_init(void)
{
intret=-ENODEV;
intdelay;
set_external_irq(IRQ_spi_led_INT,EXT_FALLING_EDGE,GPIO_PULLUP_EN);
set_gpio_ctrl(GPIO_SimpleINT_EINT4);
ret=request_irq(IRQ_spi_led_INT,IRQ_spi_led_interrupt,SA_INTERRUPT,
"spi_led",NULL);
if(ret){
printk(KERN_INFO"requestSimpleINTIRQfailed(%d)\n",IRQ_spi_led_INT);
returnret;
}
ret=devfs_register_chrdev(spi_led_MAJOR,"spi_led",&spi_led_ops);
if(ret<0){
printk("s3c2410:
init_modulefailedwith%d\n",ret);
returnret;
}
else
{
printk(KERN_INFO"S3c2410spi_ledregistersuccess!
!
!
\n");
;
}
spi_led_handle=devfs_register(NULL,"spi_led",DEVFS_FL_DEFAULT,
spi_led_MAJOR,0,S_IFCHR,&spi_led_ops,NULL);
//-------------------------------------------------------------------
spi_ledInit();
//-------------------------------------------------------------------
returnret;
}//用于驱动程序进行硬件设备初始化
int__inits3c2410_spi_led_init(void){
intret=-ENODEV;
ret=HW_spi_led_init();
if(ret)
returnret;
return0;
}//模块初始化,程序由此开始执行,此函数被module_init()调用
intinit_module()
{
s3c2410_spi_led_init();
}//此函数在insmod加载此模块驱动的时候自动调用。
负责进行设备驱动程序初始化工作、init_module返回0以表示初始化成功。
返回负数表示失败。
voidcleanup_module()
{
devfs_unregister_chrdev(spi_led_MAJOR,"spi_led");
devfs_unregister(spi_led_handle);
free_irq(IRQ_spi_led_INT,NULL);
}//此函数在卸载此模块驱动时调用。
负责进行设备驱动程序的清除工作
1、6总结
通过本次实验,我学习到一些Linux系统常用的操作命令,了解了LED数码管工作的原理。
同时,对嵌入式系统有了更明确的了解与认识。
通过实验中的实际操作,也体验了基于嵌入式开发的基本流程。
在老师的指导下,完成了对LED数码管的显示控制,显示得到了自己学号的后四位1290。
实验二LED点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 原理 设计 实验 报告