嵌入式系统综合实验一

合集下载

嵌入式系统-流水灯、按键、定时器实验报告

嵌入式系统-流水灯、按键、定时器实验报告

嵌入式系统应用实验报告姓名:学号:学院:专业:班级:指导教师:实验1、流水灯实验编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。

实验主要考察对STM32F10X系列单片机GPIO的输出操作。

参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。

由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。

由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。

反之,LED灯熄灭。

软件方面,在程序启动时,调用SystemInit()函数〔见附录1〕,对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。

GPIO配置函数为SZ_STM32_LEDInit()〔见附录2〕,函数中首先使能GPIO 时钟:RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。

初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,到达流水灯的效果〔程序完整代码见附录3〕。

实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:实验二、按键实验利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。

嵌入式系统实验一 存储器实验

嵌入式系统实验一 存储器实验

嵌入式系统实验一存储器实验嵌入式系统实验一-存储器实验2022春季嵌入式系统课程实验报告《嵌入式系统》课程实验报告学生姓名:班级:讲师:记分及评价:项目满分:5分一、实验名称记忆实验二、实验目的了解S3C2410X处理器的内部存储空间分配;掌握存储区域配置方法;掌握对存储区进行读写访问的方法。

三、实验内容熟练使用命令脚本文件对arm存储控制器进行正确配置。

使用c语言编程,实现对ram的读写访问。

四、实验原理s3c2410a的存储器控制器提供访问外部存储器所需要的存储器控制信号,具有以下特性:●支持小/大端(通过软件选择)。

●地址空间:每个bank有128mb(总共有8个bank,共1gb)。

●除bank0只能是16/32位宽之外,其他bank都具有可编程的访问位宽(8/16/32位)。

●总共有8个存储器bank(bank0~bank7):一其中6个用于rom,sram等;一剩下2个用于rom,sram,sdram等。

●7个固定的存储器bank(bank0~bank6)起始地址。

●最后一个bank(bank7)的起始地址是可调整的。

●最后两个bank (bank6和bank7)的大小是可编程的。

● 所有内存库的访问周期都是可编程的。

● 可以通过插入外部等待来延长总线访问周期。

● 支持SDRAM的自刷新和断电模式。

《嵌入式系统》课程实验报告2021年春季五、实验结果超级终端上显示一下信息:六、练习编写程序对sram进行字节的读写访问。

#包括\voidmemory_test(void){因蒂;uint16tdata;intmemerror=0;uint16t*pt;2022春季嵌入式系统课程实验报告uart_printf(\0x00e00000,_ram_startaddress+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e0000);//记忆书写while((uint32t)pt<(_ram_startaddress+0x00f00000)){*pt=(uint16t)pt;pt++;}//memoryreaduart_uuuprintf(\memorytest(%xh-%xh):rd\\n\uuu内存_uuuu起始地址+0x00e00000,uuu内存_uuu起始地址+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e00000);而((uint32t)pt<(_ram_startaddress+0x00f00000)){data=*pt;如果(数据!=(uint16t)pt){memerror=1;uart_uPrintf(\break;}pt++;}if(memerror==0)uart_printf(\}。

嵌入式系统——实验1

嵌入式系统——实验1

《嵌入式系统设计(实验课)》内容安排《嵌入式系统设计(实验课)》是《嵌入式系统设计》课程的一个重要环节。

通过实验,学生可以对嵌入式系统的设计与开发过程有更深地体会。

实验课共八次,每次2学时,实验内容结合课程内容,介绍一般的实验开发流程和软件硬件开发环境,并辅之以典型的嵌入式程序设计实例,使学生掌握基本的嵌入式软件开发技能。

大量的具有实际应用背景的实验,更将理论与实践结合起来,使实验内容更加生动。

实验报告要求一、实验名称:说明:本次实验的名称二、实验目的:说明:本次实验的主要目的,参考每次的实验指导书三、实验环境:说明:实验用到的硬件软件环境。

四、实验内容与步骤:说明:实现实验目的而进行的实验内容,如果有步骤要求则简要列出步骤五、实验报告总结:说明:对本次实验的总结,1.画出主函数的程序流程图,2.重写主程序.或者:自拟一个新的应用,参照本次实验的主程序,重新设计主程序并给出详尽注释。

3.其他,本次实验得到了什么?收获是什么?有些什么别的想法?六、建议与意见:说明:对于此次实验内容或在实验过程中有任何问题或建议,以及对于改善实验效果有什么建议,均可提出。

在书写实验报告的过程中,主要是帮助自己回顾和总结实验。

重点放在第五部分,前四项可以十分简要地列写,第六项有则提出,无则不写。

