欢迎来到专业的辛易范文网平台! 工作总结 工作计划 心得体会 思想汇报 发言稿 述职报告 教案设计 申请书大全
当前位置:首页 > 范文大全 > 调查报告 > 正文

嵌入式系统gpio实验报告10篇

时间:2022-09-09 13:30:03 来源:网友投稿

嵌入式系统gpio实验报告10篇嵌入式系统gpio实验报告 西安邮电大学嵌入式实验4—GPIO 西安邮电大学 (计算机学院) 课内实验报告 实验名称: GPIO的控制实验 专业名称:下面是小编为大家整理的嵌入式系统gpio实验报告10篇,供大家参考。

嵌入式系统gpio实验报告10篇

篇一:嵌入式系统gpio实验报告

邮电大学嵌入式实验 4—GPIO

 西 安 邮 电 大 学

  (计算机学院)

  课内实验报告

  实验名称:

  GPIO 的控制实验

  专业名称:班

 级:

 1103

  学生姓名:学号(8 指导教师:

 蒋历

  实验日期:

  2014

 年 04

  月

 22

 日

  一. 实验目的及实验环境

  ⒈理解 ARM 芯片 GPIO 模块(部件)工作原理。

  ⒉掌握 GPIO 控制方法。

  ⒊应用 GPIO 驱动 LED、Beeper(蜂鸣器)、检测按键。

  ⒋学会使用具体的开发板,查看其电路图,并编写程序对其进行控制。

 ⒌掌握具体的真实的 ARM 芯片(LPC2131)其 GPIO 模块。

  实验环境:

  Windows 98/XP/2000 系统,ADS1.2 集成开发环境

  二. 实验内容

  ⒈利用 GPIO 控制蜂鸣器蜂鸣、LED 灯亮灭、流水灯。

  ⒉利用 GPIO 检测按键。

  三.方案设计

  LPC2131芯片内部有GPIO模块部件,可以控制GPIO引脚的电平变化、也可以检测 GPIO 引脚的电平变化,通过芯片引脚供应用人员连接使用。

 电路板中 GPIO 引脚与 Beeper、LED、按键的连接已经连接好,请注意查看其引脚的分配。

 ⒈Beeper 控制原理:先查看图 4.1 的电路图,由图知道当P0.7 引脚输出低电平时,三极管导通,集电极放大电流驱动 BUZZER 蜂鸣;当 P0.7 引脚输出高电平时,三极管不导通,BUZZER 不蜂鸣;电平持续的时间决定了集电极中电流持续的时间,故通过控制 P0.7 高低电平的持续时间,即可控制 BUZZER。

  ⒉8 路 LED 灯控制原理:先查看图 4.3 的电路图,由图知 8 路 LED (LED1~LED8)由 P1.18~P1.25 连接,每个 LED 接一个 470 的限流电阻,采用灌电流方式驱动 LED,当引脚输出低电平时,两端形成压降,LED 点亮;当引脚输出高电平时,无压降形成,LED 熄灭。通过控制引脚高低电平的持续时间可以控制 LED 的亮灭。流水灯是按不同规律控制引脚的电平持续时间完成的。

  ⒊按键输入检测原理:P0.16~P0.21 连接 KEY1~KEY6,当无按键按下时引脚为高电平,当键按下时,引脚为低电平。通过检测引脚的输入电平来判断是否有键按下。通过 CPU 读写 GPIO 部件的寄存器完成 GPIO 模块的工作配置。LPC2131 有 2 个 32 位的通用 I/O 口。PORT0 使用了 30 个引脚,PORT1 有多达 16 个引脚可用作 GPIO 功能。PORT0 和 PORT1 由 2 组(4 个)寄存器控制,如表 4.1 所示。具体寄存器每位含义和使用请查看书籍或者 LPC2131 芯片资料。

  GPIO 寄存器映射:

  ⒋实验硬件原理图 ⑴BEEPER 控制电路

  ⑵按键检测输入电路

 ⑶8 路 LED 控制电路

  四.测试数据及运行结果

  设置 GPIO,P0.7 为低电平时,蜂鸣器蜂鸣,为高时,蜂鸣器停止蜂鸣。P1.18-P1.25 控制 LED1-LED8,低电平时成功点亮 LED。

  五.总结

  本次实验主要是控制LPC2131开发板的蜂鸣器和8 路LED硬件电路完成一定功能,通过设置 GPIO 的初始值,可以对特定的 IO 管脚进行输出逻辑操作,从而达到对硬件电路的控制。在本次试验中,刚开始由于接口接触不良导致连接处错,经仔细查找后,运行顺利。

  六.附录:源代码(电子版)

  #include "config.h"

  #define BEEP 1 << 7 // P0.7 控制蜂鸣器,低电平蜂鸣

  #define LED 0xFF << 18 //P1.18-P1.25 控制 LED1-LED8,低电平点亮

 #define KEY1 1 << 16 //P0.16 连接 KEY1

  void beeper_LEDshow()

  {

  PINSEL0 = 0x00000000; // 设置管脚连接 GPIO

  IO0DIR = BEEP; // 设置 P0.7(连接 BEEP)为输出

  PINSEL2 = PINSEL2 & (~0x08);

  IO1DIR = LED ; //设置 P1.18-P1.25 为输出

  while (1)

  {

 if((IO0PIN & KEY1) == 0)

  //KEY1 按下,BEEP 蜂鸣,LED1-LED8 点亮

  {

  IO0CLR = BEEP; // BEEP 蜂鸣

  IO1CLR = LED ; //LED1-LED8 点亮

  }

  else

  {

  IO0SET =BEEP; // BEEP 停止蜂鸣

  IO1SET = LED ; //LED1-LED8 熄灭

  }

  }

  }

  int main (void)

 {

  beeper_LEDshow();

 return 0;

 }

篇二:嵌入式系统gpio实验报告

式系统原理及其应用报告[1] 实验名称 GPIO 输出实验 课程名称

 嵌入式系统原理及其应用

 实验时间

  XX 年 XX 月 XX 日

 实验地点 S111

  组号

  同组人

  成绩

  一、实验目的 1. 熟悉 RVDS2.2 集成开发环境及 ARMulator 软件仿真。

 2. 熟悉基于 ARM 的 PROTEUS 仿真方法。

 3、基本掌握基于 ARM 的 C 语言程序设计方法。

 4. 熟悉 LPC2000 系列 ARM 微控制器的 GPIO 输出控制方法。

 二、实验环境 1、硬件:PC 机一台 2、软件:Windows 系统、RVDS2.2 开发软件、protues 电路仿真软件

 三、实验内容和实验步骤 1.实验内容:

  将LPC2124的P0.0引脚设置为GPIO,然后控制其外接的LED灯闪烁(时间自定),用Proteus软件仿真演示。

 2.实验步骤:

 (1)启动 PC 机,打开 PROTEUS 软件,按照如下图画好仿真电路图。

 (画出电路图)

 (2)打开 RVDS2.2 软件,用 C 语言编写一个驱动外接 LED 等闪烁的程序。

 写出程序 (3)按照 PROTEUS 仿真 LPC2124 的步骤仿真调试 写出调试步骤并分析出结果

 四、实验分析与实验心得 一定要写

 五、问题和建议

 六、实验评价

 嵌入式系统原理及其应用报告[2] 实验名称 GPIO 输入输出实验 课程名称

 嵌入式系统原理及其应用

 实验时间

  XX 年 XX 月 XX 日

 实验地点 S111

  组号

  同组人

  成绩

  一、实验目的 1. 熟悉 RVDS2.2 集成开发环境及 ARMulator 软件仿真。

 2. 熟悉基于 ARM 的 PROTEUS 仿真方法。

 3、基本掌握基于 ARM 的 C 语言程序设计方法。

 4. 熟悉 LPC2000 系列 ARM 微控制器的 GPIO 输入与输出控制方法。

 5. 掌握 LPC2000 系列 ARM 微控制器寄存器的设置方法。

 二、实验环境 1、硬件:PC 机一台 2、软件:Windows 系统、RVDS2.2 开发软件、protues 电路仿真软件

 三、实验内容和实验步骤 1.实验内容:

  将 LPC2124 的 P0.0-8 引脚设置为 GPIO,然后用按键控制其外接的 8 个 LED 灯闪烁(时间自定),用 Proteus 软件仿真演示。

 2.实验步骤:

 (1)启动 PC 机,打开 PROTEUS 软件,按照如下图画好仿真电路图。

 (画出电路图)

 (2)打开 RVDS2.2 软件,用 C 语言编写一个驱动外接 LED 等闪烁的程序。

 写出程序 (3)按照 PROTEUS 仿真 LPC2124 的步骤仿真调试 写出调试步骤并分析出结果

 四、实验分析与实验心得 一定要写

 五、问题和建议

 六、实验评价

篇三:嵌入式系统gpio实验报告

入式操作系统及应用》 实验报告

  班

 级:

 学

 号:

 姓

 名:

 教

 师:

  实验 1 LINUX SHELL 程序设计实验 ....................................................................................................................... 3 1.1 实验目的 ........................................................................................................................... 3 1.2 实验内容 ........................................................................................................................... 3 (1)编写并调试一个简单的回显用户名的 shell 程序 ..................................................... 3 1.3 实验步骤 ........................................................................................................................... 3 1.4 实验结果 ............................................................................................................................ 6 1.5 实验结果分析 ................................................................................................................... 8 实验 3 LED 跑马灯实验 ........................................................................................................................................... 8 3.1 实验目的 ........................................................................................................................... 8 3.2 实验内容 ........................................................................................................................... 8 3.3 实验步骤 ........................................................................................................................... 8 3.4 实验结果 ......................................................................................................................... 10 3.5 实验结果分析 .................................................................................................................. 10 实验 5 TCP 通信实验 ............................................................................................................................................. 10 5.1 实验目的 ......................................................................................................................... 10 5.2 实验内容 ......................................................................................................................... 10 5.3 实验步骤 .......................................................................................................................... 10 5.4 实验结果 .......................................................................................................................... 13 5.5 实验结果 .......................................................................................................................... 13 实验 7 虚拟字符设备驱动程序实验 ..................................................................................................................... 13 7.1 实验目的 ......................................................................................................................... 13 7.2 实验内容 ......................................................................................................................... 13 7.3 实验步骤 ......................................................................................................................... 14 7.4 实验结果 ......................................................................................................................... 19 7.5 实验结果分析 ................................................................................................................. 19

 实验 1 Linux shell 程序设计实验

 1.1 实验目的 理解 Shell 程序的设计方法,熟悉 Shell 程序的编辑、运行、调试方法与过程。

 1.2 实验内容

 (1)编写并调试一个简单的回显用户名的 shell 程序 (2)使用 if-then 语句创建简单的 shell 程序 (3)使用 if-then-else 语句创建一个根据输入的分数判断是否及格的 shell 程序 (4)使用 case 语句创建一个菜单选择的 shell 程序。

 (5)使用 for 语句创建简单的 shell 程序 (6)使用 for 语句创建求命令行上所有整数之和的 shell 程序 (7)使用 while 语句创建一个计算 1-5 的平方的 shell 程序 (8)使用 while 语句创建一个根据输入的数值求累加和(1+2+3+4+…+n)的 shell 程序 (9)使用 until 语句创建一个计算 1-5 的平方的 shell 程序 (10)使用 until 语句创建一个输入 exit 退出的 shell 程序。

 1.3 实验步骤 (1)编写并调试一个简单的回显用户名的 shell 程序 #!/bin/bash #filename:date echo "Mr.$USER,Today is:" echo "date" echo Wish you a lucky day!

 (2)使用 if-then 语句创建简单的 shell 程序 #!/bin/bash #filename:bbbb echo -n "Do you want to continue: Y or N" read ANSWER if [ $ANSWER=N -o $ANSWER=n ] then

 exit fi

 (3)使用 if-then-else 语句创建一个根据输入的分数判断是否及格的 shell 程序

 #!/bin/bash #filename:ak echo -n "please input a score:" read SCORE echo "You input Score is $SCORE" if [ $SCORE -ge 60 ]; then

 echo -n "Congratulation!You Pass the examination." else echo -n "Sorry!You Fail the examination!" fi echo -n "press any key to continue!" read $GOOUT

 (4)使用 case 语句创建一个菜单选择的 shell 程序。

 #!/bin/bash #filename:za #Display a menu echo _ echo "1 Restore" echo "2 Backup" echo "3 Unload" echo

 #Read and excute the user"s selection echo -n "Enter Choice:" read CHOICE case "$CHOICE" in 1) echo "Restore";; 2) echo "Backup";; 3) echo "Unload";; *) echo "Sorry $CHOICE is not a valid choice exit 1 esac

 (5)使用 for 语句创建简单的 shell 程序 #!/bin/bash #filename:mm for ab in 1 2 3 4 do

 echo $ab done

  (6)使用 for 语句创建求命令行上所有整数之和的 shell 程序 #!/bin/bash #filename:qqq sum=0 for INT in $* do

 sum="expr $sum + $INT" done

 echo $sum

 (7)使用 while 语句创建一个计算 1-5 的平方的 shell 程序 #!/bin/bash #filename:zx int=1 while [ $int -le 5 ] do

 sq="expr $int \* $int" echo $sq int="expr $int + 1" done echo "Job completed"

 (8)使用 while 语句创建一个根据输入的数值求累加和(1+2+3+4+…+n)的 shell 程序 #!/bin/bash #filename:sum echo -n "Please Input Number:" read NUM number=0 sum=0 while [ $number -le $NUM ] do echo number echo "$number" number=" expr $number + 1 " echo sum echo "$sum" sum=" expr $sum + $number " done

 echo

  (9)使用 until 语句创建一个计算 1-5 的平方的 shell 程序 #!/bin/bash #filename:xx int=1 until [ $int -gt 5 ] do sq="expr $int \* $int" echo $sq int="expr $int + 1" done

 echo "Job completed"

 (10)使用 until 语句创建一个输入 exit 退出的 shell 程序。

 #!/bin/bash #filename:hk echo "This example is for test until....do " echo "If you input [exit] then quit the system " echo -n "please input:" read EXIT until [ $EXIT = "exit" ] do

 read EXIT done echo "OK!" 1.4 实验结果 (1)回显用户名的 shell 程序

 (2)用 if-then 语句创建简单的 shell 程序

  (3)用 if-then-else 语句创建一个根据输入的分数判断是否及格

 (4)用 case 语句创建一个菜单选择的 shell 程序

 (5)用 for 语句创建简单的 shell 程序

 (6)用 for 语句创建求命令行上所有整数之和

  (7) 用 while 语句创建一个计算 1-5 的平方

  (8)用 while 语句创建一个根据输入的数值求累加和(1+2+3+4+…+n)

  (9) 用 until 语句创建一个计算 1-5 的平方

 (10) 用 until 语句创建一个输入 exit 退出

 1.5 实验结果分析 这节课的实验只要熟悉 Shell 程序的编辑、运行、调试方法与过程,结果请参照内容。

 实验 3 LED 跑马灯实验 3.1 实验目的 1、 掌握通过文件系统操作 I/O 设备的方法; 2、 学会使用 S3C2410 的 GPIO 设备实现简单的功能。

 3.2 实验内容 使用 1×4 键盘控制 LED 显示,LED8~LED5 四个 LED 灯分别对应 KEY1~KEY4,显示对应按键的状态。如 KEY1按下则点亮 LED8,KEY1 抬起则熄灭 LED8。

 3.3 实验步骤 1、 按照实验原理和流程图的描述编写程序,并保存成.c 源程序文件; 2、 在Linux下,运行命令“arm-linux-gcc –o ex02_LED_Key ex02_LED_Key.c”编译实验程序; 3、 使用跳线将GND与JP6 的A短接,使用跳线帽将JP6 的 1~3 分别与CH0、CH1、CH2、CH3相连,然后用跳线帽将J32 的COM与GND连接; 4、 注意只连接LED灯的J32、4X4 键盘的JP6、LCD背光J13 和串口的JP3,其他接口的跳线均去掉; 5、 加载 GPIO 驱动到内核中,GPF 驱动范例路径为“光盘资料\实验指导书\SP-32AM11B— ARM9+Score7 双 核 实 验 箱\1.Kernel_Exa\ex02_LED_Key\gpio_driver\s3c2410_gpio.ko”,在实验箱上使用下面命令转载 GPIO 驱动到内核; # insmod s3c2410_gpio.ko 或 . /auto.sh 6、 下载测试程序到实验箱上并运行,依次 按下K1~K4 键,观察LED8~LED5 是否按照各个按键的状态点亮。

 程序源代码:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include "gpio.h" #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h>

 int main(int argc, char *argv[]) {

 unsigned short KEY = 0;

 int gpio = open("/dev/s3c2410_gpio", O_RDWR);

 //打开IO口设备文件

 if(gpio<0)

 {

  perror("dev gpf open:");

  _exit(1);

 }

  while(1)

 {

  ioctl(gpio, GPG|GPIO_UP_ON, GPIO_PIN_BIT(8,11));

 //配置GPG口8到11位使能上拉

 ioctl(gpio, GPG|GPIO_IN, GPIO_PIN_BIT(8,11));

 //配置GPG口8到11位为输入

  read(gpio, &KEY, sizeof(KEY));

 //读取IO口数据

  KEY ^=0x0f00;

  KEY >>=8;

  printf("KEY = 0x%04x\n", KEY);

  ioctl(gpio, GPF|GPIO_OUT, GPIO_PIN_BIT(0,7));

  //配置GPF口第四位为输出

  write(gpio, &KEY, sizeof(KEY));

 //写IO口数据

  usleep(1000*100);

 }

 if(close(gpio)==-1)

  perror("dev close:");

  return 0; }

 3.4 实验结果

  3.5 实验结果分析 K1=1;K2=2;K3=4;K4=8;;K1+K2=3;K1+K3=5......K1+K2+K3+K4=15;同时按键上方会亮起相应的指示灯

 实验 5 TCP 通信实验 5.1 实验目的 1、 掌握 TCP 网络的基本原理; 2、 掌握使用 Socket 进行 TCP 网络开发的基本方法。

 5.2 实验内容 编写程序在实验箱上实现一个 TCP 服务器,实现接收网络数据并将收到的网络数据发送给客户端的功能。

 5.3 实验步骤 1、 按 照 实 验 原 理 的 描 述 编 写 程 序 , 并 保 存 成 .c 源 程 序 文 件 ( 本 例 中 保 存 文 件 名 为 ex16_TCPEchoServer.c),(或可参考实验代码“光盘资料\实验指导书\SP-32AM11B—ARM9+Score7 双核实验箱\4.Net_Exa\ex16_TCPEchoServer.c 目录下的文件); 2 、 在 Linux 环 境 下 , 输 入 编 译 命 令 “ arm-linux-gcc -o ex16_TCPEchoServer ex16_TCPEchoServer.c”编译实验程序; 3、 将生成的 ex16_TCPEchoServer 文件复制到目标板,详细过程参考实验“实验二 Linux 开发平台建立实验;

 4、 使用网线将双核实验箱和与 PC 相连,注意只连接 LCD 背光 J13、串口的 JP3 和网络的 JP2 接口,其他接口的跳线均去掉; 5、 使用 ifconfig 命令配置开发板的以太网接口,同时配置 PC 机的 IP 地址,使 PC机和实验箱的网址处于同一个网段内,如下所示的命令将开发板的 IP 地址设置为 172.20.223.200(IP 地址可以根据情况来设置),命令是“ifconfig eth0 172.20.223.200”; 6、 将生成的 ex16_TCPEchoServer 文件复制到目标板,具体过程可参考“实验二 Linux开 发 平 台 建 立 实 验 , 在 实 验 箱 上 运 行 ex16_TCPEchoServer , 命 令 是“./ex16_TC...

篇四:嵌入式系统gpio实验报告

四 GPIO、 时钟、 定时器、 中断、 UART1. 教材实例调试1.1. 中断控制器教材P1 51 , 按键中断实例,

 完成如下操作:新建Project导⼊源代码(*.c,*.S,*.h)

 ,

 导⼊MakeFile改写makefile , 使程序能够正确编译调试代码代码⺫录:

 /hardware/int/请回答如下问题:

 makefile中, arm-linux-ld -Ttext 0x00000000 -o int_elf $^ , text 0x00000000代表什么含义? makefile中, %.o:%.c是什么含义, 其中%.o代码哪些⽂件; 在%.o:%.S中, %.o代表哪些⽂件? $@和$<分别代码什么? 请写出下图中实际执⾏时的编译指令(即将⾃动化变量带⼊后的指令)本例中编译中, 源⽂件是哪些? ⺫标⽂件是哪个? 中间⽂件有哪些?本例中s3c24xx.h⽂件的作⽤是什么?本例中中断处理的⼊⼝是什么? 在中断处理程序中做了哪些⼯作? (参看课件处理器⼯作模式和中断控制器章节)分析源代码, 给出函数调⽤流程图。1.2. 时钟, 定时器教材第1 0章P1 66, MPLL和定时器实例操作 , 完成以下内容:嵌⼊式系统实验【 ⽣物医学电⼦⼯程1 0级】第1⻚

 新建Project导⼊源代码(*.c,*.S,*.h.*.lds)

 ,

 导⼊MakeFile改写makefile , 使程序能够正确编译调试代码代码⺫录:

 /hardware/timer/请回答如下问题:

 timer.lds⽂件起什么作⽤, 解释脚本中语句的含义, 程序的代码空间如何分配?程序中⽤到了哪些寄存器(中断, 定时器, SDRAM)

 , 其设置值的含义分别是什么? 如果修改为使⽤定时器1, 定时时间为3S,程序应如何修改?1.3. UART教材第11 章P177, UART实例操作 , 完成以下内容:新建Project导⼊源代码(*.c,*.S,*.h.*.lds)

 ,

 导⼊MakeFile改写makefile , 使程序能够正确编译调试代码代码⺫录:

 /hardware/uart/请回答如下问题:1 . 本⽰例串⼝收发数据没有采⽤中断⽅式实现, 那么实现正确收发必须使⽤哪个寄存器为收发判断依据?2. 如果修改串⼝波特率为1 9200, 采⽤FIFO⽅式, 应该如何配置, 请给出代码?3. 如果采⽤中断⽅式实现, 请设计程序流程, 并给出相关寄存器的配置。2. 综合设计题⺫2.1.设计⺫标利⽤UART0,TIMER1 ,GOIP实现LED的控制, 设计⺫标如下:在PC机的串⼝终端(如PCOMM或SecureCRT)

 ,输⼊以下格式命令, LED等根据命令指⽰执⾏动作并像PC机做出回复响应。嵌⼊式系统实验【 ⽣物医学电⼦⼯程1 0级】第2⻚PC开发板命令响应

 命令:

 Mode,Duration<LF>命令字含义取值说明ModeLED灯闪烁模式ByTurn: 轮流点亮All: 同时点亮(不区分⼤⼩写)DurationLED亮灭之间的间隔N: (1 ~10),单位秒<LF>回⻋换⾏符号采⽤ASCII码以上命令⾏字符均以ASCII码表⽰。⽰例:all,3 !!代表要求LED灯每3秒实现⼀次开关切换, 所有灯同时亮或灭byturn,2 ! !代表LED灯每2秒点亮⼀只, 轮流点亮, 同⼀时间只有⼀只点亮。响应:

 responseCode含义取值ok: 命令成功执⾏responseCode响应码error: 命令执⾏不成功unknown: 未知命令2.2. 设计要求采⽤UART0, 收发模式为中断⽅式, 串⼝波特率为19200, 其他设置与教材相同。定时器采⽤TIMER1, 采⽤中断定时⽅式。注意中断优先级的设置。嵌⼊式系统实验【 ⽣物医学电⼦⼯程1 0级】第3⻚

篇五:嵌入式系统gpio实验报告

式系统编程实验报告

 嵌入式 A\D 接口实验

  一、 实验目的

 1学习 A D转换原理 2掌握 AD转换芯片的使用方法 3掌握不带有 AD 的 CPU 扩展 D/A 功能的主要方法 4了解AD 驱动程序加入内核的方法

 二、实验内容

 学习 AD 接口原理,了解实现 AD 系统对于系统的软件和硬件要求。阅读

 芯片文档,掌握其使用方法。

  三、实验环境 硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机 Pentium 500 以上, 硬盘 10G 以上。

 软件:PC 机操作系统 REDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境

 四、 实验原理 GPIO 驱动分析 Write,read,open,release 四个函数与前边相同,只有基本操作和调试信息。Ioctl 函数为 GPIO 口的控制函数,其代码如下:

 ssize_t SIMPLE_GPIO_LED_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long ADta) {

  #ifdef OURS_GPIO_LED_DEBUG

 printk (&quot;SIMPLE_GPIO_LED_ioctl [ --kernel--]\n&quot;);

 //调试信息

  #endif

  switch (cmd)

 //io控制,cmd为输入的命令

  {

 case LED_ON : {GPCR3 |= 0x1;break;}//通过修改寄存器控制GPIO口电平

 case LED_OFF: {GPSR3 |= 0x1;break;}

 default :

  {printk (&quot;lcd control :

 no cmd run

 [ --kernel-- ]\n&quot;); return (-EINVAL);

 //非法命令}

  }

 return 0;

  }

 操作结构体:

 struct file_operations GPIO_LED_ctl_ops ={

 open:

 SIMPLE_GPIO_LED_open,

 read:

 SIMPLE_GPIO_LED_read,

 write:

 SIMPLE_GPIO_LED_write,

 ioctl:

 SIMPLE_GPIO_LED_ioctl,

 release: SIMPLE_GPIO_LED_release,

 }; 建立操作映射,注册借口函数。为应用层提供统一的接口。

 驱动模块必须具备两个函数,就是初始化函数和卸载函数,其声明为如下两句:

 module_init(pxa270_GPIO_LED_CTL_init);//加载模块时,系统调用

 pxa270_GPIO_LED_CTL_init函数初

 始化模块 module_exit(cleanup_GPIO_LED_ctl);//系统将调用该函数来卸载模块 这是linux驱动模块必备的。

 初始化函数如下:

 static int __init pxa270_GPIO_LED_CTL_init(void)

 {

  int

 ret = -ENODEV;

 //初始化失败将返回次错误信息

 //调试信息

 #ifdef OURS_GPIO_LED_DEBUG

  printk (&quot;pxa270_GPIO_LED_CTL_init [ --kernel--]\n&quot;);

  #endif

 //调用HW_GPIO_LED_CTL_init函数完成初始化 ret = HW_GPIO_LED_CTL_init();

  if (ret)

  return ret;

  return 0;

 }

 该函数通过调用 HW_GPIO_LED_CTL_init 函数实现初始化,该函数代码如下:

 static int __init HW_GPIO_LED_CTL_init(void) {

  int ret = -ENODEV;

 printk(&quot;hhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n\n&quot;);

 showversion(); //显示版本信息

 // init GPIO

 //初始化输出端口

 GPDR3 |= 0x00000001; // 设置输出端口模式

 GPSR3 |= 0x00000001; // 关闭led灯

 //调试信息,显示寄存器信息

 #ifdef OURS_GPIO_LED_DEBUG

  printk (&quot; GPLR3=%x \n&quot;,GPLR3);

  printk (&quot; GPDR3=%x \n&quot;,GPDR3);

  #endif

 //注册设备

 ret =

 devfs_register_chrdev(SIMPLE_GPIO_LED_MAJOR//主设备号 ,&quot;gpio_led_ctl&quot;, &amp;GPIO_LED_ctl_ops//函数映射结构体);

 if( ret &lt; 0 )

 {

  printk (&quot; pxa270: init_module failed with %d\n [ --kernel--]&quot;, ret);

 return

 ret;

 }

 else

 {

  printk(&quot; pxa270 gpio_led_driver register success!!! [ --kernel--]\n&quot;);

 }

 return ret; }

 模块卸载函数为cleanup_GPIO_LED_ctl,其代码实现如下:

 static void __exit cleanup_GPIO_LED_ctl(void) {

 #ifdef OURS_GPIO_LED_DEBUG

  printk (&quot;cleanup_GPIO_LED_ctl [ --kernel--]\n&quot;);

  #endif

 //注销主设备号,释放设备

 devfs_unregister_chrdev (SIMPLE_GPIO_LED_MAJOR, &quot;gpio_led_ctl&quot; );

  }

  测试函数:

 通过调用 ioctl 函数实现对 led 灯的控制。

 主函数实现如下:

 int main(void) {

  int fd;

 int ret;

 char *i;

  printf(&quot;\nstart gpio_led_driver test\n\n&quot;);

  fd = open(DEVICE_NAME, O_RDWR);

  //系统通过函数映射调用SIMPLE_GPIO_LED_open函数打开设备

  printf(&quot;fd = %d\n&quot;,fd);

 if (fd == -1)

  {

  printf(&quot;open device %s error\n&quot;,DEVICE_NAME);

  }

  else

  {

  //通过调用SIMPLE_GPIO_LED_ioctl函数控制led灯

  //主循环

  while(1)

  { ioctl(fd,LED_OFF);

 sleep(1);

 // 修改sleep时间即可改变led灯点亮的时间,如

 sleep(7)即灭7秒

 ioctl(fd,LED_ON);

 sleep(1);// sleep(5)

 亮5秒

 }

 // close

 ret = close(fd);

 //

  printf (&quot;ret=%d\n&quot;,ret);

  printf (&quot;close gpio_led_driver test\n&quot;);

  }

  return 0; }// end main 通过该实验基本掌握了驱动模块的结构和一些函数的实现,如 ioctl 函数。

 五、 实验步骤 AD驱动实验

 该模块需要ad模块的支持,所以初始化函数会相对比较复杂。不过初始化函数的结构依旧没有改变,同样是pxa270_AD_CTL_init函数通过调用HW_AD_CTL_init函数完成AD模块的初始化。

 static int __init HW_AD_CTL_init(void) {

 int ret = -ENODEV;

 showversion();

 ad_ucb = ucb1x00_get();//获取AD模块的地址

 //注册主设备号

  ret = devfs_register_chrdev(ADCTL_MAJOR, &quot;adctl&quot;,&amp;adctl_ops);

 if(ret&lt;0)

 {

  printk(&quot;adctl init_module failed with %d\n [ --kernel--]&quot;,ret);

 return ret;

 }

 else

 {

  printk(&quot;adctl int_driver register success!!![ --kernel--]\n&quot;);

 }

 //注册AD模块,设定为字符模块

 adctl_dev_handle = devfs_register( NULL, &quot;ad_ctl&quot;, DEVFS_FL_DEFAULT,ADCTL_MAJOR, 0, S_IFCHR, &amp;adctl_ops, NULL);

  return ret; } 同理,卸载模块时就要同时注销主设备号和AD模块。所以,卸载函数改为:

 static void __exit cleanup_AD_ctl(void) {

 devfs_unregister( adctl_dev_handle );//注销AD模块 devfs_unregister_chrdev (ADCTL_MAJOR, &quot;ad_ctl&quot; );//注销主设备号 } AD模块的控制由adctl_ioctl函数实现:

 ssize_t

 adctl_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg) {

  int val;

 #ifdef OURS_HELLO_DEBUG //

 printk (&quot;SIMPLE_HELLO_ioctl [ --kernel--]\n&quot;);

  #endif

  ucb0x00_adc_enable(ad_ucb);//使能AD转换

  //读取AD转换后的数据,其中cmd指定转换通道

  val = ucb0x00_adc_read(ad_ucb,cmd,0);

 ucb0x00_adc_disable(ad_ucb);//停止AD转换

  return UCB_ADC_ADT(val);//返回转换的数据

 } 使用时调用ioctl函数便可以实现数据采集。

 可以得到,测试文件的核心部分:

 int val0,val1;

 char *i; ioctl(fd);//通过函数映射调用adctl_ioctl函数 /*

  for(i=0;i&lt;50;i++)

  {

 val = ioctl(fd,UCB_ADC_INP_AD0,0);

 printf(&quot;val = %x\n&quot;, val);

 usleep(200000);

  } */

  for(i=0;i&lt;50;i++)

  {

  //通过函数映射调用adctl_ioctl函数读取通道1

 val0 = ioctl(fd,UCB_ADC_INP_AD1,0);

 usleep(100);//等待操作完成

 //通过函数映射调用adctl_ioctl函数读取通道0

 val1 = ioctl(fd,UCB_ADC_INP_AD0,0);

 printf(&quot;val0 = %d\tval1=%d\n&quot;, val0,val1);

  usleep(500000);

  } 测试函数其他部分与其他的测试文件相同

  六、 实验结果与分析 1、阅读理解源码

 进入/arm2410cl/exp/basic/05_AD目录,使用 vi 编辑器或其他编辑器阅读理解源代码

 2、编译应用程序

 运行 make 产生 AD可执行文件 AD_main

 [root@zxt /]# cd /arm2410cl/exp/basic/05_AD/ [root@zxt 05_AD]# make armv4l-unknown-linux-gcc -c -o AD_main.o AD_main.c armv4l-unknown-linux-gcc

 AD_main.o -o AD_main [root@zxt 05_AD]# ls AD_main

 AD_main.c

 AD_main.o

 doc

 drivers

  Makefile

 s3c44b0-spi.h

 3、下载调试

 切换到 minicom 终端窗口,使用 NFS mount 开发主机的/arm2410cl 到/host 目录,然后进入 /host/exp/05_AD/drivers 目录,用 insmod s3c2410-exio.o 命令插入A D驱动,并用 lsmod 命令查看是否已经插入。

 [/mnt/yaffs]cd /host/exp/basic/05_AD/[/host/exp/bas [/host/exp/basic/05_AD/drivers]insmod s3c2410-exio.o Using s3c2410-exio.o [/host/exp/basic/05_AD/drivers]lsmod Module Size

  Used by Not tainted

 S3c2410-exio 2384 0 (unused)

 i2c-tops2 14104 0 (unused)

  注意:卸载模块可以使用 rmmod 命令,以本实验为例,卸载方法如下:

 [/host/exp/basic/05_AD]rmmod s3c2410-exio

 进入/host/exp/basic/05_AD目录,运行./AD_main,观察运行结果的正确性。在输 入 ./AD_main 后会出现下面的提示信息。

 [/host/exp/basic/05_AD]./AD_main

  Error parameter

 Input as:

 [~]./ad_main AD_id num

 AD_id: select between 0 and 1 num: range 0.0 ~ 4.096 这是由于我们没有指定参数造成的,它的格式为 ./AD_main [AD的 id 号] [数字],同 时还需要在 0.0~4.096V 之间来选择一个输出电压。下面的例子是用了开发板上的 AD并且 输出 1V 的电压,我们可以使用万用表对其进行测量。

 [/host/exp/basic/05_AD]./AD_main 1

 Current Voltage is 1.000000 v

 当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。于是,我降临在了人间。

 我出生在一个官僚知识分子之家,父亲在朝中做官,精读诗书,母亲知书答礼,温柔体贴,父母给我去了一个好听的名字:李清照。

 小时侯,受父母影响的我饱读诗书,聪明伶俐,在朝中享有“神童”的称号。小时候的我天真活泼,才思敏捷,小河畔,花丛边撒满了我的诗我的笑,无可置疑,小时侯的我快乐无虑。

 “兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。”青春的我如同一只小鸟,自由自在,没有约束,少女纯净的心灵常在朝阳小,流水也被自然洗礼,纤细的手指拈一束花,轻抛入水,随波荡漾,发髻上沾着晶莹的露水,双脚任水流轻抚。身影轻飘而过,留下一阵清风。

 可是晚年的我却生活在一片黑暗之中,家庭的衰败,社会的改变,消磨着我那柔弱的心。我几乎对生活绝望,每天在痛苦中消磨时光,一切都好象是灰暗的。“寻寻觅觅冷冷清清凄凄惨惨戚戚”这千古叠词句就是我当时心情的写照。

 最后,香消玉殒,我在痛苦和哀怨中凄凉的死去。

 在天堂里,我又见到了上帝。上帝问我过的怎么样,我摇摇头又点点头,我的一生有欢乐也有坎坷,有笑声也有泪水,有鼎盛也有衰落。我始终无法客观的评价我的一生。我原以为做一个着名的人,一生应该是被欢乐荣誉所包围,可我发现我错了。于是在下一轮回中,我选择做一个平凡的人。

 我来到人间,我是一个平凡的人,我既不着名也不出众,但我拥有一切的幸福:我有温馨的家,我有可亲可爱的同学和老师,我每天平凡而快乐的活着,这就够了。

 天儿蓝蓝风儿轻轻,暖和的春风带着春的气息吹进明亮的教室,我坐在教室的窗前,望着我拥有的一切,我甜甜的笑了。我拿起手中的笔,不禁想起曾经作诗的李清照,我虽然没有横溢的才华,但我还是拿起手中的笔,用最朴实的语言,写下了一时的感受:

 人生并不总是完美的,每个人都会有不如意的地方。这就需要我们静下心来阅读自己的人生,体会其中无尽的快乐和与众不同。

 “富不读书富不久,穷不读书终究穷。”为什么从古到今都那么看重有学识之人?那是因为有学识之人可以为社会做出更大的贡献。那时因为读书能给人带来快乐。

 自从看了《丑小鸭》这篇童话之后,我变了,变得开朗起来,变得乐意同别人交往,变得自信了„„因为我知道:即使现在我是只“丑小鸭”,但只要有自信,总有一天我会变成“白天鹅”的,而且会是一只世界上最美丽的“白天鹅”„„ 我读完了这篇美丽的童话故事,深深被丑小鸭的自信和乐观所折服,并把故事讲给了外婆听,外婆也对童话带给我们的深刻道理而惊讶不已。还吵着闹着多看几本名着。于是我给外婆又买了几本名着故事,她起先自己读,读到不认识的字我就告诉她,如果这一面生字较多,我就读给她听整个一面。渐渐的,自己的语文阅读能力也提高了不少,与此同时我也发现一个人读书的乐趣远不及两个人读的乐趣大,而两个人读书的乐趣远不及全家一起读的乐趣大。于是,我便发展“业务”带动全家一起读书„„现在,每每遇到好书大家也不分男女老少都一拥而上,争先恐后“抢书”,当我说起我最小应该让我的时候,却没有人搭理我。最后还...

篇六:嵌入式系统gpio实验报告

四 GPIO 输入实验 一、实验目的 1、能够使用 GPIO 的输入模式读取开关信号。

 2、掌握 GPIO 相关寄存器的用法和设置。

 3、掌握用 C 语言编写程序控制 GPIO。

 二、实验环境

 PC 机

  一台

 ADS 1.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.4 LED 控制电路

 程序首先设置管脚连接寄存器 PINSEL0 和 PINSEL1,设置 P0.16 为输入,设置 P0.7,P1.21 为输出。然后检测端口 P0.16 的电平,对 P0.7, P1.21 进行相应的控制,流程图如图 4.5 所示,实现程序见程序清单 4.1。

 图 4.5 按键输入实验流程图

 五、实验步骤、源代码及调试结果 内容 1

 五、实验步骤、源代码及调试结果 内容 1

 实验步骤 ① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131 工程模板建立一个工程 BEEP_key。

 ② 在 user 组里编写主程序代码 main.c。

 ③ 选用 DebugInFLASH 生成目标,然后编译链接工程。

 ④ 将 EasyARM 教学实验开发平台上的相应管脚跳线短接。

 ⑤ 选择 Project->Debug,启动 AXD 进行 JLINK 仿真调试。

 ⑥ 全速运行程序,程序将会在 main.c 的主函数中停止。如下图所示:

 ⑦ 单击 Context Variable 图标按钮(或者选择 Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 System Views->Debugger Internals 即可打开 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" const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY1 = 1 << 16; // P0.16 连接 KEY1

 (改为 KEY3 时,只需“const uint32 KEY1 = 1 << 16”改为“const uint32 KEY3 = 1 << 18”,其余不变。)

 /******************************************************************************************* ** 函数名称:main() ** 函数功能:GPIO 输入实验测试。

 ** 检测按键 KEY1。KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

 ** 跳线说明:把 JP8 的 KEY1 跳线短接,JP11 连接蜂鸣器。

 *******************************************************************************************/ int main (void) { PINSEL0 = 0x00000000; // 所有管脚连接 GPIO

 PINSEL1 = 0x00000000; IO0DIR = BEEP; // 蜂鸣器控制口输出,其余输入 while (1) { if ((IO0PIN & KEY1) == 0) IO0CLR = BEEP; // 如果 KEY1 按下,蜂鸣器鸣叫 else IO0SET = BEEP; // 松开则停止蜂鸣 } return 0; }

 内容二

  内容二

 实验步骤 ① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131 工程模板建立一个工程 BEEP_key。

 ② 在 user 组里编写主程序代码 main.c。

 ③ 选用 DebugInFLASH 生成目标,然后编译链接工程。

 ④ 将 EasyARM 教学实验开发平台上的相应管脚跳线短接。

 ⑤ 选择 Project->Debug,启动 AXD 进行 JLINK 仿真调试。

 ⑥ 全速运行程序,程序将会在 main.c 的主函数中停止。如下图所示:

 ⑦ 单击 Context Variable 图标按钮(或者选择 Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 System Views->Debugger Internals 即可打开 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" const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY1 = 1 << 16; // P0.16 连接 KEY1

  (改为 KEY4 按键时,只需把上句代码改为“const uint32 KEY4=1<<19”,其余不变)

 const uint32 LEDS4= 1 << 21; // P1[21]控制 LED4,低电平点亮 (改为 LED6 时,只需把上句代码改为“const uint32 LED6=1<<23”,其余不变。)

 /*************************************************************************** ** 函数名称:main() ** 函数功能:GPIO 输入实验测试。

 ** 检测按键 KEY1。KEY1 按下,蜂鸣器蜂鸣,松开后停止蜂鸣。

 ** 跳线说明:把 JP8 的 KEY1 跳线短接,JP11 连接蜂鸣器。

 *******************************************************************************************/ int main (void) {

 Uint32

 i;

 PINSEL0 = 0x00000000; // 所有管脚连接 GPIO PINSEL1 = 0x00000000; IO0DIR = BEEP; // 蜂鸣器控制口输出 0 IO1DIR = 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++);

  // 软件延时 } return 0; }

 内容三

 内容三

 实验步骤

 实验步骤 ① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131 工程模板建立一个工程 BEEP_key。

 ② 在 user 组里编写主程序代码 main.c。

 ③ 选用 DebugInFLASH 生成目标,然后编译链接工程。

 ④ 将 EasyARM 教学实验开发平台上的相应管脚跳线短接。

 ⑤ 选择 Project->Debug,启动 AXD 进行 JLINK 仿真调试。

 ⑥ 全速运行程序,程序将会在 main.c 的主函数中停止。如下图所示:

  ⑦ 单击 Context Variable 图标按钮(或者选择 Processor Views->Variables)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。选择 System Views->Debugger Internals 即可打开 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"

 const uint32 BEEP = 1 << 7; // P0.7 控制蜂鸣器 const uint32 KEY = 1 << 16; // P0.16 连接 KEY1 const uint32 LEDS8 = 0xFF << 18; // P1[25:18]控制 LED8~LED1,低电平点亮

 void

 DelayNS(uint32

 dly) {

  uint32

 i;

 for(; dly>0; dly--)

 {

  for(i=0; i<50000; i++);

  } }

 /******************************************************************************************* ** 函数名称:liushuideng() ** 函数功能:流水灯显示实验。

 ** 调试说明:连接跳线 JP12 至 LED8~LED1。

 *******************************************************************************************/ /* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */ const uint32 LED_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 // 从两边叠加后递减 }; int liushuideng(void) { uint8 i; PINSEL1 = 0x00000000; // 设置管脚连接 GPIO IO1DIR = LEDS8; // 设置 LED 控制口为输出 while (1) {

 for (i=0; i<42; i++) { /* 流水灯花样显示 */ IO1SET = ~((LED_TBL[i]) << 18); DelayNS(20); IO1CLR = ((LED_TBL[i]) << 18); DelayNS(20); } } return 0; }

 //主函数

  int main(void) {

 uint32

 i;

 PINSEL0 = 0x00000000; // 所有管脚连接 GPIO PINSEL1 = 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++);

  // 软件延时 } return 0; }

  六、思考题 1、如果将 P0.30 设置为 GPIO 输入模式,且管脚悬空,那么读取 P0.30得到的值是 0 还是 1?或者是不确定?

  当管脚悬空时,该管脚有可能是高电平也有可能是低电平。读取IO0PIN 的值并不能确定管教的值。有时管脚是高电平,读取到的不一定是高电平。

 2、如果需要读取当前 P0.7 的输出值(不是管脚上的电平),如何实现?

 将该管脚与一个 LED 连接,若 LED 亮,则输出值为 0,否则为 1.

篇七:嵌入式系统gpio实验报告

/p>

  院

 系:计算机科学学院

  专

 业:

  自动化

 年

 级:

 11 级

  学

 号:

 11064029

  姓

 名:

  杨胜提

 指导教师:

  刘科

 2013 年

 5 月

 8 日

 2 年级

 11 级 班级

 11 级自动化 一班

 学号

 11064029 专业 自动化

 姓名

 杨胜提 题目名称 实验一、GPIO 实验

 实验设计要求

  控制 EduKit-M3 实验平台的发光二极管 LED1、LED2、LED3、LED4,使它们有规律的点亮,具体顺序如下:

 LED1 亮->LED2 亮->LED3 亮->LED4 亮,如此反复,当按下 EduKit-M3 实验平台上的 Key 按钮时,灯全部熄灭, 2 秒钟后发光二极管全部点亮,再过一秒钟后返回被中断前的状态,有规律的依次点亮。

 实 验 设 计 思 路

 1、 硬件电路设计

 在 EduKit-M3 实验平台上,LED1、LED2、LED3、LED4 分别与 PC6、PC7、PC8、PC9 相连,按键 Key 与 PB9 相连。

  2、软件程序设计 (1) 配置 PB 口第 9 个引脚作为外部中断,下降延触发;

  (2) 读取端口数据输出寄存器 GPIOC_ODR[15:0]的值,因为 C 口[9:6]位和四个LED 灯连通。

  (3) 初始化时,LED 依次点亮,当按下 Key 键时产生中断;

 (4) 中断服务子程序内容:灯全部熄灭,2 秒钟后发光二极管全部点亮,再过 1秒钟后中断返回。整个工程包含 3 个源文件:STM32F10x.s、stm32f10x_it.c 和 main.c,其中 STM32F10x.s 为启动代码,所有中断服务子程序均在 stm32f10x_it.c 中,其它函数则在 main.c 中。

 3 实 验 步 骤 与 结 果 分 析

 运行过程

  (1) 使用 Keil uVision3 通过 ULINK 2 仿真器连接 EduKit-M3 实验平台,打开实验例程目录 GPIO_TEST 子目录下的 GPIO.Uv2 例程,编译链接工程;

  (2) 选择软件调试模式,点击 MDK 的 Debug 菜单,选择 Start/Stop Debug Session项或 Ctrl+F5 键, 在逻辑分析仪中添加 GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9,点击 Run 按钮即可在 逻辑分析仪中看到如图 7-11;

  (3) 选择硬件调试模式,选择 Start/Stop Debug Session 项或 Ctrl+F5 键,下载程序并运行,观察 LED 灯的变化情况;当程序运行在 while 循环体内时,按 Key 键,程序进入中断服务子程序 EXTI9_5_IRQHandler(), 单步运行,观察 LED 的变化情况。

 (4) 退出 Debug 模式,打开 Flash 菜单>Download,将程序下载到 EduKit-M3 实验平台的 Flash 中,按 RESET 键复位, 观察 LED 灯的情况,正常情况应如下。

 LED 灯状态 1

 说

 明 LED1 LED2 LED3

 LED4

 亮

 灭

 灭

 灭

  程序正常运行,发光二极管依次点亮 灭

 亮

 灭

 灭

 灭

 灭

 亮

 灭

 灭

 灭

 灭

 亮

 灭

 灭

 灭

 灭

  外部信号输入,发生中断,执行中断处理程序 亮

 亮

 亮

 亮

  LED 灯状态 2

  说

 明 LED1 LED2 LED3

 LED4

 亮

 灭

 灭

 灭

  程序正常运行,发光二极管依次点亮 亮

 亮

 灭

 灭

 亮

 亮

 亮

 灭

 亮

 亮

 亮

  亮

 灭

 灭

 灭

 灭

  外部信号输入,发生中断,执行中断处理程序 亮

 亮

 亮

 亮

 4

 主 要 程 序 代 码 分 析

  软件程序设计

 1、配置 PB 口第 9 个引脚作为外部中断,下降延触发;

  /* Configure PB9 as input floating (EXTI Line9) */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  //引脚选择

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//输入模式选择 GPIO_Init(GPIOB, &GPIO_InitStructure);

  2、读取端口数据输出寄存器 GPIOC_ODR[15:0]的值,因为 C 口[9:6]位和四个 LED 灯连通。

  方法一:

  /* Configure PC. as Output push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;

 //与 LED 灯连通的引脚选择

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置输出引脚的速度

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  // 设置输出引脚的模式为推挽输出模式

  GPIO_Init(GPIOC, &GPIO_InitStructure); 方法二:

  利用端口配置低寄存器(GPIOx-CRL)(x=A..E)和端口配置高寄存器(GPIOx-CRH)(x=A..E)

  GPIOC_CRL=0xcc444444 ;

  GPIOC_CRH=0x444444cc ;

 3、初始化时,LED 依次点亮,当按下 Key 键时产生中断; /* Configure EXTI Line9 to generate an interrupt on falling edge */

  EXTI_InitStructure.EXTI_Line = EXTI_Line9;

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

 5

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure); 4、LED 依次点亮的子程序

 for(;;)

 {

  GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);

 GPIO_SetBits(GPIOC,GPIO_Pin_6); 算法 1

 GPIOC->ODR&= 0xfffffc4f;

 //1

 高 16 位保留,全为 F,底 16 位相应置高或置底

 /*Delay(800);

 GPIOC->ODR&= 0xfffffc0f;

  GPIOC->ODR|= 0x00000cc0;

  //2

  Delay(800);

 GPIOC->ODR&= 0xfffffc0f;

 GPIOC->ODR|= 0x00000dc0;

 //3

 Delay(800);

  GPIOC->ODR&= 0xfffffc0f;

 GPIOC->ODR|= 0x00000fc0;

  //4

 Delay(800);

 算法 2

  GPIO_ResetBits(GPIOC,GPIO_Pin_6);//使 Pin_6 置低

  Delay(800);

 GPIO_SetBits(GPIOC,GPIO_Pin_6);//使 Pin_6 置高

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_7);

 Delay(800);

  GPIO_SetBits(GPIOC,GPIO_Pin_7);

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_8);

 Delay(800);

  GPIO_SetBits(GPIOC,GPIO_Pin_8);

  Delay(100);

  GPIO_ResetBits(GPIOC,GPIO_Pin_9);

 Delay(800);

 6

  GPIO_SetBits(GPIOC,GPIO_Pin_9);

  Delay(100);

 }

  //

 使用这两个函数对引脚进行配置。

  (写不完时,可调整表结构。)

 7 心 得 体 会

 (这部分内容要手写)

 成 绩 评 定

  教师签名:

  年

  月

  日

篇八:嵌入式系统gpio实验报告

南理工大学 《嵌入式系统》课程实验报告- STM32 单片机 GPIO 程序开发

 实验概述

 【实验目的及要求】

 实验目的:

 1. 掌握 STM32 单片机输入输出接口程序开发 2. 掌握用寄存器开发 STM32 单片机程序 3. 掌握用库函数开发 STM32 单片机程序 实验要求:

 1. 完成实验要求中提到要完成的所有内容,完成代码并提交主要代码。

 2. 分析寄存器和库函数编程的优势和劣势,你喜欢用哪种方式。

 3. 对每行主要代码要进行注释,说明其功能。

 实验内容:

  1.熟悉TEB-CM5000嵌入式单片机实验系统上的LED灯电路和单独按钮电路。

 2.学习并掌握寄存器版本、库函数版本相关的实例程序,主要学习实例stm32referencesrcforch5 目录下的,LED、LEDLib、KEY_LED 和 KEY_LEDlib 四个程序。

  3.利用寄存器位操作模式、库函数分别开发出 USER2(PD3)按钮控制LD5(PF7)亮灭。具体功能:USER2(PD3)按钮按下时,LD5 灯闪烁;当 USER2(PD3)按钮弹开时,LD5 灯停止闪烁。

 4.实现利用寄存器位操作模式、库函数分别开发出: 当每次 USER2(PD3)按钮按下时,LD5 灯只闪烁一次。

 【实验环境】

 1. TEB-CM5000 嵌入式单片机实验系统 2. MDK4.12 嵌入式软件开发环境

 实验内容

 【实验过程】

 二、实验步骤:

 1. USER2(PD3)按钮按下时,LD5 灯闪烁;

 USER2(PD3)按钮弹开时,LD5 灯停止闪烁。

 (1)

 寄存器位操作模式:

 设置输入输出

  循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  (2)

 库函数

  设置 LD5 和 USER2

 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  2.当每次 USER2(PD3)按钮按下时,LD5 灯只闪烁一次。

 (1)寄存器位操作模式 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

  (3)

 库函数 循环判断 PD3 的状态,并执行对应操作(点亮或熄灭灯)

 小结

 1. 只闪烁一次跟一直闪烁的区别主要在于 Flag 值。

 在只闪烁一次的程序中,设置 flag 值作为标志,灯亮以后改变 flag 值的状态,flag 的状态改变灯的状态就不再继续。

 2. 学会了如何使用或者调用相关函数或库,以及寄存器操作和库函数操作的区别。

 3. 学会了利用值的改变来改变灯的状态。

 指导教师评语及成绩

 评语:

 成绩:

  指导教师签名:

 批阅日期:

篇九:嵌入式系统gpio实验报告

IO 输出控制实验 1 1 、实验目的

  (1)

 掌握LPC2200专用工程模块的使用 (2)

 掌握EASYJTAG仿真器的安装与使用 (3)

 在开发平台上运行第一个程序 (4)

 熟悉ARM7的GPIO控制 2 、实验设备

  硬件:

 PC 机

  一台

  MAGICARM2200-S教学实验开发平台

 一套

  软件:

 Windows98/XP/2000 系统,ADS1.2 集成开发环境 3 、实验内容 控制开发平台的蜂鸣器报警。

 4、原理图:

 5、源代码 :

 /**************************************************************************** * 文 件 名:main.c * 功

 能:蜂鸣器控制。对蜂鸣器 B1 进行控制,采用软件延时方法。

 *

  使用 I/O 口直接控制,采用灌电流方式。

 * 说

 明:短接蜂鸣器跳线 JP7。断开 CF 卡跳线 JP13、GPIO 接口 J17。

 ****************************************************************************/ #include

 "config.h" #define

  BEEPCON

 0x00000080

  // P0.7 引脚控制 B1,低电平蜂鸣

 /****************************************************************************

 * 名

 称:DelayNS() * 功

 能:长软件延时。

 * 入口参数:dly

 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void

 DelayNS(uint32

 dly) {

  uint32

 i;

  for(; dly>0; dly--)

 {

  for(i=0; i<5000; i++);

  } }

  /**************************************************************************** * 名

 称:main() * 功

 能:控制蜂鸣器蜂鸣。

 ****************************************************************************/ int

 main(void) {

 PINSEL0 = 0x00000000;

  // 设置管脚连接 GPIO

 IO0DIR = BEEPCON;

  // 设置 I/O 为输入输出模式

  // 设置 P0.7 为输出

 while(1)

 {

  IO0SET = BEEPCON;

 // BEEPCON = 1

  DelayNS(15);

  IO0CLR = BEEPCON;

  // BEEPCON = 0

  DelayNS(15);

  }

  return(0); } /****************************************************************************** GPIO 输出控制实验 2 1 、实验目的

  熟悉 ARM 的 的 GPIO 控制

 2 、实验设备

  硬件:

 PC 机

  一台

  MAGICARM2200-S教学实验开发平台

 一套

  软件:

 Windows98/XP/2000 系统,ADS1.2 集成开发环境 3 、实验内容 制 控制 LED 显示 4 、原理图

 5 、源代码 :

 /**************************************************************************** * 文 件 名:main.c * 功

 能:LED 显示控制。

 *

  通过 GPIO 直接控制 8 个 LED 产生流水灯效果 * 说

 明:短接 LED 跳线 JP5。

 *

  这个警告可忽略,C2892E: signed constant overflow ****************************************************************************/ #include

 "config.h" #define

  LED1

 1<<16

  // P1.16

  #define

  LED2

 1<<17

 // P1.17

  #define

  LED3

  1<<18

 // P1.18

  #define

  LED4

  1<<19

 // P1.19

  #define

  LED5

  1<<20

  // P1.20

  #define

  LED6

  1<<21

 // P1.21

 #define

  LED7

  1<<22

 // P1.22

 #define

  LED8

  1<<23

 // P1.23

 #define

  LEDCON 0x00ff0000

 const uint32

 DISP_TAB[8] = { 0xff01ffff, 0xff02ffff, 0xff04ffff, 0xff08ffff,

  0xff10ffff, 0xff20ffff, 0xff40ffff, 0xff80ffff};

 /**************************************************************************** * 名

 称:DelayNS() * 功

 能:长软件延时 * 入口参数:dly

 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void

 DelayNS(uint32

 dly) {

  uint32

 i;

 for(; dly>0; dly--)

 {

  for(i=0; i<5000; i++);

  } }

  /**************************************************************************** * 名

 称:main() * 功

 能:根据表 DISP_TAB 来控制 LED 显示。

 ****************************************************************************/ int

 main(void) {

  uint8

 i;

  PINSEL1 = 0x00000000;

  // 端口配置为 GPIO

  IO1DIR = LEDCON;

 // 配置 LED 控制 I/O 方向为输出

  while(1)

 {

  for(i=0; i<8; i++)

  {

  IO1CLR = DISP_TAB[i];

 // 输出 LED 显示数据

  DelayNS(10);

  // 延时

  IO1SET = 0xffffffff;

 // 全部输出高电平

  }

 }

  return(0); } /******************************************************************************

篇十:嵌入式系统gpio实验报告

学生同组学生课程名称 实验名 称外部中断 摘要:

 编写程序关闭;再 一、实 验(1)掌(2)掌(3)掌(4)掌(5)掌(6)掌 二、实 验1)启动注意2)分别3)编译4)例程5)

 在 S使能 IRQ6)选用7)将 Sm线设置为8)选择9)在中10)单步同步,即

  生姓名:施兴生姓名:____称:

 《嵌称 :

 断和 GPIO 实序,实现以下再来一个中断验 目的 掌握 EasyJTAG-掌握 LPC2200掌握 ADS 集成掌握向量 IRQ掌握外部中断掌握 LPC2000验 内容 动 EasyJTAG-H意:LPC2200别编译程序清译连接工程,程通过后,根Startup.s 文件Q 中断。

 用 DebugInExramartARM220为 Bank0-RA择 Project

 中断服务程序步/全速运行程即同时开或同兴棋 ___________________嵌入式系统》实验 下功能:同时断,灯又循环-H 仿真器的专用工程模板成开发环境应中断的设置及引脚功能设置系列 ARM7 微仿真器 0 无内部 FALS单 1.1 和程序观察实验结果据实验要求在件的 InitStackam 生成目标00 教学实验开AM、Bank1- Debug,启中设置断点程序,观察程同时灭。

 实______________________

 时控制 4 个 LE环显示,蜂鸣安装和应用板的使用;用; 及应用; 置及外部中断微控制器的SH

 序清单 1.2 果,在实验报在 user 组中k 子程序中,标,然后编译开发平台上的-FALSH。

 动 AXD 进行,全速运行程程序是否正确实 验 报_______

  _______

 ED 循环显示鸣器响。

 ; 断的工作模式GPIO 控制;报告中描述。的 main.c 中修改设置系译链接工程。的 JP2、JP4 跳行 JTAG 仿真调程序,使 EN确运行,蜂鸣报 告学号:3140学号:_____实验序号:示和蜂鸣器信式设置;

 。

 中编写主程序系统模式堆栈 跳线短接,J调试。

 T3 为低/高电鸣器是否蜂鸣103039________________

 号输出,当中代码。

 栈处的代码为P7 断开。JP9电平,即反复鸣,LED 流水灯______________________

 中断来临,灯“MSR CPSR_9 设置为 OU复按下或释放灯是否循环显专业:自动日期:2016地点:教 2成绩:__________________________

 灯全灭,蜂鸣_c,#0x5f”,UTSIDE,JP10放 KEY1 键。显示,两者是动化 1402 6.10.11 -104

 ______________ ___

 鸣器即0 跳是否___

 三、实验前准备工作 研读给定例程,结合程序功能完成实验任务所需程序的编写,判断出应该出现的实验结果。

 实验前写好的程序:

 #include

 "config.h"

 #define

  BEEPCON 1<<7

 //P0.7 引脚控制 B1,低电平蜂鸣 #define

  LEDCON

 0xf0000000

  //定义 LED 灯

  const uint32

 DISP_TAB[8] = { 0x1fffffff, 0x2fffffff, 0x4fffffff, 0x8fffffff,

 0xffffffff, 0x0fffffff, 0xffffffff, 0x0fffffff};

 //定义表

 void

 DelayNS(uint32

 dly)

  //延时子程序,

  {

  uint32

 i;

 for(; dly>0; dly--)

 {

 for(i=0; i<5000; i++);

  }

  }

 void

  __irq IRQ_Eint3(void)

 //外部中断函数

 {

 uint32

 i;

  //无符号 32 位数

 i = IO0SET;

  //读取当前 B1 控制值

 if( (i&BEEPCON)==0 )

  //控制 B1 取反

 {

  IO0SET = BEEPCON;

  for(i=0; i<8; i++)

  {

  IO2CLR = DISP_TAB[i];

  //控制制定灯灭

 DelayNS(10);

 //延时

 IO2SET = 0xffffffff;

 //灯全亮

 }

  }

 else

  {

 IO0CLR = BEEPCON;

  IO2CLR = 0xffffffff;

 }

 while( (EXTINT&1<<3)!=0 )

  //等待外部中断信号恢复为高电平

 {

  EXTINT = 1<<3;

 //清除 EINT3 中断标志

 }

 VICVectAddr = 0;

  //向量中断结束

  }

  int

 main(void)

 {

  uint8

 i;

 IO2DIR = LEDCON;

  //配置 LED 控制 I/O 方向

  PINSEL1 = 3<<8;

  //设置管脚连接,P0.20 设置为 EINT3

  IO0DIR = BEEPCON;

 //设置 B1 控制口为输出,其他 I/O 口为输入

  EXTMODE = 0x00;

 //设置 EINT3 中断为电平触发模式

 VICIntSelect = 0x00000000;

 //设置所有中断分配为 IRQ 中断

 VICDefVectAddr = (int)IRQ_Eint3;

  //设置中断服务程序地址

 EXTINT = 1<<3;

 //清除中断标志

 VICIntEnable = 1<<17;

 //使能 EINT3 中断,EINT3 在 Bit17 上

  while(1);

 //等待中断

  return(0);

 while(1)

 return(0);

  }

 四、实验结果及分析 1.实验例程一的实验现象:按下 KEY1 后蜂鸣器蜂鸣; 2.实验例程二的实验现象:4 个 LED 灯循环亮灭; 3.实验程序在编译运行后没有出现正确的实验现象,即按下 KEY1 后蜂鸣器响,同时 LED 灯 循环点亮,出现的实验现象为按下 KEY1 后,蜂鸣器响而 LED 灯同时亮,再按下 KEY1 后,蜂鸣器不再响而LED 灯始终亮。经检验,是实验程序出现问题,随即修改实验程序,将原程序中的控制等亮灭的循环语句移至主程序中,并新加入一个中断判断标志,修改后的程序出现在正确的实验现象。修改后的实验程序如下:

 #include "config.h"

 #define LEDCON 0xf0000000

 //定义 LED 灯

 #define BEEPCON 1<<7

 //P0.7 引脚控制 B1,低电平蜂鸣

  uint8 bit;

  //定义一个无符号 8 位数作为中断判断标志

 const uint32 DISP_TAB[8]={0x1fffffff,0x2fffffff,0x4fffffff,0x8fffffff,0xffffffff,0x0fffffff,0xffffffff,0x0fffffff};

 void DelayNS(uint32 dly)

 //延时子程序

 {

 uint32 i;

 for(;dly>0;dly--)

 {

 for(i=0;i<5000;i++);

 }

  }

 void

  __irq IRQ_Eint3(void)

 //外部中断函数

 {

 uint32

 i;

 i=IO0SET;

  //读取当前 B1 值

 if((i&&BEEPCON)==0)

  //控制 B1 取反

  {

 IO0SET=BEEPCON;

 bit=1;

 }

 else

 {

 IO0CLR=BEEPCON;

  bit=0;

 }

 while((EXTINT&1<<3)!=0)

 //等待外部中断信号恢复为高电平

 {

  EXTINT=1<<3;

  //清除 EINT3 中断标志

 }

 VICVectAddr=0;

  //向量中断结束

 }

  int main(void) { uint8 i; IO2DIR=LEDCON;

  //配置 LED 控制 I/O 方向 PINSEL1=3<<8;

  //设置管脚连接,P0.20 设置为 EINT3 IO0DIR=BEEPCON;

 //设置 B1 控制口为输出,其他 I/O 口为输入 EXTMODE=0x00;

  //设置 EINT3 中断为电平触发方式 VICIntSelect=0x00000000;

  //设置所有中断分配为 IRQ 中断 VICDefVectAddr=(int)IRQ_Eint3;

 //设置中断服务程序地址 EXTINT=1<<3;

  //清除中断标志 VICIntEnable=1<<17;

  //使能 EINT3 中断,EINT3 在 Bit17 上 while(1)

  //等待中断 { {

 for(i=0;i<8;i++)

 {

 if(bit==0){

 //中断判断

 IO2CLR=DISP_TAB[i];

  //输出 LED 显示数据

 DelayNS(10);

  //延时

 IO2SET=0xffffffff;

  }

 else

 IO2SET=0xffffffff;

 //灭灯

 } } } return(0); }

 思考题:

 (1)能否设置 P0.9、P0.20 和 P0.30 引脚同时使用 ENT3 功能?如果能,这 3 个引脚状态与中断是什么逻辑关系(假设中断设置为低电平触发模式)? 能。选用 EINT 功能的全部引脚的状态都连接到一个正逻辑“与”门,即任何一个输入引脚出现低电平信号就会中断。

 (2)在 VIC 中,如何禁止某一个中断?假设系统使用了几个 IRQ 中断,如何一次全部禁止所有中断。

 将对应 VICIntEnable 置 0 就禁止了该中断。

 EXTINT=0x0F 则禁止了所有外部中断。

 (3)产生 IRQ 中断后,CPSR 寄存器的 I 位是 0 还是 1? I 位置 1,禁止新的 IRQ 中断产生

 (4)如何正确理解 VIC 的中断优先级? 当不同优先级的中断同时产生时,优先响应高优先级的中断,但它不支持 IRQ、FIQ 的中断嵌套

推荐访问:嵌入式系统gpio实验报告 嵌入式系统 实验 报告