gpio输入输出实验报告3篇

gpio输入输出实验报告3篇gpio输入输出实验报告  实验四GPIO输入实验  一、实验目的  1、能够使用GPIO的输入模式读取开关信号。2、掌握GPIO相关寄存器的用法和设置。3、掌下面是小编为大家整理的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输入输出实验报告 输入输出 实验 报告