gpio输入输出实验报告3篇gpio输入输出实验报告 实验四GPIO输入实验 一、实验目的 1、能够使用GPIO的输入模式读取开关信号。2、掌握GPIO相关寄存器的用法和设置。3、掌下面是小编为大家整理的gpio输入输出实验报告3篇,供大家参考。
篇一:gpio输入输出实验报告
实验四GPIO输入实验
一、实验目的
1、能够使用GPIO的输入模式读取开关信号。2、掌握GPIO相关寄存器的用法和设置。3、掌握用C语言编写程序控制GPIO。
二、实验环境
PC机
一台
ADS1.2集成开发环境
一套
EasyARM2131教学实验平台
一套
三、实验内容
1.实验通过跳线JP8连接KEY1与P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。(调通实验后,改为KEY3键进行输入)。
2.当检测到KEY1有按键输入时点亮发光二极管LED4并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键没有输入。(键输入改为键KEY4,发光管改为LED6)。
3.结合实验三,当按下按键Key1时,启动跑马灯程序并控制蜂鸣器响,软件延时后关掉发光管并停止蜂鸣,然后循环这一过程直到检测按键再次按下。
四、实验原理
当P0口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路图参见图4.2。
进行GPIO输入实验时,先要设置IODIR使接口线成为输入方式,然后读取IOPIN的值即可。
图4.2按键电路原理图实验通过跳线JP8连接KEY1_P0.16,程序检测按键KEY1的状态,控制蜂鸣器BEEP的鸣叫。按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。在这个实验中,需要将按键KEY1输入口P0.16设为输入口而蜂鸣器控制口P0.7设置为输出口。蜂鸣器电路如图4.3所示,当跳线JP6连接蜂鸣器时,P0.7控制蜂鸣器,低电平时蜂鸣器鸣叫。LED灯电路如图4.4所示,低电平时灯亮。
图4.3蜂鸣器控制电路
图4.4LED控制电路程序首先设置管脚连接寄存器PINSEL0和PINSEL1,设置P0.16为输入,设置P0.7,P1.21为输出。然后检测端口P0.16的电平,对P0.7,P1.21进行相应的控制,流程图如图4.5所示,实现程序见程序清单4.1。
图4.5按键输入实验流程图
五、实验步骤、源代码及调试结果内容1
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:
⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
图4.6未按下Key1时IO0PIN的值
图4.7按下Key1时IO0PIN的值
由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,说明控制是正确的。
现象描述:按下KEY1,蜂鸣器鸣叫,松开后停止蜂鸣。
源代码:
#include"config.h"constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY1=1<<16;//P0.16连接KEY1
(改为KEY3时,只需“constuint32KEY1=1<<16”改为“constuint32KEY3=1<<18”,其余不变。)/*********************************************************************************************函数名称:main()**函数功能:GPIO输入实验测试。**检测按键KEY1。KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。**跳线说明:把JP8的KEY1跳线短接,JP11连接蜂鸣器。*******************************************************************************************/intmain(void){PINSEL0=0x00000000;//所有管脚连接GPIO
PINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出,其余输入while(1){if((IO0PIN&KEY1)==0)IO0CLR=BEEP;//如果KEY1按下,蜂鸣器鸣叫elseIO0SET=BEEP;//松开则停止蜂鸣}return0;}
内容二
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。
⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等全局变量、i等本地变量和ARM7微控制器的片内外寄存器窗口。如下图所示:
左图所示为ARM7微控制器的片内寄存器窗口。
图4.9本地变量
图4.8全局变量⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
.
图4.10未按下KEY1时IO0PIN的值
图4.11按下KEY1后IO0PIN的值
对比图4.10和4.11,发现按下KEY1后,IO0PIN寄存器的第16位由1变为0;而KEY1对应管脚P0.16,当按下时输入低电平,这说明KEY1的控制是正确的。
上图所示为运行“IO0CLR=BEEP”后IO0PIN寄存器的值,与图4.10对比,发现第8位由1变为0,BEEP对应P0.7管脚,这说明BEEP的控制是对的。
现象描述:当按下KEY1时,蜂鸣器鸣响,LED4亮;当松开KEY1后,蜂鸣器静音,LED4灭。
源代码如下:
#include"config.h"constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY1=1<<16;//P0.16连接KEY1(改为KEY4按键时,只需把上句代码改为“constuint32KEY4=1<<19”,其余不变)constuint32LEDS4=1<<21;//P1[21]控制LED4,低电平点亮(改为LED6时,只需把上句代码改为“constuint32LED6=1<<23”,其余不变。)/*****************************************************************************函数名称:main()**函数功能:GPIO输入实验测试。**检测按键KEY1。KEY1按下,蜂鸣器蜂鸣,松开后停止蜂鸣。**跳线说明:把JP8的KEY1跳线短接,JP11连接蜂鸣器。
**********************************************************************************
*********/
intmain(void)
{
Uint32i;PINSEL0=0x00000000;//所有管脚连接GPIOPINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出0IO1DIR=LEDS4;//设置LED4灯亮while(1)
{if((IO0PIN&KEY1)==0)
for(i=0;i<1000;i++);
//软件延时
{
IO0CLR=BEEP;//如果KEY1按下,蜂鸣器鸣叫
IO1DCLR=LEDS4;//设置LED4灯亮
}
else
{
IO0SET=BEEP;//松开则停止蜂鸣
IO1SET=LEDS4;//设置LED4灯灭
}
for(i=0;i<1000;i++);
//软件延时
}
return0;
}
内容三
实验步骤①启动ADS1.2IDE集成开发环境,选择ARMExecutableImageforlpc2131工程模板建立一个工程BEEP_key。②在user组里编写主程序代码main.c。③选用DebugInFLASH生成目标,然后编译链接工程。④将EasyARM教学实验开发平台上的相应管脚跳线短接。⑤选择Project->Debug,启动AXD进行JLINK仿真调试。⑥全速运行程序,程序将会在main.c的主函数中停止。如下图所示:
⑦单击ContextVariable图标按钮(或者选择ProcessorViews->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择SystemViews->DebuggerInternals即可打开LPC2000系列ARM7微控制器的片内外寄存器窗口。
通过变量窗口可以观察变量BEEP、KEY1等的值和ARM7微控制器的片内外寄存器窗口。如下图所示:
⑧可以单步运行程序,先按下Key1,观察IO0PIN寄存器的值,然后断开Key1,观察IO0PIN寄存器的值。可以设置/取消断点;或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正确。如下图所示:
图4.12未按下Key1时IO0PIN的值
图4.13按下Key1时IO0PIN的值
由上两图可知,当按下Key1时,IO0PIN寄存器的第16位由1变为0(F变为E),key1与P0.16相连,按下Key1时,P0.16管脚输出电平由1变为0,寄存器值变化,蜂鸣器响,流水灯亮,说明控制是正确的。
现象描述:当按下按键KEY1时,蜂鸣器鸣响,流水灯亮;松开后,蜂鸣器静音,流水灯灭。
源代码如下:#include"config.h"
constuint32BEEP=1<<7;//P0.7控制蜂鸣器constuint32KEY=1<<16;//P0.16连接KEY1constuint32LEDS8=0xFF<<18;//P1[25:18]控制LED8~LED1,低电平点亮
voidDelayNS(uint32dly){uint32i;
for(;dly>0;dly--){
for(i=0;i<50000;i++);}}
/*********************************************************************************************函数名称:liushuideng()**函数功能:流水灯显示实验。**调试说明:连接跳线JP12至LED8~LED1。*******************************************************************************************//*流水灯花样,低电平点亮,注意调用时候用了取反操作*/constuint32LED_TBL[]={
0x00,0xFF,//全部熄灭后,再全部点亮0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81//从两边叠加后递减};intliushuideng(void){uint8i;PINSEL1=0x00000000;//设置管脚连接GPIOIO1DIR=LEDS8;//设置LED控制口为输出while(1){for(i=0;i<42;i++){/*流水灯花样显示*/IO1SET=~((LED_TBL[i])<<18);DelayNS(20);IO1CLR=((LED_TBL[i])<<18);DelayNS(20);}}return0;}
//主函数
intmain(void){uint32i;PINSEL0=0x00000000;//所有管脚连接GPIOPINSEL1=0x00000000;IO0DIR=BEEP;//蜂鸣器控制口输出0
while(1)
{if((IO0PIN&KEY)==0)
{for(i=0;i<1000;i++);
//软件延时
{
IO0CLR=BEEP;//如果KEY按下,蜂鸣器鸣叫
liushuideng();
}
}
else
{
IO0SET=BEEP;//松开则停止蜂鸣
IO1SET=LEDS8;
}
for(i=0;i<100;i++);
//软件延时
}
return0;
}
六、思考题1、如果将P0.30设置为GPIO输入模式,且管脚悬空,那么读取P0.30
得到的值是0还是1?或者是不确定?当管脚悬空时,该管脚有可能是高电平也有可能是低电平。读取
IO0PIN的值并不能确定管教的值。有时管脚是高电平,读取到的不一定是高电平。2、如果需要读取当前P0.7的输出值(不是管脚上的电平),如何实现?
将该管脚与一个LED连接,若LED亮,则输出值为0,否则为1.
篇二:gpio输入输出实验报告
班级
学号
姓名
实验日期
室温
大气压
成绩
实验题目:GPIO输出实验——按键输入检测实验
一、实验目的:
1、通过本实验学会ARM7.0软件的安装及掌握对该软件和EasyJTAG仿真器的使用;2、了解EasyARM2131开发板硬件结构,掌握各引脚功能和接线;3、掌握相关实验的程序,并能作出简单的修改并实现其功能;4、掌握GPIO输出实验---按键输入的检测。二、实验仪器:EasyARM2131开发板一块及相关导线、计算机一台三、实验原理:下面是工程窗口中的图标介绍:
如图4.2所示,当P0口连接GPIO且用于输入时,如用于检测按键的时候,由于P0口作GPIO输入时,内部无上拉内阻,所以需要加10K左右的上拉电阻,把I/O口拉到高电平。
当P0口用于GPIO输入时(如按键输入),内部无上拉电阻,需要加上拉电阻,电路如图4.14
图4.14按键输入原理图实验通过跳线JP8连线KEY3_P0.18,程序检测按键KEY3的状态,控制蜂鸣器BEEP的蜂鸣。在实验中,需要将按键KEY3输入口P0.18设为输入口,而蜂鸣器控制口P0.7设为输出口。蜂鸣器电路如图1.11所示,当跳线JP6连线蜂鸣器时,P0.7控制蜂鸣器,低电平时蜂鸣器蜂鸣。
程序首先设置管脚连线寄存器PINSEL0和PINSEL1,设置P0.7为输出。然后检测端口P0.18的电平,对P0.7进行相应的控制,流程图如图4.15所示,实现程序见程序清单4.7。
四、实验步骤:1、接好开发板与计算机的相关接线2、打开已安装好的H-JTAG和H-Flasher软件,并在H-Flasher软件中选择FlasherSelation→PHILIPS→LPC2318;然后再选择Programming→check。
操作过程中出现的窗口如下图(1)、(2)所示:
图(1)
图(2)
3、MetrowerksCodeWarriorforARMDeveloperSuitev1.2软件,点击File选择Open打开GPIO输出实验——按键输入检测实验文件夹,选择GPIO_Leds8-2.mcp文件,双击main.c,打开主程序,并运行检查是否出现错误,无误后点击Dubeg按钮;
操作过程中的窗口如下图(3)、(4)所示:
图(3)
图(4)
4、出的AXD窗口中选择Options,点击configuretarget后,在跳出的choosetarget窗口中点击Ok,点击运行按钮(若点击运行按钮,开发板中的LED不会亮)则在PIO_Leds8-a.mcp窗口中点击Run按钮运行,并观察开发板上出现的现象是否符合实验要求
窗口如下图(5)所示:
图(5)
5、程序清单4.7:按键输入程序如下
#include"config.h"constuint32BEEP=1<<7;constuint32KEY1=1<<18;/*
//P0.7控制蜂鸣器//P0.18连接KEY3
***********************************************************
**********************************************
**函数名称:main()
**函数功能:GPIO输入实验测试。
**
检测按键KEY3。KEY3按下,蜂鸣器蜂鸣,松开后停
止蜂鸣。
**跳线说明:把JP8的KEY3跳线短接,JP11连接蜂鸣器。
***********************************************************
**********************************************
*/
intmain(void)
{
PINSEL0=0x00000000;
//所有管脚连接GPIO
PINSEL1=0x00000000;
IO0DIR=BEEP;
//蜂鸣器控制口输出,其余输入
while(1)
{
if((IO0PIN&KEY3)==0)IO0CLR=BEEP;//如果KEY3
按下,蜂鸣器鸣叫
elseIO0SET=BEEP;
//松开则停止蜂鸣
}
return0;
}
五、实验结果心得体会:
1、修改程序之后的实验现象是:如果KEY1按下,蜂鸣器蜂鸣;松开则停止蜂鸣。2、实验心得(1)本实验可通过改变不同的I/O接口时,其按下不同的按键,一
样来实现蜂鸣器的响与停。如本实验也口P0.17连接KEY2,以此类推。(2)通过本实验不仅懂得了对RAM7.0软件的安装和使用,并对EasyARM2131开发板的基本结构有了一定的认识,更重要的是对其实验程序如何实验其功能有了一定的认识,并能对其某一句程序作相应的修改,使其实现我们所需的功能。(3)通过此实验,我也初步了解了GPIO各寄存器的功能与应用,知道了GPIO的应用电路,此按键输入检测实验是需要上拉电阻的。另外,我们可由书本知识可知,也有无需上拉电阻的GPIO。
篇三:gpio输入输出实验报告
利用nsmod命令实实加实实实模实同实利用lsmod命令实看实实模实的加实情行八段实实实实实程序segtest在平台实端实示实实实实程11步
实验七I/O口驱动实验
一、实验目的:
1、了解PXA270微处理器GPIO的功能2、熟悉PXA270微处理器GPIO驱动程序的编写方法3、掌握驱动程序的加载过程和方法
二、实验环境(软件与硬件):
软件环境:VMwareWorkstation硬件环境:pc机、arm机
三、实验过程和结果(包括编写的程序与结果,结果要截图)
第1步:利用vi编辑器,编写一个xsb_seg.c驱动代码;(1)增加驱动所需的头文件和变量#include<linux/module.h>#include<linux/kernel.h>#include<asm/io.h>#include<asm/uaccess.h>#include<linux/fs.h>MODULE_LICENSE("GPL");charLED_MODULE=0;#defineDEVICE_NAME"xsb_seg"#defineSEG_CS10x10300000#defineSEG_CS20x10400000staticcharLED[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F};
unsignedlong*CS1_Address,*CS2_Address;structseg{
charLED1_Val;charLED2_Val;charLED3_Val;charLED4_Val;charnegative;};(2)同时更新所有七段数码光驱动管显示函数staticvoidUpdateled(structseg*seg_7){unsignedshortbuff=0x00;buff=seg_7->LED1_Val;buff=buff|(seg_7->LED2_Val<<8);writew(buff,CS1_Address);
buff=0x00;buff=seg_7->LED3_Val;buff=buff|(seg_7->LED4_Val<<8);writew(buff,CS2_Address);return;}(3)写具体某位七段数码光驱动管显示函数voidvalue_seting(structseg*seg_7,charposition,charvalue){if(seg_7->negative==0)
value=~value&~(0x1<<7);else
value=(0x1<<7)|value;
if(position==1)seg_7->LED1_Val=value;
elseif(position==2)seg_7->LED2_Val=value;
elseif(position==3)seg_7->LED3_Val=value;
elseif(position==4)seg_7->LED4_Val=value;
}(4)实现七段数码光驱动写操作函数staticssize_tXSB_Seg_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
inti;structseg*seg_7=file->private_data;charled_forall[4];printk(KERN_EMERG"TheModuleiswritten,XSB_Seg_write\n");if(count!=4){
printk(KERN_EMERG"thecountofinputisnot4!!");return0;}if(copy_from_user(led_forall,buffer,4)){for(i=1;i<=4;i++){
value_seting(seg_7,i,LED[led_forall[i-1]]);}Updateled(seg_7);}return0;}(5)实现七段数码管驱动IOCTL操作函数staticintXSB_Seg_ioctl(structinode*ip,structfile*fp,unsignedintcmd,unsignedlongarg){charval=0x00;structseg*seg_7=fp->private_data;if(!arg)return-EINVAL;if(copy_from_user(&val,(int*)arg,sizeof(char)))return-EFAULT;switch(cmd){case1:
value_seting(seg_7,1,val);break;case2:value_seting(seg_7,2,val);break;case3:value_seting(seg_7,3,val);break;case4:value_seting(seg_7,4,val);break;case0:seg_7->negative=LED_MODULE;
break;default:
printk(KERN_EMERG"ioctlparametererror,pleaseinputnumber0-4");
break;}Updateled(seg_7);return0;}
(6)实现七段数码管驱动打开操作函数staticintXSB_Seg_open(structinode*inode,structfile*filp){
structseg*seg_7;printk(KERN_EMERG"TheModuleisopen,XSB_Seg_open\n");seg_7=kmalloc(sizeof(structseg),GFP_KERNEL);filp->private_data=seg_7;
return0;}
(7)实现七段数码管驱动释放函数staticintXSB_Seg_release(structinode*inode,structfile*filp){
printk(KERN_EMERG"TheModuleisrelease,XSB_Seg_release\n");kfree(filp->private_data);return0;}(8)七段数码管驱动文件结构体定义staticstructfile_operationsEmdoor_fops={open:XSB_Seg_open,write:XSB_Seg_write,release:XSB_Seg_release,ioctl:XSB_Seg_ioctl,owner:THIS_MODULE,};
(9)实现七段数码管驱动初始化函数staticint__initXSB_Seg_init(void){
intret;printk(KERN_EMERG"TheModuleisInit,XSB_Seg_init\n");CS1_Address=ioremap(SEG_CS1,4);CS2_Address=ioremap(SEG_CS2,4);
ret=register_chrdev(61,DEVICE_NAME,&Emdoor_fops);if(ret<0){
printk(DEVICE_NAME"can'tgetmajornumber\n");returnret;}return0;}
(9)实现七段数码管驱动模块退出函数与模块描述staticvoid__exitXSB_Seg_exit(void){
printk(KERN_EMERG"TheModuleisExit,XSB_Seg_exit\n");iounmap(CS1_Address);iounmap(CS2_Address);unregister_chrdev(61,DEVICE_NAME);}
module_init(XSB_Seg_init);module_exit(XSB_Seg_exit);MODULE_AUTHOR("Ben.li,ben.li@emdoor.com.cn");MODULE_DESCRIPTION("Thisisa8SegmentLeddriverdemo");
第2步:利用vi编辑器,编写一个用于编译xsb_seg.c驱动架构Makefile文件;
#
Makefileforthe8Segment_LedDriver.#
CFLAGS+=$(DEBFLAGS)-Wall
ifneq($(KERNELRELEASE),)obj-m:=xsb_seg.o
elseKERNELDIR?=/root/work/linux-2.6.22.10PWD:=$(shellpwd)
ALL:$(MAKE)$(CFLAGS)-C$(KERNELDIR)M=$(PWD)
endif
modules
clean:rm–fr*.o*.ko*~core.depend.*.cmd*.mod.c.tmp_versions
第3步:运行make编译命令,用ls命令查看编译后的结果,在该目录中应生成xsb_seg.ko模块文件,利用file命令查看xsb_seg.ko文件的格式,应为ARM格式的ELF文件。
第4步:利用vi编辑器在test目录下编译测试驱动的seg_test.c源文件。
/************************************************
*************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<linux/kernel.h>
#include<unistd.h>
typedefunsignedcharu8;
#defineSEG_DEV
"/dev/xsb_seg"
charnumber[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F};voidclear_led(intfd){
inti;charval=0;for(i=1;i<=4;i++)
ioctl(fd,i,&val);sleep(1);}
voiddisplay_led(intfd){
inti;charval=0x7f;for(i=1;i<=4;i++)
ioctl(fd,i,&val);sleep(1);}
voidappear_same(intfd){
chari,j,base=0;for(j=0,base=0;j<=9;j++,base++){
for(i=1;i<=4;i++)ioctl(fd,i,number+base);sleep(1);}
}voidappear_roll(intfd){
chari,j,base=0;for(j=0,base=0;j<=9;j++,base++){
for(i=1;i<=4;i++)ioctl(fd,i,number+(base+i-1)%10);
sleep(1);}}
voiddisplay_menu()
{
printf("
*****ChoiceMenu*********\n");
printf("
[0]OpenDevice\n");
printf("
[1]DisplaySame\n");
printf("
[2]RollDisplay\n");
printf("
[3]AllDisplay\n");
printf("
[4]ClearDisplay\n");
printf("
[5]WriteDisplay\n");
printf("
[C]CloseDevice\n");
printf("
[x]ExitTest\n");
printf("
***********************\n");
printf("Pleaseinputyourchoise:");
}
intmain(intargc,char**argv){
intfd=-1;charch=0x00;unsignedcharled[4]={2,0,0,8};display_menu();while(1){
ch=getchar();switch(ch)
{case'0':
if(fd>0)printf("##SEGDevicehasbeenopen##%d\n",fd);
else{fd=open(SEG_DEV,O_RDWR);if(fd<0)printf("####SEGDeviceopenFail####\n");elseprintf("####SEGDeviceopenSuccess####%d\n",fd);
}display_menu();break;case'1':if(fd>0){
appear_same(fd);clear_led(fd);}else
printf("##SEGDeviceisNOTopen##\n");display_menu();break;
case'2':if(fd>0){
appear_roll(fd);clear_led(fd);}else
printf("##SEGDeviceisNOTopen##\n");display_menu();break;case'3':if(fd>0)display_led(fd);elseprintf("##SEGDeviceisNOTopen##\n");display_menu();break;case'4':if(fd>0)clear_led(fd);elseprintf("##SEGDeviceisNOTopen##\n");display_menu();
break;case'5':if(fd>0)
write(fd,led,4);else
printf("##SEGDeviceisNOTopen##\n");display_menu();break;case'c':case'C':if(fd>0){clear_led(fd);sleep(1);close(fd);printf("##SEGDeviceisclosedsuccess##\n");fd=-1;}display_menu();
break;case'x':
case'X':if(fd>0){
clear_led(fd);sleep(1);close(fd);}exit(0);
break;
}}return(0);}
第5步:利用vi编辑器,编写一个用于编译seg_test.c的Makefile文件;其中CC=/opt/arm-linux/bin/arm-linux-gcc为交叉编译工具所在的路径位置,INCLUDEDIR=/opt/arm-linux/arm-linux/include为头文件所在的路径CC=/opt/arm-linux/bin/arm-linux-gcc
INCLUDEDIR=/opt/arm-linux/arm-linux/includeCFLAGS=-I..-I$(INCLUDEDIR)
TARGET_TEST=seg_testOBJ_TEST=$(TARGET_TEST)
SOURCE_TEST=$(TARGET_TEST).cALL:
$(CC)$(CFLAGS)-o$(OBJ_TEST)$(SOURCE_TEST)clean:
rm-rf$(OBJ_TEST)第6步:运行make命令对seg_test.c源代码进行编译,用ls命令查看编译后的结果,利用file命令查看seg_test文件的格式,应为ARM格式的ELF文件。
第7步:在Linux操作系统下输入minicom,配置串口参数,然后打开EELiod目标平台电源,平台启动后,按CTRL+A,然后按Z,启动串口命令界面,按S键,选择zmodem传输方式;按回车
第8步:选择PC平台中驱动模块文件xsb_seg.ko和驱动测试文件seg_test,并按回车键。下载选中的文件,文件下载完毕后按ESC键,退出串口传输,返回目标平台界面。第9步:在目标平台终端利用mknod命令建立设备文件节点;并利用insmod命令动态加载驱动模块,同时利用lsmod命令查看驱动模块的加载情况,
第10步:在目标平台终端运行八段数码驱动测试程序seg_test,在平台终端将显示驱动测试程序菜单。
第11步:在平台终端显示驱动测试程序菜单输入提示输入数字“0”。驱动测试程序将通过open函数打开设备文件,同时内核调用驱动程序的**x_open函数,在平台终端可以查看驱动和测试程序调试输出信息。
第12步:在平台终端显示驱动测试程序菜单输入提示分别输入数字“1”、“2”、“3”、“4”,查看平台4个7段数码管的显示情况,并分析测试程序通过调用什么函数与驱动进行通信?
第13步:在平台终端显示驱动测试程序菜单输入提示分别输入数字“5”、查看
平台4个7段数码管的显示情况,并分析测试程序通过调用什么函数与驱动进行通信?
第14步:在平台终端显示驱动测试程序菜单输入提示分别英文字符“C”或“c”,然后再输入“1~5”任何数字,查看测试程序的输出情况,并分析测试程序通过调用什么函数与驱动进行通信?
第15步:在平台终端显示驱动测试程序菜单输入提示分别英文字符“X”或“x”,退出测试程序。
第16步:在平台终端输入dmesg命令,查看驱动程序在加载和测试过程中输出消息,并分析驱动代码,查看输出信息。
四、实验总结
在做本次实验过程中,遇到很多问题,例如是pc机跟XSBase270实验开发箱的连接问题,把bootloader烧写到实验箱等等问题,在同学或网上找资料的帮助下,一步一步的把问题慢慢的解决,从而成功的把本次实验做好。
推荐访问:gpio输入输出实验报告 输入输出 实验 报告