嵌入式系统综合实验一
- 格式:doc
- 大小:4.41 MB
- 文档页数:31
arm嵌入式实验报告完整版篇一:ARM嵌入式系统实验报告1郑州航空工业管理学院嵌入式系统实验报告第赵成,张克新院姓专学系:名:业:号:电子通信工程系周振宇物联网工程 121309140电子通信工程系XX年3月制实验一 ARM体系结构与编程方法一、实验目的了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。
二、实验内容1.ADS1.2 IDE的安装、环境配置及工程项目的建立;2.ARM汇编语言程序设计(参考附录A):(1)两个寄存器值相加;(2)LDR、STR指令操作;(3)使用多寄存器传送指令进行数据复制;(4)使用查表法实现程序跳转;(5)使用BX指令切换处理器状态;(6)微处理器工作模式切换;三、预备知识了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。
四、实验设备 1. 硬件环境配置计算机:Intel(R) Pentium(R) 及以上;内存:1GB及以上;实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置操作系统:Microsoft Windows XP Professional Service Pack 2;集成开发环境:ARM Developer Suite (ADS)1.2。
五、实验分析1.安装的ADS1.2 IDE中包括两个软件组件。
在ADS1.2中建立 ARM Executable Image(ARM可执行映像)类型的工程,工程目标配置为 Debug;接着,还需要对工程进行目标设置、语言设置及链接器设置;最后,配置仿真环境为ARMUL仿真方式。
2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。
实验一最小系统实验一、实验目的熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。
掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。
二、实验原理本实验通过一个简短的 Boot 引导程序介绍 ARM 开发平台的启动过程,同时该引导程序也可其他章节程序引导的示例程序。
本程序主要为了让读者能够清晰理解启动程序的基本架构组成部分以及掌握ARM 引导程序的编写方法。
三、主要实验设备1.硬件:宿主机、ARM教学试验箱;2.软件:Windows操作系统、ADS1.2集成开发环境。
四、实验内容构建最小系统,用示波器观察一下晶振电路的波形,测一下晶振正常工作时的电压。
编写一个例程,编译并运行。
设置ARM仿真器的开发环境。
程序架构如下:1.程序头IMPORT MDCNFG ;声明 MDCNFG(读写寄存器)物理地址0x48000000IMPORT MDREFR ;声明 MDREFR(刷新寄存器)0x48000004IMPORT MDMRS ;声明 MDMRS(模式/设置寄存器 0x48000040IMPORT init_MDCNFG ; 声明 init_MDCNFG 0x02000ac9IMPORT init_MDREFR ; 声明 init_MDREFR 0x0011e018IMPORT init_MDMRS ; 声明 init_MDMRS 0x320032IMPORT StackSvc ; 声明 StackSvc 0xa0600000IMPORT StackIrq ; 声明 StackIrq 0xa0605000IMPORT StackFiq ; 声明 StackFiq 0xa060a000IMPORT StackAbt ; 声明 StackAbt 0xa060e000IMPORT StackUnd ; 声明 StackUnd 0xa0714000IMPORT StackUsr ; 声明 StackUsr 0xa0720000IMPORT mainIMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
电子科技大学中山学院电子信息学院学生实验报告课程名称嵌入式系统设计实验名称嵌入式开发平台和软件班级12信息工程实验时间2015年 4月1日姓名,学号指导教师顾菘报告内容一、实验目的和任务1.了解和熟悉嵌入式开发平台2.熟悉嵌入式开发平台的原理3..熟练掌握嵌入式开发平台的使用4.熟练掌握IAR Embedded Workbench应用程序的使用二、实验原理简介UP-TECH S2410 DVP开发板外观三、实验内容和数据记录①运行IAR Embedded Workbench应用程序②点击Open exiting workspace后找到相应实验所在的文件夹,如果看不到工程文件,请在文件类型中选择Workspace File(*。
Eww)③点击后打开相应的工程,如下图④选择工程文件后点击右键出现Rebuild All选项,点击后开始重新编译。
⑤重新编译完成后会有如下提示,没有警告和错误。
⑥在这之后就要开始相应的调试工作,就要进行H-Jtag的设置。
双击运行H-JTAG⑦选择菜单项Settings>Jtag Settings 修改选项配置如下图:⑧选择菜单项Settings>Port Settings选择ARM-JTAG仿真器所用的并口号,点击Port Testing按钮,已确认该并口是否可用,否则请检查BIOS设置。
⑨确定正常后,点击Options 菜单,检查Disable Semihosting和Disable Vector Catch是否为选中状态,若没有选中应将其勾选。
⑩使用UP-LINK接通开发板和主机,开启电源。
⑪在H-JTAG Server窗口中选择Operations> Detect Target 应该能够侦测目标板上的ARM 7~10内核如下图,如侦测不到请检测上述步骤。
⑫在H-JTAG检测到硬件后可以开始调试了,这时在EWARM下点击Download and Debug⑬点击之后出现调试界面,并且已经有运行到了main函数所在的位置。
嵌入式系统实验报告学号:姓名:班级:13电子信息工程指导老师:苏州大学电子信息学院2016年12月实验一:一个灯的闪烁1、实验要求实现PF6-10端口所连接的任意一个LED灯点亮2、电路原理图图1 LED灯硬件连接图3、软件分析RCC_Configuration(); /* 配置系统时钟*/GPIO_Configuration(); /* 配置GPIO IO口初始化*/ for(;;){GPIOF->ODR = 0xfcff; /* PF8=0 --> 点亮D3 */Delay(1000000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(1000000);4、实验现象通过对GPIOF8的操作,可以使LED3闪烁5、实验总结这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。
通过本实验对STM32开发板的硬件原理有了初步了解。
实验二:流水灯1、实验要求实现PF6-10端口所连接的5个LED灯顺次亮灭2、电路原理图图1 流水灯硬件连接图3、软件分析int main(void){RCC_Configuration();/* 配置系统时钟*/GPIO_Configuration();/* 配置GPIO IO 口初始化*/for(;;){GPIOF->ODR = 0xffbf;/* PF6=0 --> 点亮LED1 */Delay(5000000);GPIOF->ODR = 0xff7f;/* PF7=0 --> 点亮LED2 */Delay(5000000);GPIOF->ODR = 0xfeff;/* PF8=0 --> 点亮LED3 */Delay(5000000);GPIOF->ODR = 0xfdff;/* PF9=0 --> 点亮LED4 */Delay(5000000);GPIOF->ODR = 0xfbff;/* PF10=0 --> 点亮LED5 */ }}4、实验现象LED1~LED5依次点亮,亮灭的时间间隔都为1S。
嵌入式系统设计实验报告班级: 20110612学号: ***********名:***成绩:指导教师:武俊鹏、刘书勇1. 实验一1.1 实验名称博创UP-3000实验台基本结构使用方法1.2 实验目的1.熟悉嵌入式系统开发式流程概述。
2.熟悉UP-net3000实验平台的核心硬件电路和外设。
3.熟悉ARM JTAG的安装与使用。
1.3 实验环境硬件:ARM 嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC 机Pentium100以上、串口线。
软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
1.4 实验内容及要求1.熟悉嵌入式系统开发式流程概述。
2.熟悉UP-net3000实验平台的核心硬件电路和外设。
3.熟悉ARM JTAG的安装与使用。
1.5 实验设计与实验步骤1.新建超级终端2.选择ARM 开发实验台串口。
完成新建超级终端的设置以后,可以选择超级终端文件菜单中的保存,将当前设置3.保存为一个特定超级终端到桌面上,以备后用。
用串口线将PC机串口和平台UART0 正确连接后,就可以在超级终端上看到程序输出的信息了。
4.启动开发板,按住任意键,使开发板进入BIOS设置状态。
5.在超级终端的界面上,显示BIOS版本信息,以及相应的测试指令。
操作时,要在PC机上输入小写的字母快捷键,进入到相应的功能中去。
6.按照超级终端上的提示信息,进行功能的测试。
1.6 实验过程与分析本次实验操作起来并不困难,因为此次实验属于验证型实验,按照实验资料所给的提示信息,以上面的步骤,即可得到实验的结果。
进入到BIOS界面后,按照超级终端上的提示信息来进行功能1.7 实验结果总结在实验过程中,我们进行的很顺利,没有遇到什么问题,在超级终端界面,按提示的快捷键来测试对应的功能。
如e:测试由ZLG7289 驱动的LED 显示,共分3 步,请看超级终端提示按任意键继续,同时观察LED 的变化,最后返回主菜单。
实验一、嵌入式系统网络安全基础1.traceroute:可以使用traceroute命令显示数据包到达目的主机所经过的路由。
2.curl & wget: 使用curl或wget命令,不用离开终端就可以下载文件。
如你用curl,键入curl -O后面跟一个文件路径。
wget则不需要任何选项。
下载的文件在当前目录。
stat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态(InterfaceStatistics),masquerade 连接,多播成员(Multicast Memberships) 等等。
常见参数-a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在Listen (监听) 的服務状态-p 显示建立相关链接的程序名-r 显示路由信息,路由表-e 显示扩展信息,例如uid等-s 按各个协议进行统计-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到3.1列出所有端口netstat –a.3.2列出所有tcp 端口netstat –at3.3 只显示监听端口netstat –l3.4显示TCP 或UDP 端口的统计信息netstat -st 或–su3.5 netstat -p 可以与其它开关一起使用,就可以添加“PID/进程名称” 到netstat 输出中,这样debugging 的时候可以很方便的发现特定端口运行的程序。
3.6 找出程序运行的端口并不是所有的进程都能找到,没有权限的会不显示,使用root 权限查看所有的信息。
3.7显示网络接口列表3.8 IP和TCP分析查看连接某服务端口最多的的IP地址4.Whois信息下载最新版wget https:///pub/blfs/conglomeration/whois/whois_5.2.18.tar.xz #xz -d whois_5.2.18.tar.xz#tar xvf whois_5.2.18.tar# cd whois-5.2.18/#make#make install注意在linux命令终端里查询一个域名的注册信息时,要把前面的www去掉。
《嵌入式系统技术》实训报告1、实验目的z了解S3C2440A 外部中断的工作原理。
z掌握S3C2440A 外部中断的使用方法。
2、实验设备z PC 机、Multi-ICE 仿真器、2440A 实验箱。
3、实验内容z通过外部K1、K2、K3、K4、K5、K7 按键触发外部中断E INT1、EINT2、EINT3、EINT4、EINT5、EINT74、实验原理4.1 ARM 的异常中断类型在嵌入式系统中外部设备的功能实现主要是靠中断机制来实现的。
中断功能可以解决CPU 内部运行速度远远快于外部总线速度而产生的等待延时问题。
ARM 提供的FIQ 和IRQ 异常中断用于外部设备向C PU 请求中断服务,一般情况下都是采用I RQ 中断。
七种异常中断中断过程框图4.2 异常中断响应过程和返回过程异常中断的响应过程:1).保存处理器当前状态寄存器C PSR 的值到备份程序状态寄存器S PSR 中。
2).设置但前程序状态寄存器CPSR 的值,其中包括:设置CPSR 响应位的值,使处理器进入特定的处理器模式;按要求屏蔽中断,通常应该屏蔽I RQ 中断。
在F IQ 中断时屏蔽F IQ 中断。
3).设置L r 寄存器。
将相应中断模式的L r 寄存器的值设为异常中断的返回地址。
4).处理程序计数器PC,将PC 值设为相应的中断向量的地址,从而实现跳转以执行中断服务程序。
异常中断的返回当处理器执行完以上流程之后,处理器已经从中断向量进入异常处理的状态。
异常中断处理完毕之后,在异常中断程序的末端,处理器进入异常中断的返回状态,其流程如下:1).恢复状态寄存器。
将保存的备份程序状态寄存器SPSR 值赋给当前程序状态寄存器CPSR。
2).将返回地址赋值到程序计数器(PC)。
这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。
需要注意的是:对于不同的异常中断,其返回地址的计算方法也是不同的,IRQ 和F IQ 异常中断产生时,程序计数器PC 已经更新,而SWI 中断和未定义指令中断时由当前指令自身产生的,程序计数器P C 尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。
嵌入式系统综合实验一学号:装 订线实验报告课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________实验名称:综合实验一dht11和人体感应传感器 实验类型:验证型 同组学生姓名:孙凡原三、主要仪器设备(必填) 四、操作方法和实验步骤五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得一、实验目的和要求1.掌握字符设备驱动程序的基本结构和开发方法2.掌握用户空间调用设备驱动的方法3.掌握用户和内核的交互二、实验内容和原理专业:测控技术与仪器姓名:颜睿装订线1.编写温湿度传感器DHT11驱动,传输打印温湿度信息2.编写人体感应传感器驱动,控制LED灯亮灭原理:温湿度传感器DHT11:1.引脚图实际使用传感器没有NC引脚2.数据采集a.数据总时序用户主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出40bit 的数据,幵触发一次信采集。
b.主机发送起始信号连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于18ms,然后等待DHT11 作出应答信号。
装线订c.检测从机应答信号DHT11 的DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11 的DATA引脚处于输出状态,输出80 微秒的低电平作为应答信号,紧接着输出80 微秒的高电平通知外设准备接收数据。
装订线d.接收数据(1)数据判定规则位数据“0”的格式为:50 微秒的低电平和26-28 微秒的高电平,位数据“1”的格式为:50 微秒的低电平加70微秒的高电平。
接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。
(2)数据格式一次传送40 位数据,高位先出8bit 湿度整数数据+ 8bit 湿度小数数据+8bit 温度整数数据+ 8bit 温度小数数据+8bit 校验位。
(3)数据校正判断“8bit 湿度整数数据+ 8bit 湿度小数数据+8bit 温度整数数据+ 8bit 温度小数数据”的结果是否等于8bit校验位。
如果等于则数据接收正确,否则应该放弃这一次的数据,重新接收。
人体感应传感器HCSR-501:装线订1、全自动感应:人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平2、光敏控制(可选择,出厂时未设)可设置光敏控制,白天或光线强时不感应。
3、温度补偿(可选择,出厂时未设):在夏天当环境温度升高至 30~32℃,探测距离稍变短,温度补偿可作一定线的性能补偿。
4、两种触发方式:(可跳线选择)a、不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平;b、可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
5、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。
此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。
(此时间可设置在零点几秒—几十秒钟)。
6、工作电压范围宽:默认工作电压 DC4.5V-20V。
7、微功耗:静态电流<50 微安,特别适合干电池供电的自动控制产品。
线8、输出高电平信号:可方便与各类电路实现对接。
三、主要仪器设备树莓派、PC机、温湿度传感器、人体感应传感器四、操作方法和实验步骤1.根据说明书编写传感器驱动2.编写可执行程序五、实验数据记录和处理1.传感器驱动demo.c#include<linux/init.h>#include<linux/module.h>#include<linux/device.h>#include<linux/gpio.h>#include<linux/interrupt.h>#include<linux/cdev.h>#include<linux/ioctl.h>线#include<linux/fs.h>#include<linux/delay.h>#include<asm/uaccess.h>#define DRIVER_NAME"Demo"#define DEVICE_NAME"Demo"static dev_t demo_devno; //设备号static struct class *demo_class;static struct cdev demo_dev;static struct gpio_config{int button_num;//人体传感器输出端int out_num;//温湿度传感器数据端int led_num;//人体红外传感器连接的ledint led1_num;//温湿度传感器连接的ledint humidity;//湿度值int temperature;//温度值}config;线static int i=0;static int flag = 0;//open 函数,应用程序调用open系统调用时会调用本函数static int demo_open(struct inode*inode,struct file *filp){printk(KERN_INFO"Demo open\n");return0;}//release 函数,应用程序调用close系统调用时会调用本函数static int demo_release(struct inode *inode, struct file *filp){线if(flag){gpio_free(config.button_num);gpio_free(config.led_num);flag = 0;}printk(KERN_INFO"Demo release\n");return0;}//ioctl 控制函数,应用程序调用ioctl系统调用时会调用本函数static long demo_ioctl(struct file*filp,unsigned int cmd,unsigned long arg) {int err = 0;int buff[40];int humi=0;int temper=0;线switch(cmd){case0://0 表示命令号,一般都用宏定义来控制{if(copy_from_user(&config,( void *)arg,sizeof(struct gpio_config))){ //从用户程序中获取配置数据printk(KERN_ERR"[%s %d] : copy_from userfailed !\n",__func__,__LINE__);return -EFAULT;}printk(KERN_INFO"[%s %d]: Get button gpio num: %d and led gpio num: %d\n ",__func__,__LINE__,config.button_num,confi g.led_num);err =gpio_request_one(config.button_num,GPIOF_IN ,"Light Button");if(err)线 {printk(KERN_ERR"[%s %d] :Request button gpiofailed\n",__func__,__LINE__);return -EFAULT;}err =gpio_request_one(config.led_num,GPIOF_OUT_I NIT_LOW,"LED light");if(err){printk(KERN_ERR"[%s %d] :Request led gpiofailed\n",__func__,__LINE__);gpio_free(config.button _num);return -EFAULT;}线 err =gpio_request_one(config.out_num,GPIOF_IN,"L ight Button");if(err){printk(KERN_ERR"[%s %d] :Request button gpiofailed\n",__func__,__LINE__);gpio_free(config.button _num);gpio_free(config.led_nu m);return -EFAULT;}err =gpio_request_one(config.led1_num,GPIOF_OUT_ INIT_LOW,"LED light");if(err){线printk(KERN_ERR"[%s %d] :Request led gpiofailed\n",__func__,__LINE__);gpio_free(config.out_nu m);gpio_free(config.button _num);gpio_free(config.led_nu m);}flag = 1;break;}case1:{gpio_direction_output(confi g.led_num,0);//设置led输出gpio_direction_input(config .button_num);//设置人体传感器输入线gpio_set_value(config.led_n um,0);//关ledif(gpio_get_value(config.bu tton_num)==0)//人体感应输入低电平,led灭{gpio_set_value(config.l ed_num,0);}elseif(gpio_get_value(config.button_num)==1)//人体感应输入高电平,led亮{gpio_set_value(config.l ed_num,1);}gpio_direction_output(confi g.led1_num,0);//设置led1输出(实际并未使用)线gpio_direction_output(confi g.out_num,1);//设置温湿度传感器数据端的引脚为输出gpio_set_value(config.led1_ num,0);gpio_set_value(config.out_n um,0);//根据dht11的数据传输规则进行操作mdelay(20);gpio_set_value(config.out_n um,1);udelay(40);gpio_direction_input(config .out_num);while(gpio_get_value(config .out_num)==0){}while(gpio_get_value(config .out_num)==1){}for(i=0;i<40;i++)线 {while(gpio_get_value(co nfig.out_num)==0){}udelay(50);if(gpio_get_value(confi g.out_num)==1)//获得的数据存入buff[40]数组 {buff[i]=1;while(gpio_get_valu e(config.out_num)==1){}}elsebuff[i]=0;}for(i=0;i<16;i++)//湿度移位相加{线 humi=humi*2+buff[i]; }for(i=16;i<32;i++)//温度移位相加{temper=temper*2+buff[i] ;}config.humidity=humi;config.temperature=temper;gpio_direction_output(confi g.out_num,1);//测量结束引脚置高电平gpio_set_value(config.out_n um,1);mdelay(2000);//延时一段时间再测量线if(copy_to_user((void*)arg,&config,sizeof(struct gpio_config)))//数据传入用户态{printk(KERN_ERR"[%s %d] : copy to user failed !\n",__func__,__LINE__);return -EFAULT;}flag=1;break;}default:printk(KERN_INFO"[%s %d]:In valid cmd", __func__,__LINE__);break;}return0;}线static struct file_operations demo_fops = { .owner = THIS_MODULE,.open = demo_open,.release = demo_release,.unlocked_ioctl = demo_ioctl,};static int __init demo_init(void){int err;printk(KERN_INFO"Demo Init \n");err =alloc_chrdev_region(&demo_devno,0,1,DRIVER_ NAME);if(err < 0){线goto err;}cdev_init(&demo_dev,&demo_fops);err = cdev_add(&demo_dev,demo_devno,1);if(err < 0){printk(KERN_ERR"[%s,%d]add cdev failed\n",__func__,__LINE__);goto FREE_DEVNO;}//自动生成设备文件在/dev目录下,文件名为DEVICE_NAMEdemo_class =class_create(THIS_MODULE,DEVICE_NAME);if(IS_ERR(demo_class)){printk(KERN_ERR"[%s,%d]class create failed\n",__func__,__LINE__);线goto DEV_FREE;}device_create(demo_class,NULL,demo_devn o,NULL,DEVICE_NAME);return0;DEV_FREE:cdev_del(&demo_dev);FREE_DEVNO:unregister_chrdev_region(demo_devno, 1); err:return err;}static void demo_exit(void){if(flag){gpio_free(config.button_num);gpio_free(config.led_num);线gpio_free(config.out_num);gpio_free(config.led1_num);}device_destroy(demo_class,demo_devno);class_destroy(demo_class);cdev_del(&demo_dev);unregister_chrdev_region(demo_devno, 1);printk(KERN_INFO"Demo exit\n");}module_init(demo_init);module_exit(demo_exit);MODULE_AUTHOR("hyg");MODULE_DESCRIPTION("BUTTON LED Driver"); MODULE_LICENSE("GPL");2.应用程序demo.c#include<stdio.h>线#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ioctl.h>#include<sys/time.h>#include<sys/ioctl.h>#include<errno.h>#include<fcntl.h>struct gpio_config{int button_num;int out_num;int led_num;int led1_num;int humidity;int temperature;};int main(int argc, char **argv)线{int fd;float h;float t;struct gpio_config config;config.button_num = 26;//人体感应传感器引脚config.led_num = 3;//led引脚config.out_num = 5;//dht11引脚config.led1_num = 6;//未使用config.humidity = 0;//湿度config.temperature = 0;//温度fd = open("/dev/Demo", O_RDWR);if (fd < 0) {perror("/dev/Demo");exit(0);}ioctl(fd,0,&config);//分配引脚传入内核态线while(1){ioctl(fd,1,&config); //启动驱动进行数据采集h=(float)config.humidity/256;t=(float)config.temperature/256;printf("humidity: %0.2f %rh\n",h);printf("temperature: %0.2f C\n",t);sleep(0.5);}close(fd);return0;}3.makefile修改装 订线a 用户程序makefile 更改gcc 路径为本机路径: CC:=/home/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc b.驱动程序makefile修改linux 文件夹路径KERNELDIR:=/home/linux/4.硬件接线5.编译加载运行 a.环境变量装订线b.编译c.拷贝d.加载运行六、实验结果与分析人体传感器有反应,led灯亮装线订实验完成七、讨论、心得由于之前实现了超声波传感器的驱动,这次实验还是比较简单的,主要要看懂传感器说明书的流程,多调试几次就可以实现。