实验一嵌入式微处理器系统的开发环境一、实验环境PC机一台软件: ADS 1.2集成开发环境一套二、实验目的1.了解嵌入式系统及其特点;2.熟悉嵌入式系统的开发环境和基本配置并能编写简单的汇编程序三、实验内容1.嵌入式系统的开发环境、基本配置2.使用汇编指令完成简单的加法实验四、实验步骤(1)在D:\新建一个目录,目录名为experiment。

(2)点击 WINDOWS 操作系统的“开始|程序|ARM Developer Suite v1.2 |Code Warrior for ARM Developer Suite”启动Metrowerks Code Warrior,或双击“ADS 1.2”快捷方式启动。

《嵌入式电子系统设计》课程实验指导书实验1:最小系统实验,(2014.7.11)

《嵌入式电子系统设计》课程实验指导书实验1:最小系统实验,(2014.7.11)

实验一最小系统实验一、实验目的熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。

掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。

二、实验原理本实验通过一个简短的 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宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。

嵌入式系统 实验报告

嵌入式系统 实验报告

使能 IRQ 中断。
4 装载并使能外中断;
5 选用 DebugInExram 生成目标,然后编译连接工程。
6 选择【Project】->【Debug】,启动 AXD 进行 JTAG 仿真调试。
7 全速运行程序,LED 闪烁;
8 每一次按键 Key,蜂鸣器就会转换静音或鸣响状态。
四.测试数据及运行结果
1
五.总结
1.实验过程中遇到的问题及解决办法;
由于本次实验较简单,且我们之前学习的微机原理课程也进行了流水灯的设
计实验,所以对于本次实验,我完成地很顺利,在实验中没有遇到问题。
2.对设计及调试过程的心得体会。
本次实验是本学期该课程我们进行的第一次实验,总的来说,实验不是很难,
设计过程也相对简单,其主要目的是让我们熟悉一下实验环境,并且能在实验环
6
五.总结 1.实验过程中遇到的问题及解决办法;
实验第一次运行时,蜂鸣器一直处于鸣响状态,及时按了按键,蜂鸣器还是 一直鸣叫,不产生外中断。后来仔细检查了程序,发现原来是忘记使能 EINT0 中 断了,加上 VICIntEnable = 1<<0x0e 代码,程序就能正常运行了。 2. 对设计及调试过程的心得体会。
境下进行简单的实验操作,为之后的实验打下坚实的基础。
六.附录:源代码(电子版)
#include "config.h"
const uint32 LEDS8 = 0xFF << 18;//P1[25:18]控制 LED1~LED8,低电平点亮
const uint32 KEY = 1 << 16;
//P0.16 连接 KEY1
三.方案设计
① 启动 ADS1.2IDE 集成开发环境,选择 ARM Executable Image for lpc2131

嵌入式系统实验报告(华中科技大学)

嵌入式系统实验报告(华中科技大学)

