实验报告四 简单的IO接口
- 格式:docx
- 大小:40.20 KB
- 文档页数:10
简单io口扩展实验报告
简单IO口扩展实验报告
本次实验旨在学习如何通过简单IO口扩展模块对单片机的IO口进行扩展,实现多个IO口的输入输出功能。
我们需要了解简单IO口扩展模块的基本原理和工作方式。
简单IO 口扩展模块通过与单片机的SPI总线进行通信,实现对其内部寄存器的读写操作,从而实现对IO口的扩展。
在实验中,我们使用STM32F103C8T6开发板和简单IO口扩展模块,通过连接它们的SPI总线,可以将扩展模块的IO口与开发板的IO口进行连接,实现IO口的扩展。
具体连接方式如下图所示:
(此处省略图片)
接下来,我们需要进行程序设计。
在初始化时,需要设置SPI总线的相关参数,然后对扩展模块进行初始化,将其内部寄存器中的数据清零。
然后,通过读写寄存器的方式,可以对扩展模块的每个IO 口进行配置,设置其输入输出状态、上下拉电阻等参数。
在程序中,我们可以通过读取扩展模块的输入口状态,判断是否有外部信号输入,根据需要进行相应的操作。
例如,当输入口接收到高电平信号时,可以控制某个输出口输出高电平信号,从而实现控制设备的功能。
在实验中,我们可以通过连接LED和按键来进行简单的IO口扩展实验。
将LED连接到扩展模块的输出口,按键连接到扩展模块的输入口,通过控制按键输入信号,实现对LED的控制。
总的来说,本次实验通过学习简单IO口扩展模块的原理和工作方式,掌握了通过SPI总线进行IO口扩展的方法,实现了对单片机多个IO口的输入输出控制,为后续的硬件控制和应用开发打下了基础。
实验四简单I/O口扩展实验4.1实验目的1. 熟悉74LS273,74LS244的应用接口方法。
2. 掌握用锁存器、三态门扩展简单并行输入、输出接口的方法。
4.2实验条件1. 北京达盛科技有限公司“缔造者”电子电气技术综合实验台、CPU挂箱、8086CPU模块。
2. PC机1台,已安装实验台8086开发调试软件。
3. 万用表。
4.3实验内容本实验用到CPU挂箱两部分电路:开关量输入输出电路、简单I/O口扩展电路。
实验要求:采用74LS244输入逻辑电平开关K1~K8的状态,然后通过74LS273锁存输出,利用LED 显示电路作为输出的状态显示。
4.4实验步骤1. 实验接线将CPU挂箱上简单I/O口扩展电路中的CS244、CS273分别与地址译码电路的CS0、CS1相连,简单I/O口扩展电路中的IN0~IN7、 O0~O7分别与开关量输入输出电路的K1~K8、LED1~LED8相连。
2. 建立PC机与8086CPU模块间的通讯连接将8086CPU模块正确地放在CPU挂箱上的CPU插槽中,系统上电后按下RESET键,几秒钟之后如果显示“P_”,说明CPU挂箱上的8086系统复位及8086CPU模块监控程序运行正常。
在PC机上打开8086开发调试软件,根据提示按下RESET键,几秒种后如果显示“C_”,说明与PC机通讯正常,同时8086开发调试软件用户界面提示通讯成功。
如果通讯不成功,试着选择串口COM2。
3. 编辑汇编语言源程序8086开发调试软件是将编辑、汇编、连接和调试集成在一起的综合开发环境,同时具有断点设定、程序下载到实验台等功能。
选择“文件”→“新建”选项,建立一个源文件,输入源程序并保存。
4. 编译源程序选择“编译”→“编译”选项,8086开发调试软件的此项功能完成对源程序的汇编、连接,生成可执行程序。
5. 下载可执行程序到实验台选择“编译”→“链接”选项,8086开发调试软件的此项功能是将可执行程序下载到实验台的8086系统。
简单i o口扩展实验实验报告简单I/O口扩展实验实验报告引言:简单I/O口扩展实验是一项基础的电子实验,通过扩展I/O口,可以实现对外部设备的控制和数据交互。
本实验旨在通过实际操作,了解I/O口扩展的原理和应用。
实验目的:1. 了解I/O口的基本概念和工作原理;2. 学习使用I/O口扩展芯片实现对外部设备的控制;3. 掌握I/O口扩展的编程方法和应用技巧。
实验器材和材料:1. Arduino开发板;2. I/O口扩展芯片;3. 连接线;4. 外部设备(如LED灯、蜂鸣器等)。
实验步骤:1. 连接Arduino开发板和I/O口扩展芯片。
将I/O口扩展芯片的引脚与Arduino开发板的数字引脚相连,确保连接正确可靠。
2. 编写程序。
使用Arduino开发环境,编写程序代码,实现对I/O口扩展芯片的控制。
根据实际需求,可以选择控制外部设备的开关、亮度、频率等。
3. 上传程序。
将编写好的程序上传到Arduino开发板,确保程序能够正确运行。
4. 运行实验。
运行程序,观察外部设备的状态变化。
通过改变程序中的参数,可以实现对外部设备的不同控制效果。
实验结果与分析:通过实验,我们成功地实现了对外部设备的控制。
通过改变程序中的参数,我们可以控制外部设备的开关、亮度、频率等。
这说明I/O口扩展技术具有很大的应用潜力,可以实现对各种外部设备的控制和数据交互。
实验总结:通过本次实验,我们深入了解了I/O口扩展的原理和应用。
通过编写程序,我们掌握了I/O口扩展的编程方法和应用技巧。
通过实验,我们成功地实现了对外部设备的控制,这为我们进一步研究和应用I/O口扩展技术奠定了基础。
实验中遇到的问题和解决方法:在实验过程中,我们遇到了一些问题,如连接错误、程序错误等。
我们通过仔细检查连接和程序代码,逐一解决了这些问题。
这提醒我们在实验中要认真细致,仔细检查和排除错误,以保证实验的顺利进行。
实验的局限性和改进方向:本次实验只是简单地介绍了I/O口扩展的基本原理和应用,还有很多相关的知识和技术需要进一步学习和探索。
简单IO口扩展实验报告1. 背景在实际应用中,我们经常需要扩展计算机的输入输出(IO)接口,以满足不同的需求。
而简单IO口扩展就是一种常见且重要的扩展方式。
通过简单IO口扩展,我们可以将计算机连接到更多的外部设备,如传感器、执行器等,从而实现更多功能和应用。
2. 分析2.1 简单IO口介绍简单IO口是指通用输入输出接口,它可以通过数字信号来进行数据的输入和输出。
每个简单IO口通常包括一个输入引脚和一个输出引脚。
通过控制这些引脚的电平状态,我们可以实现数据的输入和输出。
2.2 简单IO口扩展方法简单IO口可以通过不同的方法进行扩展,常见的方法包括:•并行接口:使用并行接口可以同时传输多个位的数据。
它通常使用多条数据线和一些控制线来实现高速数据传输。
•串行接口:使用串行接口可以逐位地传输数据。
它通常使用一条数据线和一些控制线来实现较低速率但更简洁的数据传输。
•USB接口:USB(Universal Serial Bus)是一种常见的数字串行总线接口,它可以连接多种设备,并提供高速数据传输和供电功能。
•SPI接口:SPI(Serial Peripheral Interface)是一种常用的串行外设接口,它可以连接多个外设,并以主从模式进行数据传输。
•I2C接口:I2C(Inter-Integrated Circuit)是一种常见的串行通信接口,它可以连接多个外设,并使用两条线路进行数据传输。
2.3 简单IO口扩展实验本次实验旨在通过简单IO口扩展方法,将计算机与外部设备进行连接,并实现数据的输入和输出。
具体步骤如下:1.确定要使用的简单IO口扩展方法,如并行接口、串行接口等。
2.根据选择的扩展方法,准备相应的硬件模块和连接线缆。
3.将硬件模块与计算机进行连接,确保电气连通性。
4.编写相应的驱动程序或使用现有的驱动程序,以实现与硬件模块的通信。
5.运行程序并测试扩展功能。
3. 结果经过实验测试,我们成功地实现了简单IO口扩展,并达到了预期的结果。
大连理工大学软件学院《接口与汇编》实验报告姓名:学号:班级:姓名:学号:班级:组号: 5 实验箱编号:实验时间:2012年3月21日实验室:嵌入式实验室实验台:Embest Edukit-III平台指导教师:侯刚成绩:实验三:IO接口实验一、实验目的和要求题目:IO接口实验实验目的1. 学习单片机的I/O口的使用方法。
2. 学习延时子程序的编写和使用。
实验要求1.P0口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
2. 用汇编代码设计程序,完成8个LED等的循环闪烁,循环五次后,进行全灭全亮闪烁,时间间隔500ms.二、实验原理和内容实验内容:用汇编代码设计程序,完成8个LED等的循环闪烁,循环五次后,进行全灭全亮闪烁,时间间隔500ms.实验原理:1.使用定时器进行计时。
根据所给开发板上的晶振频率,计算出计时器所付初值,设置计时器TO在模式下工作,每次计时100ms五次计时后,转入流水灯中断处理程序。
2.流水灯的实现采用带进位标识位循环左移,根据开发板原理图判断P0口初值为1则不量,设置P0口初值为#0FFH,进位标志位清零,计时器每计时500ms,P0循环左移一位。
3.采用寄存器R0,初值为06H,计数5次循环闪烁后,彩灯全亮全灭,进入下一轮循环闪烁。
三、主要仪器设备及软件编程环境主要仪器:计算机编程软件,51电路开发板编程环境:uVision2 ,progisp烧写软件四、实验步骤与编程实验步骤:编写代码,编译,调试,烧写,完成实验。
编程:ORG 0000HRESET: LJMP MAINORG 000BHLJMP IT0PORG 1000HMAIN: MOV SP,#60HMOV R0,#05;500MS___MOV TMOD,#01HMOV TL0,#0B0HMOV TH0,#3CHMOV A,#0FFHMOV R2,#06HMOV R3,#08HCLR CSETB TR0SETB ET0SETB EAHERE: SJMP HEREIT0P: MOV TL0,#0B0HMOV TH0,#3CHDJNZ R0,LOOP3 ;R0不为0,中断返回MOV R0,#05H ;R0为0,重置R0DJNZ R3,LOOP2 ;R3不为0,循环左移(R3原来为8)MOV R3,#08H ;R3为0,证明一次循环结束DJNZ R2,LOOP3 ;R2不为0,还需循环左移,中断返回;R2为0,五次循环结束MOV P0,#0FFHMOV P0,#00HMOV R2,#06HRETILOOP2: RLC AMOV P0,ALOOP3: RETIEND五、实验数据与结果分析八位彩灯实现了循环闪烁(由于采用定时器编写,不会仿真,所以无截图)。
简单i o口扩展实验报告简单I/O口扩展实验报告引言在现代科技发展的浪潮下,电子设备的功能和复杂性不断提升。
然而,对于初学者来说,了解和掌握电子设备的基本原理和操作方法是非常重要的。
本实验旨在通过简单的I/O口扩展实验,帮助初学者更好地理解和应用I/O口扩展技术。
一、实验目的本实验的主要目的是通过使用I/O口扩展技术,实现电子设备与外部设备的交互功能。
具体目标包括:1. 了解I/O口扩展的基本原理和应用场景;2. 学习使用I/O口扩展芯片进行输入输出控制;3. 实现简单的电子设备与外部设备的交互功能。
二、实验器材1. Arduino开发板;2. I/O口扩展芯片;3. 电阻、电容等基本电子元件;4. 连接线、面包板等实验工具。
三、实验步骤1. 连接电路将Arduino开发板与I/O口扩展芯片通过连接线连接起来,按照电路图进行正确的连接。
确保电路连接无误后,将其连接到电源。
2. 编写程序在Arduino开发环境中,编写程序以实现所需的输入输出控制功能。
通过调用相应的库函数,配置I/O口扩展芯片的输入输出模式,并编写相应的逻辑控制代码。
3. 烧录程序将编写好的程序烧录到Arduino开发板中,确保程序能够正确运行。
4. 实验验证运行程序后,通过操作外部设备,如按钮、LED灯等,验证I/O口扩展功能的正确性。
观察外部设备的状态变化,以及Arduino开发板的响应情况。
四、实验结果与分析通过实验,我们成功实现了I/O口扩展技术的应用。
通过编写程序,我们可以根据需要配置I/O口扩展芯片的输入输出模式,并通过控制逻辑实现与外部设备的交互功能。
在实验过程中,我们发现通过I/O口扩展技术,可以实现大量的输入输出控制。
例如,我们可以通过按钮控制LED灯的开关,通过传感器获取环境温度并进行相应的控制,通过继电器控制电机等。
这些功能的实现,不仅提高了电子设备的灵活性和可扩展性,也为我们提供了更多的创造空间。
然而,我们也发现在实际应用中,I/O口扩展技术还存在一些挑战和限制。
竭诚为您提供优质文档/双击可除i0口输入输出实验报告篇一:实验二I-o口输入、输出实验报告单片机实验报告2姓名学号时间地点实验题目I/o口输入、输出实验一、实验目的1.学习I/o口的使用方法。
2.学习延时子程序、查表程序的编写和使用。
二、实验仪器和设备pc机、wAVe软件、仿真器+仿真头、实验板、电源等。
三、实验说明本实验1通过单片机的I/o口控制LeD的亮灭,从而观察I/o口的输出。
实验2通过单片机的I/o口接受按键动作信息,然后通过LeD和数码管指示。
通过本实验学生可以掌握单片机I/o口输入输出的控制方法,同时也可以掌握单片机延时子程序、查表程序的编写和调试方法。
要求预先编写好程序并通过伟福仿真软件调试。
四、实验内容1、p0口做输出口,接八只LeD,编写程序,使LeD循环点亮,间隔0.5秒。
2、p1.0--p1.7作输入口接拨动开关s0--s7;p0.0--p0.7作输出口,接发光二极管L1—L8,编写程序读取开关状态,将此状态在对应的发光二极管上显示出来,同时将开关编号(0—7)显示在LeD数码管上。
编程时应注意p1作为输入口时应先置1,才能正确读入值。
五、实验电路连线p0.0----LeD0p1.0-----s0p0.1----LeD1p1.1-----s1p 0.2----LeD2p1.2-----s2p0.3----LeD3p1.3------s3p 0.4----LeD4p1.4------s4p0.5----LeD5p1.5------s5 p0.6----LeD6p1.6------s7p0.7----LeD7p1.7------s8 实验1:p0口循环点灯实验2:p1、p0口输入输出agfbabcdefgh(dp)eh(dp)实验2:LeD数码管各段与I/o的连接dcp2.0p2.1p2.2p2.3p2.4p2.5p2.6p2.7六、程序框图及程序p0口循环点灯oRg0000hmoVA,#07FhLp:moVp0,ARRALcALLDeLAYLcALLDeLAYsJmpLpDeLAY:moVR2,#0FAhL1:moVR3,#0FAhL2:DJnZR3,L2DJnZR2,L 1ReT;设定程序汇编起始地址;设置初始值01111111;点亮LeD0;将A里面的值循环右移一位;调用延时子程序;循环点亮LeD灯;0.25s的延时程序;2*250=500us;500*250*2=250000us;返回主程序p1口输入/输出oRg0000Loop:moVA,p1cJneA,0FFh,LeDsJmpLoopLeD:moVp0, AAcALLDeLAYmoVR5,#00hLoop1:RRcAJncLoop2IncR5sJmpLoo p1Loop2:moVDpTR,#TAbmoVA,R5;设定起始地址;读p1口;查询是否有按键按下;等待;有键按下,将值读入p0;调用延时子程序;置计数初值=0;输入右移1位;若cy=0,则数码显示;cy=1,则计数加1;跳回继续移位;所查表的首地址赋给DpTR;计数值做偏移量moVp1,#0FFh;p1口置1moVcA,@A+DpTRmoVp2,A;显示相应按键值sJmpLoopTAb:Db60h,0DAh,0F2h,66h;Db0b6h,0beh,0e0h,0Feh;DeLAY:moVR2,#0FAhL1:moVR3,#0FAhL2:DJnZR3,L2DJnZR2,L1ReT;0.25s的延时程序;2*250=500us;500*250*2=250000us;返回主程序七、思考题1、实验1欲改变LeD循环的方向程序应如何修改?循环的时间间隔由什么决定?写出间隔时间为1秒的延时程序并说明计算方法。
单片机程序实验报告姓名:陈曦学号23320082203998系别:通信工程系实验二简单I/O端口扩展实验一、实验目的1.学习8051单片机扩张数据存储的方法;2.学习61C256芯片的接口方法。
二、实验设备微型计算机、单片机仿真器、实验仪、示波器(各一台)实验连线:若干三、实验原理图四、实验内容编写并调试一段程序,功能是把8051内部数据存储器中50H~6FH的内容复制到外部数据存储器中0500H开始的区域中。
要求加入数据读写校验的功能,对写入外部RAM的区域先进行写入、读取校验操作。
汇编语言程序如下:ADDER E QU 50HADDER1 EQU 0500HBYTE EQU 20HORG 0000HAJMP STARTORG 0030HSTART:MOV R2,#BYTEMOV R0,#ADDERMOV DPTR,#ADDER1MOV @R0,#12H ;先写入标志性的数据INC R0MOV @R0,#34HINC R0MOV @R0,#56HINC R0MOV @R0,#78HINC R0MOV @R0,#9AHINC R0MOV @R0,#0BCHINC R0MOV @R0,#0DEHINC R0MOV R0,#ADDERMOV R1,#00HLOOP:MOV A,#00HMOVX @DPTR,AMOVX A,@DPTRSUBB A,#00HJNZ ERRORMOV A,#0FFHMOVX @DPTR,AMOVX A,@DPTRSUBB A,#0FFHJNZ ERRORMOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ R2,LOOPAJMP $ERROR:INC DPTRINC R1DJNZ R2,LOOPAJMP $ENDC语言源程序:#include<reg51.h>data unsigned char ADDER1 _at_ 0x50; xdata unsigned char ADDER2 _at_ 0x0500; main(){unsigned char i,temp=0,count=0;unsigned char *sadd1,*sadd2;SP=0x70;sadd1=&ADDER1;sadd2=&ADDER2;for(i=0;i<0x20;i++){*sadd2=0x00;temp=*sadd2;temp=temp-0x00;if(temp!=0){count++;sadd2++;continue;}*sadd2=0xff;temp=*sadd2;temp=temp-0xff;if(temp!=0){count++;sadd2++;continue;}*sadd2=*sadd1;sadd1++;sadd2++;}while(1){;}}五、实验小结通过实验是我们了解如何扩展外部存储器,并熟练掌握了内外存储器的数据的传送、指针的使用,获悉了读写校验的原理,为下一步学习打下了坚实的基础。
i o口扩展实验报告I/O口扩展实验报告引言:I/O口扩展是指通过外部设备将计算机的输入输出接口扩展,以满足更多的输入输出需求。
本实验旨在通过实际操作,了解I/O口扩展的原理、应用和实现方法。
一、实验目的本实验的目的是通过使用I/O口扩展模块,实现对计算机的输入输出接口的扩展,掌握I/O口扩展的基本原理和实现方法。
二、实验器材1.计算机2.I/O口扩展模块3.连接线4.外部设备(如LED灯、按钮等)三、实验步骤1.连接I/O口扩展模块与计算机:将I/O口扩展模块通过连接线与计算机的相应接口连接好。
2.编写控制程序:根据实验要求,编写相应的控制程序,以实现对外部设备的控制。
3.运行程序:将编写好的控制程序加载到计算机中,并运行程序。
4.观察实验结果:观察外部设备是否按照预期进行相应的输入输出操作。
四、实验结果与分析通过实验,我们成功地实现了对计算机的输入输出接口的扩展。
通过编写相应的控制程序,我们可以实现对外部设备的控制,例如通过按钮控制LED灯的亮灭。
这样的扩展可以使计算机能够与更多的外部设备进行交互,提供更多的功能和应用。
五、实验原理I/O口扩展的原理是通过外部设备与计算机的输入输出接口进行连接,实现对计算机的输入输出功能的扩展。
通常情况下,计算机的输入输出接口是有限的,而外部设备的种类和数量却是多种多样的。
通过使用I/O口扩展模块,我们可以通过扩展接口的方式,将更多的外部设备与计算机进行连接,实现更多的输入输出功能。
六、实验应用I/O口扩展在实际应用中具有广泛的应用价值。
例如,在工业自动化控制中,通过I/O口扩展可以实现对各种传感器和执行器的控制,从而实现对生产过程的监控和控制。
在智能家居领域,通过I/O口扩展可以实现对家电设备的智能控制,提高生活的便利性和舒适度。
此外,I/O口扩展还可以应用于仓储物流、智能交通等领域,为各种设备和系统的控制提供更多的接口和功能。
七、实验总结通过本次实验,我们对I/O口扩展的原理、应用和实现方法有了更深入的了解。
简单的I/O接口091180083 刘浩通信工程一.实验目的1.学习嵌入式Linux操作系统设备驱动的方法2.通过动态LED控制、扫描键盘应用、步进电机驱动等控制,掌握简单设备的基本控制原理。
二.实验原理介绍1.嵌入式系统的设备驱动程序设备驱动程序负责将应用程序如读、写等操作正确无误地传递给相关的硬件,并使硬件能够做出正确反应。
因此在编写设备驱动程序时,必须了解相应的硬件设备的寄存器、IO接口及内存的配置参数。
实验的第一步就是要好好了解这个实验中要用到的硬件的接口信息。
2.LED和八段数码管显示详细介绍见《嵌入式实验指导书》P50-P51。
在这里需要提及的是,LED及LED 数码管为共阳结构,当给对应的I/O位输出为0时,LED灯亮。
I/O数据线经过一个D锁存器74HC574,在时钟信号作用下对输入信号进行锁存。
LED的片选信号为LED_CS4。
数码管一和二的片选信号是LED_CS2,数码管三和四的片选信号为LED_CS3。
在数码管显示电路中,8位数据的高位D7及D15用作八段数码的公共选通信号,通过控制PNP管来控制数码管的显示,经分析可以知道当D7和D15为低电平时,数码管才被选通。
下面是要得到以上片选信号的地址。
参考实验指导资料,知道片选信号是通过I/O设备译码得到的。
LED_CS1~LED_CS4以及AD_CS,IDE_CS,RTC_CS八个信号是通过三八地址译码器得到的。
八段译码管的片选信号B_CS4的地址为0x1000 0000,三根地址输入线BA22、BA21、BA20=011、100、101时LED_CS2,LED_CS3,LED_CS4为低电平,此时选通相应数码管。
所以可以得到数码管一二的地址为0x1030 0000,数码管三四的地址为0x1040 0000,LED 灯的地址为0x1050 0000。
3.矩阵键盘目标平台提供了3x4的矩阵键盘和四个单按键键盘。
矩阵键盘的行线分别由GPIO 100~GPIO102控制,列线由GPIO 103~105及108控制。
四个单按键分别由GPIO94、GPIO95、GPIO98、GPIO99控制。
键盘的硬件电路图在P52有非常详细的介绍。
4.步进电机步进电机是将电脉冲信号转换为角位移或者线位移的开环控制元件。
非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载的影响。
步进电机有很多优点,使得在速度、位置等领域用步进电机来控制变得很简单。
在开发板上使用的是四相步进电机,电机控制芯片为UCN4202A,它的控制功能包括PWM波输入、电机转动方向、输出使能和复位功能。
开发板中OE又GPIO53控制,低电平使能。
D/C是方向端,低电平为正向,高电平为反向,由GPIO84控制。
PWM波输入由GPIO83完成。
PWM波一般选择方波,当来一个低电平时,逻辑就会向正方向移一个位置,注意最低周期为2微米。
5.GPIO操作PXA270提供了121位GPIO口,我们通过设置GPIO寄存器来设置这121个口的功能。
本实验中我用到的四个很重要的寄存器是GPLRx(电平寄存器,显示当前电平情况),GPDRx(方向寄存器,设置口的方向,为0时输入,为1时输出),GPSRx(输出设置寄存器,为1时高电平输出,为0时低电平输出),GPCRx(输出清零寄存器,为1时清除输出,为0时不改变当前状态)。
其中x从0到3。
这些寄存器是32位的。
寄存器地址分配表见P54。
对寄存器的操作有多种方式。
在内核头文件中已经定义了一些对寄存器进行操作的宏,我们在编写驱动程序的时候只需要好好用好这些宏操作,就会很大程度地简化编程。
6.I/O端口和I/O内存要与硬件进行通信,需要通过I/O接口。
对I/O接口的访问,有的处理器使用I/O端口,有的使用I/O内存,将I/O映射到内存,像访问内存一样访问I/O。
一般,I/O的物理地址是由硬件设计来决定,但驱动程序不能直接通过物理地址来访问I/O设备,必须通过页表将它们映射到内存虚地址空间,通过访问内存的指令来访问这些I/O设备。
Linux内核提供了ioremap()这个函数来将实地址映射到虚拟内核地址;利用iounmap()来释放虚拟内存。
它的原型是:void *ioremap(unsigned long phys_addr,unsigned long size,unsigned long flags);void iounmap(void *addr)。
三.实验过程及现象结果分析1.七段数码管驱动程序及应用程序的编写实验时参照老师给定的LED灯驱动程序,进行简单的修改后实现了数码管显示的驱动程序。
重要的语句是:volatileunsigned short *vled1;volatile unsigned short *vled2; //作为全局变量定义vled1=ioremap(0x1030 0000,4);vled2=ioremap(0x1040 0000,4);//将数码管1,2的物理地址映射到虚拟地址vled1,数码管3、4的物理地址映射到vled2。
这两个句子在驱动程序的init_module()函数中定义。
相对应,在模块结束函数时要释放这些虚拟内存空间。
在cleanup_module()中做以下的定义。
iounmap(vled1);iounmap(vled2);其次就是对I/O端口进行操作,如读写数据,进行控制。
在这个实验中需要知道的是,由于LED及数码管的控制都是先经过74HC574这个锁存器,而对锁存器只能对其进行写操作,所以在编写驱动的时候,对于读函数,可以不做任何工作。
而对写函数,给出以下程序段:staticssize_t write(structinode *inode,struct file*file,const char *buf,unsigned long count){char *arg;copy_from_user(arg,buf,count);vled1=arg[0]|(arg[1]<<8);vled1=arg[2]|(arg[3]<<8);return 0;}上面这个函数编写的主要作用是:从用户空间里传来四个字节的数据,四个字节分别赋给四个数码管对应的内存空间。
这样的话,在应用程序中能很好地实现四个数码管的显示。
应用程序的编写:(主要语句)首先将数码管的段码制成一个表格供数据显示时查询。
注意数码管共阳,且要显示数字的话,代表小数点的那位因为作为选通信号必须为低电平。
如:要显示数字1,段码为0x79。
以此类推。
char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x10} int a;charbuf[4];可以实现交互,从键盘输入想要显示的四个数字。
printf(“input four number you want to display\n”);for(i=0;i<4;i++){scantf(“%d\n”,&a);buf[i]=seg[a];}write(fd,buf,4);//fd为打开设备文件的文件描述符这样就能较好地实现数码管数据的显示。
关于Makefile由于开发板用的是linux2.4内核,跟上一个实验中的Makefile有些区别。
给出下面的Makefile,只需要做非常简单的修改,修改文件名,即可用于下面的实验。
CC = /usr/local/arm-linux/bin/arm-linux-gccTARGET = seg8CFLAGS = -Wall -DMODULE -D__KERNEL__ -DLINUXINC = -I /usr/src/linux-2.4.21-51Board_EDR/includeall: seg8.o$(TARGET).o:$(TARGET).c$(CC) $(INC) $(CFLAGS) -c $<seg8test: seg8test.c$(CC) -o $@ $<clean:rm -f $(TARGET).o实验过程:make生成seg8.o文件,make seg8test生成seg8test可执行文件,然后cpseg.o /exp,然后cp seg8test /exp。
启动开发板环境,进行设置后,cd /mnt在/mnt下可以看到刚刚拷过来的两个文件。
然后加载模块seg8.oinsmod seg8.o提示:using seg8.o说明加载成功建立设备文件:mknod /dev/seg8 c 123 88 –m 666然后:运行测试文件 ./seg8test数码管显示输入的数字。
实验中遇到的问题:1.实验一开始时,将数码管的物理地址搞错了。
实验指导书上说数码管由LED_CS1选通,所以就将地址写成了0x1020 0000,反复调试程序,数码管仍然不能显示数据。
花了很长时间后,问同学才知道,原来书上弄错了。
数码管是有LED_CS2和LED_CS3来选通的。
修改地址后,问题解决。
2.对vled1,vled2两个虚拟地址空间指针的理解不够透彻,受到老师给的程序的影响,我一开始的时候没改两个指针指向的数据类型,仍然是老师给定程序的char类型。
这样我就一直只能驱动一个数码管1和数码管3,而数码管2和4不能显示。
基于数码管的硬件电路,一个I/O实地址对应16位的数据,后来我想到可以让虚拟地址指针指向16位的数据,这时犯了一个很基础的错误,一直以为int是16位的,因为最近在复习C语言的时候着重记录了每种数据类型的位数,并肯定int是16位的。
可是当我修改之后,在运行程序时总是提示错误,好像是在内存方面的错误,通过跟老师交流之后,发现错误就出在这里。
在32位的处理器上,int就是32位的。
后来将其改为short指针型的后,问题就解决了。
从上面两个问题,要学会一个道理:尽心书不如无书。
在实验的过程中,遇到问题不要一直一个人在那纠结。
要多跟人交流。
关于volatile类型的说明:通过查看资料发现:volatile的本意是“易失的,易挥发的”。
可以来修饰变量类型。
如上面程序中的:volatile unsigned short *vled1。
用volatile声明的变量每一次被访问时,执行部件都会从它相应的内存单元中取值。
在这个实验中这样做的目的是避免编译的过程中对程序进行优化的时候,直接从缓存或者寄存器中取值,从而响应不了IO端口数据的变化。
这样声明的作用与对硬件设置内存屏障的作用是一样的。
一般说来,volatile用在下面的几个地方:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;这个实验中用到的是第三种情况。