第一篇:2018东南大学自动化学院微机实验6、7实验报告
《微机实验及课程设计》实验报告
学号
08
东南大学
《微机系统与接口(含实验)》
实验报告
实验六
8255 并行输入输出
实验七
串行通信
姓
名:
学
号:
08
专
业:
实 验 室:
金智楼516
实验时间: 2018年05月08日
报告时间: 2018年06月03日
评定成绩:
审阅教师:
《微机实验及课程设计》实验报告
学号
08
一.实验目的与内容
1.实验目的:
(1)掌握 8255 方式 0 的工作原理及使用方法,利用直接输入输出进行控制显示;(2)掌握 8 段数码管的动态刷新显示控制;
(3)分析掌握 8255 工作方式1时的使用及编程,进一步掌握中断处理程序的编写。(4)了解串行通信的基本原理,认识串行收发过程;(5)掌握串行接口芯片 8251 的工作原理和编程方法。
2.实验内容:
(1)实验六 8255 并行输入输出
基本实验内容和要求 1)8255方式0:简单输入输出
实验电路如图3.7-1,8255C口输入接逻辑电平开关K0~K7,编程A口输出接LED显示电路L0~L7;用指令从C口输入数据,再从A口输出。注意实验箱中的8255既引出了A、B、C口引脚排线,也提供了PA0-PA7,PB0-PB7,PC0-PC7的信号连接孔,成组开关、数码管,8段LED显示器也如此,可根据需要设计选用。
推荐接线:
8255/JP8(PC7---PC0)8255/JP6(PA7---PA0)8255/CS
接逻辑开关/JP1(K7---K0)接LED显示/JP2(L7---L0)接I/O译码/Y1(288H---28FH)2)编程将 A 口 L0-L7 控制成流水灯,流水间隔时间由软件产生;流水方向由 K0 键在线控制,随时 可切换;流水间隔时间也可由 K4~K7 键编码控制,如 0000 对应停止,0001 对应 1 秒,1111 对应 15 秒, 大键盘输入 ESC 键退出。8段数码管。
3)8段数码管静态显示:按图 3.7-3 连接好电路,将 8255 的 A 口 PA0~PA6(JP6)分别与七段
《微机实验及课程设计》实验报告
学号
08
数码 管的段码驱动输入端 a~DP 相连(JP3),位码驱动输入端 S1 接+5V(选中),S0 接地(关闭)。编程从键盘 输入一位十进制数字(0~9),在七段数码管上显示出来。
4)8段数码管动态显示:按图 3.7-4 连接好电路,七段数码管段码连接不变,位码驱动输入端 S1、S0 接 8255 C 口的 PC1、PC0。编程在两个数码管上显示“56”。(注意字符变换之间应使段位全灭,避免显 示“影子”)
(2)实验七 串行通信 基本实验内容和要求
1)按图 3.8-1 连接好电路,其中 8254 计数器用于产生 8251 的发送和接收时钟,TXD 和 RXD 直接相连(注意: 实验系统未采用 MC1488/1489 或 ICL232 等长线收发器,故有关 RS232/422 等电平标准及转 换内容可自行参考相关资料);
2)编写测试程序,初始化 8251,实现连续发送固定字符,用示波器观察发送波形,试用多种不同字符格式和字符。
《微机实验及课程设计》实验报告
学号
08
3)编程实现从键盘输入一个字符, 将其 ASCII 码加 1 后发送出去,再接收回来在屏幕上显示,实现自发自收。
《微机实验及课程设计》实验报告
学号
08
二.基本实验原理
(1)实验六 8255并行输入输出
1)实验箱上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
2)七段数码管的字型代码表如表 3.7-1:
3)参考流程图(图3.7-5,3.7-6)
《微机实验及课程设计》实验报告
学号
08
(2)实验七 串行通信
编程提示
1)图 3.8-1 电路 8251 的控制口地址为 2B9H,数据口地址为 2B8H。
2)8253 计数器的计数初值= 时钟频率 /(波特率× 波特率因子),这里的时钟频率接脉冲源1MHz,波特率若选 1200,波特率因子若选16,则计数器初值为52。
4)收发采用查询方式,参考流程图(见图 3.8-2)6
《微机实验及课程设计》实验报告
学号
08
《微机实验及课程设计》实验报告
学号
08
三.方案实现与测试
1.实验六 8255并行输入输出
(1)8255方式0:简单输入输出
实验电路如图3.7-1,8255C口输入接逻辑电平开关K0~K7,编程A口输出接LED显示电路L0~L7;用指令从C口输入数据,再从A口输出。
推荐接线:
8255/JP8(PC7---PC0)8255/JP6(PA7---PA0)8255/CS
接逻辑开关/JP1(K7---K0)接LED显示/JP2(L7---L0)接I/O译码/Y1(288H---28FH)1)按照上图所示电路搭接电路,接线图如下:
2)在纯DOS或者桌面上的TPC集成开发环境中编译运行如下代码:
8255 简单输入输出(程序名:8255_io.asm)
8255 控制寄存器端口地址 28BH A 口的地址 288H
《微机实验及课程设计》实验报告
学号
08
C 口的地址 28AH ioport equ 3100h-0280h;tpc 卡中设备的 I/O 地址 io8255a equ ioport+288h io8255c equ ioport+28ah
;8255A 口地址;8255C 口地址
io8255k equ ioport+28bh;8255 控制寄存器端口地址 stacks segment stack db 100 dup(?)stacks ends code segment assume cs:code,ss:stacks main proc far start: mov ax,stacks
mov ss,ax mov dx,io8255k;设 8255 为 C 口输入,A 口输出 mov al,8bh out dx,al inout: mov dx,io8255c;从 C 口输入一数据
in al,dx mov dx,io8255a;从 A 口输出刚才自 C 口所输入的数据 out dx,al mov dl,0ffh;判断是否有按键 mov ah,06h int 21h jz inout;若无,则继续自 C 口输入,A 口输出
mov ah,4ch;否则返回 DOS 操作系统 int 21h main endp code ends end start 3)实验结果记录如下图所示:
《微机实验及课程设计》实验报告
学号
08
(2)8段数码管静态显示实验
1)按图下图连接好电路,将 8255 的 A 口 PA0~PA6(JP6)分别与七段数码 管的段码驱动输入端 a~DP 相连(JP3),位码驱动输入端 S1 接+5V(选中),S0 接地(关闭)。
2)在纯DOS或者桌面上的TPC集成开发环境中编译运行如下代码:
8255_led_s.asm源程序: data segment ioport io8255a io8255b equ 3100h-0280h equ 288h equ 28bh led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,0ah,'Input a num(0--9h):',0dh,0ah,'$' data ends stacks segment stack
《微机实验及课程设计》实验报告
学号
08
db 100 dup(?)stacks ends code segment assume cs:code,ds:data,ss:stacks start: mov ax,stacks
mov ss,ax mov ax,data mov ds,ax mov dx,io8255b;使8255的A口为输出方式 mov ax,80h out dx,al sss: mov dx,offset mesg1;显示提示信息
mov ah,09h int 21h mov ah,01;从键盘接收字符 int 21h cmp al,'0';是否小于0 jl exit;若是则退出 cmp al,'9';是否大于9 jg exit;若是则退出
sub al,30h;将所得字符的ASCII码减30H mov bx,offset led;bx为数码表的起始地址 xlat;求出相应的段码 mov dx,io8255a;从8255的A口输出 out dx,al jmp sss;转SSS exit: mov ah,4ch;返回DOS int 21h code ends end start
3)实验现象记录如下:
《微机实验及课程设计》实验报告
学号
08
(3)8段数码管动态显示实验
1)按图下图所示电路搭接好电路,七段数码管段码连接不变,位码驱动输入端 S1、S0 接 8255 C 口的 PC1、PC0。编程在两个数码管上显示“56”。(注意字符变换之间应使段位全灭,避免显示“影子”)
2)在纯DOS或者桌面上的TPC集成开发环境中编译运行如下代码:
8255 动态显示‘56’参考程序(程序名:8255_led_d.asm)data segment ioport equ 3100h-0280h io8255a equ ioport+288h io8255c equ ioport+28ah io8255k equ ioport+28bh
;tpc 卡中设备的 I/O 地址;8255A 口地址;8255C 口地址
;8255 控制寄存器端口地址
《微机实验及课程设计》实验报告
学号
08
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码 buffer1 db 5,6 bz dw ? data ends stacks segment stack db 100 dup(?)
;存放要显示的个位和十位
;位码
stacks ends code segment assume cs:code,ss:stacks,ds:data start: mov ax,stacks
mov ss,ax mov ax,data mov ds,ax mov dx,io8255k;将 8255 设为 A 口输出 mov al,80h out dx,al mov di,offset buffer1;设 di 为显示缓冲区
loop2: mov bh,02 lll:
mov al,0
;送全灭段码
mov dx,io8255a;自 8255A 口输出 out dx,al mov byte ptr bz,bh push di dec di add di, bz mov bl,[di];bl 为要显示的数 pop di mov bh,0 mov si,offset led;置 LED 数码表偏移地址为 SI add si,bx;求出对应的 LED 数码 mov al,byte ptr [si] mov dx,io8255a;自 8255A 口输出 out dx,al mov al,byte ptr bz;使相应的数码管亮 mov dx,io8255c 13
《微机实验及课程设计》实验报告
学号
08
out dx,al mov cx,3000 delay: loop delay;延时
mov bh,byte ptr bz shr bh,1 jnz lll mov dx,0ffh mov ah,06 int 21h je loop2;有键按下则退出
mov dx,io8255c mov al,0 out dx,al mov ah,4ch;返回 DOS 操作系统 int 21h;关掉数码管显示
code ends end start
3)实验结果记录如下:
《微机实验及课程设计》实验报告
学号
08
2.实验七 串行通信
基本实验内容和要求
1)按图 3.8-1 连接好电路,其中 8254 计数器用于产生 8251 的发送和接收时钟,TXD 和 RXD 直接相连
2)在纯DOS或者桌面上的TPC集成开发环境中编译运行如下代码:
参考程序:程序名:8251.asm data segment ioport equ 3100h-0280h io8253a equ ioport+280h io8253b equ ioport+283h io8251a equ ioport+2b8h io8251b equ ioport+2b9h mes2 dd mes1 data ends stacks segment stack db 100 dup(?)stacks ends code segment assume cs:code,ds:data,ss:stacks main proc far start: mov ax,stacks
;tpc 卡中设备的 io 地址;计数器 0 地址;8253 控制寄存器地址;8251 数据口地址;8251 控制口地址
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h mov ss,ax
《微机实验及课程设计》实验报告
学号
08
mov ax,data mov ds,ax mov dx,io8253b;设置 8253 计数器 0 工作方式 mov al,16h out dx,al mov dx,io8253a mov al,52;给 8253 计数器 0 送初值 out dx,al mov dx,io8251b;初始化 8251 xor al,al mov cx,03;向 8251 控制端口送 3 个 0 loop delay mov al,40h;向 8251 控制端口送 40H,使其复位 call out1 mov al,4eh;设置为 1 个停止位,8 个数据位 call out1;波特率因子为 16 mov al,27h;向 8251 送控制字允许其发送和接收 call out1 lds dx,mes2;显示提示信息 mov ah,09 int 21h in al,dx test al,01;发送是否准备好 jz waiti mov ah,01;是,从键盘上读一字符 int 21h cmp al,27;若为 ESC,结束 jz exit mov dx,io8251a inc al out dx,al;发送 mov cx,0F00h
;延时
next: mov dx,io8251b in al,dx test al,02;检查接收是否准备好 jz next in al,dx;没有,等待;准备好,接收 delay: call out1 waiti: mov dx,io8251b s51: loop s51 mov dx,io8251a
《微机实验及课程设计》实验报告
学号
08
inc al mov dl,al;如果需要处理,如加 1 mov ah,02;将接收到的字符显示在屏幕上 int 21h jmp waiti int 21h
;向外发送一字节的子程序 exit: mov ah,4ch;退出 main endp out1 proc near
out dx,al push cx mov cx,0F00h;延时
pop cx ret gg: loop gg out1 endp code ends end start
3)实验现象:输入1,回显3,因为发时加1,接受时又加1。
修改代码,持续输入55,用示波器观察发送发送过程和波特率,删掉源码中接受和发送部分,在原发送部分加如下代码:
out2: mov al,55h mov dx,io8251a out dx,al mov cx,0f00h 实验现象:
每16次RCLK脉冲对应一个数据位。
《微机实验及课程设计》实验报告
学号
08
四.提高与创新研究
略
五.分析与总结
通过这两次实验,我大致了解并掌握了 8255三种方式的工作原理及使用方法以及利用它直接输入输出进行控制显示的方法,掌握了8段数码管的动态刷新显示控制方法;进一步掌握了中断处理程序的编写,了解串行通信的基本原理,深入认识了串行收发过程,掌握了串行接口芯片 8251 的工作原理和编程方法,特别是对8255的A组控制,B组控制以及8255控制字有了更加深入的理解
第二篇:【微机实验】2018东南大学微型计算机原理及应用实验二
实验二 基本算术和逻辑运算
学院:信息科学与工程学院
姓名:周信元
学号:04016523 实验日期:2018.4.4
一、实验目的
1.熟悉算术和逻辑运算指令的功能。
2.进一步了解标志寄存器各标志位的意义和指令执行对它的影响。
二、实验任务
1.采用单步执行方式执行下列各程序段,检查各标志位的情况。
程序段1 MOV AX, 10101H MOV SI, 2000H ADD AL, 30H ADD AX, SI
;AX=1010H
;SI=2000H
;AX=1040H
;AX=3040H;BX=03FFH MOV BX, 03FFH ADD AX, BX
;AX=343FH;DS:[0020]=1000H;DS:[0020]=443FH MOV[0020],1000H ADD 0020, AX 程序段2: MOV AX, OA0AOIH ADO AX, OFFFFH
;AX=A0A0H;AX=A09FH MOV CX, OFFOOH ADD AX, CX SUB AX, AX INC AX
;CX=FF00H;AX=9F9FH
;AX=0000H
;AX=0001H
;CX=FFFFH OR CX, OOFFH AND CX, OFOFH M0V[0010],CX 程序段3: MOV BL, 25H MO[0010],04H MOV AL, [0010] MUL BL 程序段4: MOV BL, 04H
;CX=0F0FH;DS:[0010]=OFOFH
;BX=0025H;DS:[0010]=04H
;AX=0004H
;AX=0094H
;BX=0004H MOV WORD PTR L0010], 0080H;DS:[0010]=0080H MOV AX, [0010] DIV BL 程序段5: MOV AX, 00 DEC AX
;AX=0000H;AX=FFFFH
;AX=3FFEH
;AX=0080H;AX=0020H ADC AX, 3FFFH ADD AX, AX
;AX=7FFCH NOT AX SUB AX, 3
;AX=8003H;AX=8000H
;AX=FBFDH OR AX, OFEFDH AND AX, OAFCFH SHL AX, 1 RCL AX, 1 步骤
;AX=ABCDH;AX=579AH;AX=AF35H(1)进入 Turbo Debugger,在CPU窗口下输入程序段 2)将IP指针指向程序段开始处(3)按下F7键(单步)运行程序。
(4)分析各条指令执行后的结果与各标志位在指令执行后对它的影响
2.将寄存器BⅨ作地址指针,自BX所指的内存单元(0010HD)开始连续存放着三个无符号数(10H、04H、30H),。试编写程序分别求它们的和与积,并将结果存放在这三个数之后的单元中。
求和程序段
MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV BX, 0010H MOV AL, BXI ADD AL, [BX+1] ADD Al, [BX+2] MOV [BX+3], AL 结果[DS:0013]=44H 求积程序段
MOV[0010],10H MOV[0011],04H MOV[0012],30H SUB AX, AX MOV A1,[0010] MOV BL, [0011 MUL BL MOV BL, [0012] MUL BL MOV [0013], AX 结果[DS:0013=0C00H 3.写出完成下述功能的程序段(1)传送15H到AL寄存器。(2)将L的内容乘以2(3)传送15H到L寄存器 4)AL的内容乘以BL的内容。最后结果(AX)=?
MOV AL, 15H SHL AL, 1 MOV BL, 15H MUL BL 结果(AX)=0372H 4.写出完成下述功能的程序段
(1)从地址DS:0000H单元中,传送一个数据58H到AL寄存器。(2)把AL寄存器的内容右移两位
(3)再把L寄存器的内容与字节单元DS:0001H中的数据12H相乘。(4)将乘积存入字单元DS:0002H中
M0V[0000],58H MOV[0001],12H MOV AL, [0000] SHR AL, 02 MOV BL, [0001] MUL BL MOV [0002], AX 结果[0002]=018CH 5.假设下面的程序段用来清除数据段中相应字存储单元的内容(即零送到这些存储 单元中去),其偏移地址从0010H到0020H(1)将第4条比较指令语句填写完整(划线处)MOV SI, 0010H NEXT: MOV WORD PTR[SI].00 ADD SI, 0022H CMP SI, INE NEXT(2)假设要清除偏移地址从0020H到001字存储单元中的内容(即由高地址到 低地址清零),试编写程序段。
MOV SI, 0020H NEXT MOV WORD PTR[S1], 00 SUB SI, 2 CMP SI, 000EH JNE NEXT
三,实验设备
IBM-TC/XT微机一台
四、实验预习要求
1.复习8086指令系统的算术和逻辑运算指令 2,按照题目要求在实验前编写好程序
五、实验报告要求
1.整理出运行正确的各题源程序段和结果, 2.,简要说明ADD指今和AND指令对标志位的影响。
1.见报告中加粗文字部分
2.普通加法指令ADD,指令格式:ADD Reg/mem,Reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF 逻辑与操作指令AND,指令的格式: AND Reg/Mem, Reg/Mem/imm受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
第三篇:微机实验报告数模转换器和模数转换器实验
实
验
报
告
课程名称
微机接口与汇编语言
实验项目
实验五
数/模转换器和模/数转换器实验
实验仪器 TPC-USB通用微机接口实验系统
系 别 计算机学院
专 业
班级/学号
学生姓名 实验日期 2013.12.19 成 绩 指导教师
胡信裕
实验五 数/模转换器和模/数转换器实验
一、实验目的
1.了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法。2.了解模/数转换器的基本原理,掌握ADC0809的使用方法。二.实验设备
1.PC微机系统一套
2.TPC-USB通用微机接口实验系统 一套 三.实验要求
1.实验前要作好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。
2.熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)使用方法。在程序调试过程中,有意识地了解并掌握TPC-USB通用微机接口实验系统的软硬件环境及使用,掌握程序的调试及运行的方法技巧。3.实验前仔细阅读理解教材相关章节的相关内容,实验时必须携带教材及实验讲义。四.实验内容及步骤
(一)数/模转换器实验
1.实验电路原理如图:DAC0832采用单缓冲方式,具有单双极性输入端(图中的Ua、Ub),编程产生以下锯齿波(从Ua和Ub输出,用示波器观察)
参考电路图
2.8位D/A转换器DAC0832的口地址为290H,输入数据与输出电压的关系为:
(UREF表示参考电压,N表示数数据),这里的参考电压为PC机的+5V电源。
3.产生锯齿波只须将输出到DAC0832的数据由0循环递增。4.参考流程图:
参考流程图
(二)模/数转换器
1.实验电路原理图如图。
将
(一)的DAC的输出Ua,送入ADC0809通道1(IN1)。
连接参考电路图
2.编程采集IN1输入的电压,在屏幕上显示出转换后的数据(用16进制数)。3.ADC0809的IN0口地址为298H,IN1口地址为299H。4.IN0单极性输入电压与转换后数字的关系为:
其中Ui为输入电压,UREF为参考电压,这里的参考电压为PC机的+5V电源。
4.一次A/D转换的程序可以为
MOV DX,口地址 OUT DX,AL
;启动转换
;延时
IN AL,DX
;读取转换结果放在AL中
五、实验程序设计和调试运行
1、程序设计
实验一:(生成的是锯齿波)io0832a
equ 290h(a)主程序
参考流程图
(b)显示子程序 code segment assume cs:code start: mov cl,0 mov dx,io0832a lll:
mov al,cl out dx,al inc cl
;cl加1 inc cl inc cl inc cl inc cl inc cl inc cl push dx mov ah,06h
;判断是否有键按下
mov dl,0ffh int 21h pop dx jz lll
;若无则转LLL mov ah,4ch
;返回
int 21h code ends end start
实验二 :(生成正弦波)DATA SEGMENT IO0832A EQU 290H SIN DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDH DB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96H DB 80H,66H,4EH,38H,25H,15H,09H,04H DB 00H,04H,09H,15H,25H,38H,4EH,66H
;正弦波数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
;置正弦波数据的偏移地址为SI,LL:MOV SI,OFFSET SIN
;一组输出32个数据
MOV BH,32
;将数据输出到D/A转换器
LLL:MOV AL,[SI]
MOV DX,IO0832A
OUT DX,AL
MOV AH,06H
MOV DL,0FFH
INT 21H
JNE EXIT
MOV CX,1 DELAY:LOOP DELAY INC SI DEC BH JNZ LLL JMP LL EXIT:MOV AH,4CH INT 21H CODE ENDS END START
2.实验过程(步骤)和实验结果说明
(1)按图连接实验电路;
(2)在TPC-IDE操作环境下,用文本编辑器编辑实验源程序(EXP5.asm);(3)在IDE操作环境下,对源程序(EXP5.asm)进行编译和连接,生成生成链接文件(EXP5.obj)和可执行文件(EXP5.exe);
(4)运行IDE操作环境下的调试命令,调试可执行文件(EXP5.exe);
(5)运行IDE操作环境下的执行命令,运行可执行文件(EXP5.exe),结果显示为:
运行成功后,可以从示波器中看到相应的波形,通过调节示波器,波形会更加明显。
实验结果 锯齿波:
正弦波:
六、实验总结
通过此次实验,我了解了数/模和模/数转换器的基本原理,以及掌握了DAC0832和ADC0809芯片的使用方法。在实验过程中,对于填写代码空白这一项,感觉很锻炼对于程序的阅读和理解能力。当然也遇到了一些障碍,通过请教老师和同学,最后都顺利解决,此次实验收获很大。
第四篇:电子科技大学微机实验报告 实验4
实验四基于ARM的嵌入式Linux开发环境建立 【实验目的】 1.掌握嵌入式Linux 开发环境的基本流程。2.熟悉Linux 操作系统 3.熟悉嵌入式开发平台
【实验内容】
在PC机虚拟机下的Linux系统中建立基于ARM 的嵌入式Linux 开发环境。
1.学会网口的配置 2.Minicom端口的使用
【预备知识】
1.了解ARM9处理器结构 2.了解Linux 系统结构
3.了解ARM开发板使用常识
【实验设备和工具】
硬件:PC机Pentium100以上,ARM嵌入式开发平台
软件:PC机Linux 操作系统+MINICOM+AMRLINUX开发环境
【实验原理】
1.交叉编译器在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译,这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构
(Architecture)、操作系统(OperatingSystem)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intelx86体系结构和Linuxforx86操作系统的统称;而x86WinNT平台 实际上是Intelx86体系结构和Windows NTforx86操作系统的简称。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软
件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++ 开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解
为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU 的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强 的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(crosscompilation tool-chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1、在WindowsPC上,利用RVDS(ARM开发环境),使用armcc编译器,则可编译出针对ARMCPU的可执行代码。
2、在LinuxPC上,利用arm-linux-gcc编译器,可编译出针对LinuxARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARMCPU的可执行代码。
2.NFS服务
NFS是Net FileSystem的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS.NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系
统上的文件。
NFS至少有两个主要部分:一台服务器和一台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了正常工作,一些进程需要被配置并运行。
在本实验中就是将PC机作为服务器,而将ARM开发板作为客户机,这样ARM开发板就可以远程
访问存放在在PC机上的数据,这样可以缩短研发周期,更方便的调试程序。
【实验步骤】
1.双击桌面上VMWARE,打开Linux 虚拟机 2.点击启动虚拟机,启动虚拟机 3.以root身份登陆虚拟机,密码123456
4.其他步骤详见实验指导书
【实验结果和程序】
基于ARM 的嵌入式Linux开发环境建立完毕。
【思考题】
1.如何验证交叉编译器已安装成功? 答:在终端输入命令:cd/arm/rootfs/home/driver(文件夹里已有test_led.c文件)arm-linux-gcc–o test_ledtest_led.c
若有可执行文件test_led生成则表示交叉编译器已安装成功
2.如果我们需要变更根文件系统的目录,该如何设置使得ARM开发板可以成功挂载?答:修改/etc/exports 文件的内容,将/arm/rootfs*(rw,sync,no_root_squash)改为/XX/XXX
*(rw,sync,no_root_squash)(/XX/XXX为变更后点的文件目录)
3.怎么在u-boot命令行下修改ARM 开发板的IP?
答:输入setenvip=x.x.x.x:192.168.0.1:192.168.0.1:255.255.255.0:uestc:eth0:off
Saveenv
x,x,x,x为ARM开发板的新IP。
【实验结论】
本实验实现了基于ARM 的嵌入式Linux 开发环境建立
第五篇:电子科技大学微机实验报告 实验5
实验五 基于ARM的模块方式驱动程序实验 【实验目的】 1.掌握Linux 系统下设备驱动程序的作用与编写技巧 2.掌握Linux 驱动程序模块加载和卸载的方法 3.了解Linux 内核中的makefile和kconfig文件
【实验内容】
1.基于s3c2440 开发板编写led 驱动程序。2.将编写好的led驱动加入linux内核中,修改makefile和kconfig文件,配置和编译内核。3.编写关于led 的测试程序,交叉编译后运行,控制led 灯的亮灭。
【预备知识】
1.了解ARM9处理器结构和Linux 系统结构
2.熟练掌握C语言。
【实验设备和工具】
硬件:ARM嵌入式开发平台,PC机Pentium100 以上。
软件:PC机Linux操作系统+MINICOM+AMRLINUX 开发环境
【实验原理】
linux设备驱动程序 驱动的模块式加载和卸载
编译模块
装载和卸载模块
led 驱动的原理
在本开发板上有八个led指示灯,从下往上分别为LED0-LED7。这八个led灯都是接的芯片上的gpio口(通用功能输入输出口)。在本实验的开发板硬件设计中,当led 灯对应的gpio的电平为低时,led灯被点亮;当led灯对应的gpio的电平为高时,led灯灭。本驱动的作用就是通过设置对应gpio口的电平来控制led 的亮灭。
因为ARM 芯片内的GPIO口都是复用的,即它可以被配置为多种不同的功能,本实
验是使用它的普通的I/O口的输出功能,故需要对每个GPIO口进行配置。在内核中已经定义了对GPIO口进行配置的函数,我们只需要调用这些函数就可以完成对GPIO口的配置。
【实验步骤】实验程
序运行效果:
程序会提示:“pleaseenterthe led status”
输入与希望显示的led状态对应的ledstatus值(输入十进制值即可),观察led 的显示情况。例如:
输入数字“3”,对应的二进制数字为00000011
故点亮LED2~LED7
输入数字“4”,对应的二进制数字为00000100
故点亮LED0,LED1,LED3~LED7
【实验结果和程序】
C语言程序:
#include
static intLedMajor=231;
staticintLedMinor=0;
static charledstatus=0xff;staticstructclass*s3c2440_class;staticstructcdev *s3c2440_led_cdev;
/*
******************************************************************************* ************************
** Function name:Update_led()**Descriptions **Input :NONE **Output :NONE :update the led status
******************************************************************************* ************************
*/ staticvoid Update_led(void)
{
if(ledstatus&0x01)
s3c2410_gpio_setpin(S3C2410_GPC7,1);//LED0灭
else
s3c2410_gpio_setpin(S3C2410_GPC7,0);//LED0亮
if(ledstatus&0x02)
s3c2410_gpio_setpin(S3C2410_GPC5,1);//LED1灭
else
s3c2410_gpio_setpin(S3C2410_GPC5,0);//LED1亮
if(ledstatus&0x04)
s3c2410_gpio_setpin(S3C2410_GPH9,1);//LED2灭
else
s3c2410_gpio_setpin(S3C2410_GPH9,0);//LED2亮
if(ledstatus&0x08)
s3c2410_gpio_setpin(S3C2410_GPB4,1);//LED3灭
else
s3c2410_gpio_setpin(S3C2410_GPB4,0);//LED3亮
if(ledstatus&0x10)
s3c2410_gpio_setpin(S3C2410_GPG5,1);//LED4灭
else
s3c2410_gpio_setpin(S3C2410_GPG5,0);//LED4亮
if(ledstatus&0x20)
s3c2410_gpio_setpin(S3C2410_GPG6,1);//LED5灭
else
s3c2410_gpio_setpin(S3C2410_GPG6,0);//LED5亮
if(ledstatus&0x40)
s3c2410_gpio_setpin(S3C2410_GPG7,1);//LED6灭elses3c2410_gpio_setpin(S3C2410_GPG7,0);//LED6亮
if(ledstatus&0x80)
s3c2410_gpio_setpin(S3C2410_GPG8,1);//LED7灭
else
s3c2410_gpio_setpin(S3C2410_GPG8,0);//LED7亮
}
staticssize_ts3c2440_Led_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Update_led();
printk(“write: led=0x%x,count=%dn”,ledstatus,count);returnsizeof(ledstatus);} staticints3c2440_Led_open(structinode*inode,struct file *filp)
{
printk(“led device openn”);
return 0;
} staticints3c2440_Led_release(structinode*inode,struct file*filp)
{
printk(“led device releasen”);
return 0;} staticstructfile_operationss3c2440_fops={.owner=THIS_MODULE,.open=s3c2440_Led_open,.write=s3c2440_Led_write,.release=s3c2440_Led_release, };
staticintinits3c2440_Led_init(void)
{
dev_ts3c2440_leds_devno;
/*configure the gpiofor leds*/
s3c2410_gpio_cfgpin(S3C2410_GPG5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG8,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT);
Update_led();/*registerthe devnumber*/ s3c2440_leds_devno=MKDEV(LedMajor,LedMinor);ret=register_chrdev_region(s3c2440_leds_devno, 1,DEVICE_NAME);
/*registerthe chardevice*/
s3c2440_led_cdev=cdev_alloc();if
(s3c2440_led_cdev!= NULL)
{ cdev_init(s3c2440_led_cdev, &s3c2440_fops);s3c2440_led_cdev->owner=THIS_MODULE;if(cdev_add(s3c2440_led_cdev, s3c2440_leds_devno, 1))
printk(KERN_NOTICE “Something wrong when addings3c2440_led_cdev!n”);
else
printk(“Success addings3c2440_led_cdev!n”);} /*create the device node in /dev*/ s3c2440_class =class_create(THIS_MODULE, “led_class”);class_device_create(s3c2440_class, NULL, s3c2440_leds_devno, NULL, DEVICE_NAME);
printk(DEVICE_NAME “ initializedn”);
return 0;
}
staticvoid exits3c2440_Led_exit(void)
cdev_del(s3c2440_led_cdev);class_device_destroy(s3c2440_class, MKDEV(LedMajor,LedMinor));class_destroy(s3c2440_class);printk(DEVICE_NAME “ removedn”);
}
module_init(s3c2440_Led_init);
module_exit(s3c2440_Led_exit);
【思考题】
1.设备驱动程序的功能是什么?答:设备驱动的功能就是将系统提供的调用映射到作用于实际硬件的和设备相关的操作上。
2.模块化的最大优点是什么?答:可以在系统正在运行着的时候给内核增加模块
提供的功能(也可以移除功能)。
3.如果在驱动模块中删除module_exit(s3c2440_Led_exit);后会有什么影响?
答:这个模块将不能被移除。
4.驱动代码中调用的宏MKDEV 的作用是什么?答:获取设备在设备表中的位置。输入主设备号,从设备号,返回位置号。
【实验结论】
本实验实现了linux环境下的led灯驱动的添加。