课程实验报告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学号:Ux姓名:x合作者:x实验时间:xxxx年xx月xx日计算机科学与技术学院试验一:bootloader (ads、引导)一、实验任务1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1){打印菜单并等待用户输入;switch(ch) //根据用户输入做相应处理{case '1':imgsize=xmodem_receive((char *)KERNEL_BASE, MAX_KERNEL_SIZE);if(imgsize==0) //下载出错;else //下载成功;break;case '3':nand_read((unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024);case '2':BootKernel(); //这里是不会返回的,否则出错;break;default:break;}}Bootloader的main()函数打印菜单:int main(void){ARMTargetInit(); //目标板初始化;//接收用户命令,传递linux核心;Uart_puts("Menu:\n\r");Uart_puts("1.Load kernel via Xmodem;\n\r");Uart_puts("2.Boot linux; \n\r");Uart_puts("3.Load kernel from flash and boot; \n\r");Uart_puts("Make your choice.\n\r");do{ch=Uart_getc();}while(ch!='1' && ch!='2' && ch!='3');return 0;}串口读写:void Uart_putc(char c){while(!SERIAL_WRITE_READY());((UTXH0) = (c));}unsigned char Uart_getc( ){while(!SERIAL_CHAR_READY());return URXH0;}2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪;5.配置超级终端,与bootloader通讯;6.配置nfs;编辑/etc/export文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs restart测试nfs服务器是否正常运行:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt7.以root用户启动cutecom,将cutecom配置改为115200 bps,8位,1位停止位,无校验,xmodem,no line end;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。

嵌入式系统设计(实验一)

嵌入式系统设计(实验一)

工业控制
嵌入式系统被广泛应用于工业 自动化领域,如生产线控制、 机器人控制等。
医疗设备
嵌入式系统可以实现医疗设备 的自动化控制和数据采集,如 医疗监护仪、输液泵等。
其他领域
嵌入式系统还可以应用于通信、 能源、环保等领域,发挥着越 来越重要的作用。
03
硬件平台搭建与配置
硬件平台选择
ARM开发板
传感器与执行器
汇编语言
针对特定硬件平台,使用汇编语言可 以实现更高效的代码执行和更精确的 硬件控制。
软件架构设计
分层架构
将系统划分为多个层次,每个层次负责特定的功能,降低系统复 杂性并提高可维护性。
事件驱动架构
通过事件触发相应的处理函数,实现模块间的解耦和异步通信。
微内核架构
将核心功能集中在微内核中,通过插件或模块扩展系统功能,提高 灵活性和可扩展性。
嵌入式系统设计(实验一)
• 实验目的与要求 • 嵌入式系统概述 • 硬件平台搭建与配置 • 软件设计与实现 • 系统测试与验证 • 实验总结与展望
01
实验目的与要求
实验目的
掌握嵌入式系统基本概念
01
通过实验了解嵌入式系统的定义、特点、应用领域等基本概念。
熟悉嵌入式开发环境
02
学习搭建嵌入式开发环境,包括硬件平台、操作系统、开发工
THANKS
感谢观看
提交实验报告
按时提交完整的实验报告,展示实验成果和 收获。
02
嵌入式系统概述
嵌入式系统定义
01
嵌入式系统是一种专用的计算机 系统,它被设计为控制、监视或 者辅助操作机器和设备的运行。
02
与通用计算机系统不同,嵌入式 系统通常被嵌入到特定的设备中 ,执行特定的任务,并且不需要 人工干预。

嵌入式系统实验报告

嵌入式系统实验报告

嵌入式系统实验报告学号:姓名:班级: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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称: 姓名: 学号:装订线P.1实验报告课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________实验名称:综合实验一dht11和人体感应传感器 实验类型:验证型 同组学生姓名:孙凡原 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得一、实验目的和要求1.掌握字符设备驱动程序的基本结构和开发方法2.掌握用户空间调用设备驱动的方法3.掌握用户和内核的交互二、实验内容和原理1.编写温湿度传感器DHT11驱动,传输打印温湿度信息2.编写人体感应传感器驱动,控制LED 灯亮灭原理:温湿度传感器DHT11:1.引脚图实际使用传感器没有NC 引脚 2.数据采集 a.数据总时序用户主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发专业:测控技术与仪器姓名:颜睿 学号:3130103850日期:2018.4.28地点:创客空间装订线送响应信号,送出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,config.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_INIT_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,"Light Button");if(err){printk(KERN_ERR"[%s %d]:Request button gpiofailed\n",__func__,__LINE__);gpio_free(config.button_num);gpio_free(config.led_num);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_num);gpio_free(config.button_num);gpio_free(config.led_num);}flag = 1;break;}case1:{gpio_direction_output(config.led_num,0);//设置led输出gpio_direction_input(config.button_num);//设置人体传感器输入gpio_set_value(config.led_num,0);//关led装订线if(gpio_get_value(config.button_num)==0)//人体感应输入低电平,led灭 {gpio_set_value(config.led_num,0);}else if(gpio_get_value(config.button_num)==1)//人体感应输入高电平,led 亮{gpio_set_value(config.led_num,1);}gpio_direction_output(config.led1_num,0);//设置led1输出(实际并未使用)gpio_direction_output(config.out_num,1);//设置温湿度传感器数据端的引脚为输出gpio_set_value(config.led1_num,0);gpio_set_value(config.out_num,0);//根据dht11的数据传输规则进行操作mdelay(20);gpio_set_value(config.out_num,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(config.out_num)==0){}udelay(50);if(gpio_get_value(config.out_num)==1)//获得的数据存入buff[40]数组{buff[i]=1;while(gpio_get_value(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(config.out_num,1);//测量结束引脚置高电平gpio_set_value(config.out_num,1);mdelay(2000);//延时一段时间再测量if(copy_to_user((void *)arg,&config,sizeof(struct gpio_config)))//数据传入用户态{printk(KERN_ERR"[%s %d] : copy to userfailed !\n",__func__,__LINE__);return -EFAULT;}flag=1;break;}default:printk(KERN_INFO"[%s %d]:Invalid 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_devno,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灯亮实验完成七、讨论、心得由于之前实现了超声波传感器的驱动,这次实验还是比较简单的,主要要看懂传感器说明书的流程,多调试几次就可以实现。

相关文档
最新文档