M0模块的读写操作_第1页
M0模块的读写操作_第2页
M0模块的读写操作_第3页
M0模块的读写操作_第4页
M0模块的读写操作_第5页
已阅读5页,还剩69页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、最新M0模块的读写操作嵌入式系统是物联网产业开展的核心推动力 中嵌协会 柏斯维 2022年8月7日*总理视察无锡时,提出在无锡加快建立“感知中国中心的指示。从此在国内不管是各级地方政府还是企业都很重视,并掀起了一个追逐物联网的行动热潮。一年过去了,再一次的解读温总理的“感知中国更具有现实意义和深远的历史意义。嵌入式与物联网的关系 温总理用经典的四个字“感知中国全面描述和定义了物联网产业的内涵。从字面上来理解,“感既是信息采集传感器;“知信息处理运算、处理、控制、通信并通过互联网进行信息传递和控制。这些都是嵌入式系统的特征实质。如果归纳一句话来理解总理“感知中国的含义,既是通过嵌入式系统智能终端

2、产品网络化的过程实现感知的目的。 简单讲,物联网是物与物、人与物之间的信息传递与控制。专业上讲就应该是智能终端的网络化。大家都知道,嵌入式系统无所不在,有嵌入式系统的地方才会有物联网的应用。所以,我在所有的场合都在传播一个理念,什么是物联网呢?物联网就是基于互联网的嵌入式系统。从另一个意义也可以说,物联网的产生是嵌入式系统高速开展的必然产物,更多的嵌入式智能终端产品有了联网的需求,催生了物联网这个概念的产生。记得是在09年10月12日,英特尔公司宣布成立中国研究院并且专攻嵌入式方向。在全球热炒物联网概念时,英特尔为什么不成立物联网研究院?而专注嵌入式的研究呢。这是值得深思研究的课题。那么,在2

3、022英特尔信息技术峰会IDF的前一天,英特尔CTO贾斯汀和英特尔研究院方之熙院长一起宣布了英特尔中国研究院全新的研究战略致力于打造世界一流的嵌入式系统研究院。方院长讲到:作为英特尔研究院全球5大节点之一,英特尔中国研究院将承当嵌入式系统的前瞻性研究任务,放眼全球嵌入式增长机遇,融合国人智慧做世界级的研究,并将国际水准的研究成果直接奉献于中国的开展。 中国 、互联网、有线电视用户人数均居全球第一,也已成为名副其实的世界第一汽车市场。从智能交通到车载信息设备,从“物联网到智能家电,嵌入式移动互联在中国开展前景广阔。中国这么大的市场规模、这么快的增长速度,提供了很多非常好的研究课题。这些研究课题在

4、世界上也都是非常前沿的,为企业提供了很多的开展时机。 企业追逐的是利润而不是概念。从以上例子就足以看出物联网与嵌入式系统的关系、嵌入式系统的重要性、嵌入式系统在物联网产业开展中的角色地位。嵌入式系统才是拉动GDP的增长和产业升级的真正动力。嵌入式系统才是物联网产业开展的核心推动力。 物联网人才需求与培养 企业开展科技进步离不开人才,特别是在21世纪科技高速开展的今天。毋庸置疑,物联网的开展对人才的需求更是迫在眉睫,人才的短缺将是物联网产业开展的瓶颈。可以这样说,在物联网产业开展中,有了人才就掌握了竞争的主动权,有了人才就占领了竞争的制高点。目前,在高等院校都纷纷加快物联网相关的学科建设,社会培

5、训机构也是人才培养的不可或缺的力量,特别是利用嵌入式系统的培训机构,在嵌入式系统教学的根底上,增加通信、无线模块、RFID、网络等课程,就可以很快的适应物联网技术开展的需求,这也是最快的人才培养捷径之一。大力推动嵌入式与物联网的人才引进和培训,是为构筑物联网产业开展创造人力资源的根底条件。 物联网、云计算不是炒作,是嵌入式系统物联与互联网技术在高级阶段上交叉融合变革时代产物。当物联网热闹过后,必然会进入一个理性时代。深入了解嵌入式系统物联史,有助于厘清物联网、云计算的本质。目前,物联网、云计算领域中,缺少嵌入式系统视角。物联网系统构建、物联网系统工程应用,是物联网时代嵌入式系统的新机遇。下面由

6、卓跃教育为您介绍。单片、嵌入、物联三位一体的嵌入式系统单片机与嵌入式系统是不同时代概念的同一事物,经历了许多不为人知的诞生环境与开展历程。单片机概念出现在PC机诞生之前,PC机诞生后才有了嵌入式系统概念。无论是单片机还是嵌入式系统,它们都呈现出单片、嵌入、物联的三位一体的特征。“单片机强调的是形态,“嵌入式系统强调的是应用形式,“物联那么是它们的本质。PC机出现后,计算机走出机房,成为群众工具。计算领域、工业控制领域都寄希望于计算机,由此诞生了通用计算机系统与嵌入式计算机系统两大概念。嵌入式计算机系统企图沿袭PC机的模式,走单板机、工控机、单片微型计算机6801系列的道路,却进入死胡同。在计算

7、机界,“嵌入式计算机系统死亡了,“嵌入式系统却始终存在,以至于20多年后,单片机有了“嵌入式系统的称呼与视角。1971年,Intel公司推出了世界上第一个微处理器,即4位微处理器4004。随后又推出了8位的8008。1974年,8008开展成8080,成为第二代微处理器,其目的是代替子逻辑电路器件,应用于各种电路系统和设备中,由此开始了嵌入式处理器的尝试。随后,众多的单片机微控制器应运而生,如1974年Mostek公司与仙童公司的3870系列单片机、1976年Intel公司的8048单片机、1977年GI公司的PIC1650系列单片机、1978年Rockwell公司的6500系列单片机,以及1

8、980年Intel公司推出的MCS51系列单片机,这些单片机本质上都是嵌入式处理器根底上的微控制器。1981年8月12日,IBM公司在Intel8088微处理器根底上,推出了全球第一台个人计算机,即IBMPC。实际上,在PC机诞生前,单片机也经为嵌入式应用寻找到了最正确的“微控制器应用模式。当时由于强调的自己独立的单片形态,称之为单片机,即实现单片形态嵌入式应用的微控制器,控制的是物理对象。因此,“单片、“嵌入、“物联是单片机或嵌入式系统三位一体、与生俱来的本质特性M0内核PLC11C14的中断和其他arm产品的中断不一样,PLC11C14芯片手册上说有32个中断0-31,其中27号中断保存,

9、0-11共十二个是静态的中断向量,有外部引脚P0端口的,P0_0到P0_11,一一对应,12号中断由P1_0对应。PLC11C14一共四个端口,P0到P3,其中P0到P2每个端口十二个引脚,P3口四个引脚。内部中断有四个定时器中断,看门狗中断,串口,SPI,等等。这些也大同小异,但是在最后的有一个中断状态的中断源28 PIO_3 GPIO interrupt status of port 329 PIO_2 GPIO interrupt status of port 230 PIO_1 GPIO interrupt status of port 131 PIO_0 GPIO interrupt

10、 status of port 0经过仔细研究BSP包内的软件源码,发现上诉四个中断可以监控四个端口,当这些端口中有引脚电位变化时,出发中断,进入中断效劳函数,PIOINT0_IRQHandlervoid;在中断中判断是哪个引脚发生了中断if(GPIOIntStatus(PORT2, 8)/对应PORT2_8端口的中断事件,这样一来所有外部的GPIO,都可以作为外部中断使用,大大提高了资源的利用率,我们可以在下半部机制完成中断处理函数,在中断中只置位标志位,在main函数中轮询标志位是否发生变化,发生变化后跳转到对应的下半部处理函数中,这样中断触发后可以很快完成处理,不会在中断中浪费过多资源。

11、同时我们可以设置触发中断的条件,BSP包中提供了一个函数GPIOSetInterrupt(PORT2, 8, 1,0, 0 );GPIOIntEnable(PORT2,8);对应参数,第一个端口号;第二个参数管脚号;第三个参数电平触发还是跳变沿触发0为跳变沿触发,1为电平触发;第四个参数当第三参数设置为跳变沿出发时,0位单边沿触发,1为双边沿触发;当第三参数设置为点评触发是,0代表低电平,1代表高电平。第五个参数设置上升沿还是下降沿触发,对单边沿触发有效。上面设置PORT2_8引脚,低电平触发方式。1、Colink 固件升级Colink板子链接2、安装Colink驱动ColinkExUsbDr

12、iver-1.2.0,然后重启PCwin7 64 位ColinkExUsbDriver-1.2.0 安装方法you need to downloadModified the inf file from:,then do the following operation:1.Open theInstallation folder: replace the inf file with the new one.2.Delete the file:dpinst.xml.3. run dpinst_amd64.exe.PS: Only Windows 64bit OS need to dothe repl

13、acement.ForNepi: Please do the same operation.If the driveris unable to be installed on vista 64bit, connect us.We will release a new driver in a few days.早上安装keil的一点小插曲,我的是vin7 64位没有对应的驱动,后来在网上查到的解决方法; 好了下面开始分析程序,在keil下建立工程就会生成对应的引导文件,也就是汇编写的,怎么引导c代码,这里掠过。开始第一个main;int main(void) SystemInit(); GPIO

14、Init(); CLKOUT_Setup(CLKOUTCLK_SRC_MAIN_CLK); /*这个主要是要设置CLKOUT,WDT CLOCK,SPI,UART,等输出时钟*/ while(1) 好了啃掉第一个函数SystemInit,这里涉及到各种存放器都要亲自动手去看芯片手册,void SystemInit (void) uint32_t i; LPC_SYSCON-SYSMEMREMAP = 0 x2;/*这个函数是内存映射函数,0 x2,是将flash映射到0 x0地址,我看了一下手册,发现flash就在0 x0地址,所以只要程序下载到flash中就可以运行,注意,程序默认从0 x0

15、地址开始执行的*/ LPC_SYSCON-SYSOSCCTRL = 0 x00;/*系统晶振选择,0 x00 是默认值,频率范围是1-20MHz*/ LPC_SYSCON-PDRUNCFG &= (0 x15);/*这个用来设置power-down 的,不知道怎么翻译好了,大家应该都懂得,这种表示是将第六位清零,其他位保持不变第六位是SYSOSC_PD 系统晶振*/ for ( i = 0; i SYSAHBCLKCTRL |= (1SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* Select system OSC */ LPC_SYSCON-SYSPLLCLKUE

16、N = 0 x01; /* Update clock source */ LPC_SYSCON-SYSPLLCLKUEN = 0 x00; /* toggle Update register once */ LPC_SYSCON-SYSPLLCLKUEN = 0 x01; while ( !(LPC_SYSCON-SYSPLLCLKUEN & 0 x01) ); /* Wait until updated */*这一局部是选择时钟源的,将SYS-PLL时钟源设置为 System 晶振,并更新时钟源*/ regVal = LPC_SYSCON-SYSPLLCTRL; regVal &= 0 x1

17、FF; LPC_SYSCON-SYSPLLCTRL = (regVal | (MAIN_PLL_P_ValPDRUNCFG &= (0 x1SYSPLLSTAT & 0 x01) ); LPC_SYSCON-MAINCLKSEL = 0 x03; LPC_SYSCON-MAINCLKUEN = 0 x01; LPC_SYSCON-MAINCLKUEN = 0 x00; LPC_SYSCON-MAINCLKUEN = 0 x01; while ( !(LPC_SYSCON-MAINCLKUEN & 0 x01) ); /*这一局部是选择时钟源的,将MAINCLK 时钟源设置为 PLL clock

18、,并更新时钟源*/ LPC_SYSCON-SYSAHBCLKDIV = SYS_AHB_DIV_Val; SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1); SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val); return;工程大体框架:假设你要管理一个大的仓库,其中要防止的重要的物品,你要实时的监控仓库的环境,包括温度,湿度,光照,和进出货物的数量以及进出人员。怎么样像不像一个仓库管理员的工作,没错就是管理员的工作,我们的工程就是要用物联网的知识来搭建一个系统完

19、成管理员的工作,这个工程管理比管理员管理范围更大精度更高,本钱更低。好了下面具体说一说工程模块。模块一:感知模块,实时监测仓库环境,主要有温度传感器,湿度传感器,三轴传感器。模块二:效劳模块,boa效劳器,在a8上创立效劳器,处理由M0上传来的信息。模块三:在a8上移植linux kernel,用于线程调度,摄像头驱动I2C控制模块四:网页编写,可以登录物联网系统,实时查看环境信息下面是boa效劳器移植过程嵌入式Linux中的Web效劳器应用一BOA简介Boa是一个非常小巧的Web效劳器,其可执行代码只有60K左右。它是一个单任务的Web效劳器,只能依次完成用户的请求,而不会fork出新的进程

20、处理并发连接请求。但boa支持cgi,能够为cgi程序fork出一个进程来执行。Boa的设计目标是速度和平安,在其站点公布的性能测试中,boa的性能要好于apache效劳器。:w随着网络技术的迅猛开展,在嵌入式设备的管理和交互中,基于Web方式的应用成为目前的主流,用户可以直接通过远程登录的方式对设备进行管理和维护,大大方便了使用性。下面就为大家讲解一下boa效劳器在嵌入式Linux系统中的移植过程。二BOA效劳器移植工具链:gccversion4.5.1平台: 处理器:s5pc100内核:linux-2.6.351.解压源码2.进入src/./configure生成Makefile修改Mak

21、efile修改CCgcc为CCarm-none-linux-gnueabi-gcc修改CPPgcc-E为CPParm-none-linux-gnueabi-gcc-E3.make编译1)编译一个linux下的c系统,包含词法和语法分析模块,Linux上用bison和flex。yacc是一个文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用于构造词法分析机和语法解释器的工具,利用Lex和YACC你可以轻松的构造一个语法解释器。sudoapt-getinstallbisonflex2)修改src/log.c注释掉if(dup2(error_log,STDERR_FILEN

22、O)=-1)DIE(unabletodup2theerrorlog);为:/*if(dup2(error_log,STDERR_FILENO)=-1)DIE(unabletodup2theerrorlog);*/3)修改src/boa.c注释掉下面内容:if(passwdbuf=NULL)DIE(getpwuid);if(initgroups(passwdbuf-pw_name,passwdbuf-pw_gid)=-1)DIE(initgroups);为#if0if(passwdbuf=NULL)DIE(getpwuid);if(initgroups(passwdbuf-pw_name,pas

23、swdbuf-pw_gid)=-1)DIE(initgroups);#endif4)修改src/boa.cif(setuid(0)!=-1)DIE(ickyLinuxkernelbug!);为#if0if(setuid(0)!=-1)DIE(ickyLinuxkernelbug!);#endif5)执行make出现错误:arm-none-linux-gnueabi-gcc-g-O2-pipe-Wall-I.-c-outil.osrc/util.csrc/util.c:100:1:error:pastingtand-doesnotgiveavalidpreprocessingtokenmake:

24、*util.oError1#去掉其中./src/compat.h120行的#。然后给boa瘦身arm-none-linux-gnueabi-stripboa三Boa效劳器配置1创立目录mkdir/source/rootfs/etc/boa将boa源码目录下的boa.conf拷贝到/source/rootfs/etc/boa目录下cpboa.conf/source/rootfs/etc/boa2修改配置文件boa.confvim/source/rootfs/etc/boa(1)user的修改修改Usernobody为User0(2)Group的修改修改Groupnogroup为Group0(3)

25、ScriptAlias的修改修改ScriptAlias/cgi-bin/usr/lib/cgi-bin/为ScriptAlias/cgi-bin/www/cgi-bin/(5)DocumentRoot的修改修改DocumentRoot/var/www为DocumentRoot/www(6)ServerName的设置修改#ServerName为ServerName否那么会出现错误“gethostbyname:Nosuchfileordirectory(7)AccessLog修改修改AccessLog/var/log/boa/access_log为#AccessLog/var/log/boa/ac

26、cess_log(8)以下配置和boa.conf的配置有关,都是在ARM根文件系统rootfs中创立以下步骤在开发板上进行:创立HTML文档的主目录/wwwmkdir/www创立CGI脚本所在录/www/cgi-binmkdir/www/cgi-bin当不能使用cgi时将#AddTypeapplication/x- d-cgicgi改为AddTypeapplication/x- d-cgicgi四boa器测试将boa拷贝到开发板根文件系统的/etc/boa下#cpsrc/boa/source/rootfs/etc/boa将ubuntu下/etc/mime.types拷贝到开发板根文件系统的/e

27、tc下#cp/etc/mime.types/source/rootfs/etc将你的主页index.html拷贝到www目录下运行boa,然后在主机游览器输入开发板网址rootfarsightboa#./boa30/10/2022:19:10:36+0000boa:serverbuilt10302022at19:10:3630/10/2022:19:10:36+0000boa:startingserverpid=968,port80附1:boa配置文件参数说明boa的配置文件是/etc/boa/boa.conf。Port:boa效劳器监听的端口,默认的端口是80。如果端口小于1024,那么必须

28、是root用 户启动效劳器。Listen:绑定的ip地址。不使用这个参数时,将绑定所有的地址。User:连接到效劳器的客户端的身份,可以是用户名或UID。Group:连接到效劳器的客户端的组,可以是组名或GID。ServerAdmin:效劳器出故障时要通知的邮箱地址。ErrorLog:指定错误日志文件。如果路径没有以“/开始,那么相对于ServerRoot路径。没 有配置时默认的文件是/dev/stderr。假设不想记录日志,指定文件为/dev/null。AccessLog:设置存取日志文件,与ErrorLog类似。UseLocaltime:设置使用本地时间,使用UTC时注释这个参数。这个参数

29、没有值。VerboseCGILogs:在错误日志文件中记录CGI启动和停止时间,假设不记录,注释这个参数。这个参数没有值。ServerName:指定效劳器的名称,当客户端使用gethostname+gethostbyname时返回给客户端。VirtualHost:虚拟主机开关。使用此参数,那么会在DocumentRoot设定的目录添加一个ip地址作为新的DocumentRoot来处理客户端的请求。如DocumentRoot设置为/var/www,那么 :/localhost/那么转换成,假设注释此参数,那么为/var/www/。DocumentRoot:HTML文件的根目录也就是网站的目录。U

30、serDir:指定用户目录。DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。这个变量也就是设置默认主页的文件名。DirectoryMaker:指定用于生成目录的程序,注释此变量将不允许列目录。DirectoryCache:当DirectoryIndex文件不存在,而DirecotryMaker又被注释掉时,将列出这个参数指定目录给客户端。KeepAliveMax:每个连接允许的请求数量。如果将此值设为0,将不限制请求的数目。KeepAliveTimeOut:在关闭持久连接前等待下一个请求的秒数。秒。MimeTypes:设置包含mimet

31、ypes信息的文件,一般是/etc/mime.types。DefaultType:默认的mimetype类型,一般是text/html。CGIPath:相当于给CGI程序使用的$PATH变量。SinglePostLimit:一次POST允许最大的字节数,默认是1MB.AddType:增加MimeType没有指定的类型,例:AddTypetypeextensionextension.。要使用cgi,必须添加cgi类型:AddTypeapplication/x- d-cgicgiRedirect:重定向文件Aliases:指定路径的别名。ScriptAlias:指定脚本路径的虚拟路径。附2:编译中

32、的出错处理错误1:debian:/home/a/boa-0.94.13/src#makeyacc-dboa_grammar.ymake:yacc:Commandnotfoundmake:*y.tab.cError127解决方法:debian:/home/a/boa-0.94.13/src#apt-getinstallbison错误2:debian:/home/a/boa-0.94.13/src#makelexboa_lexer.lmake:lex:Commandnotfoundmake:*lex.yy.cError127解决方法:debian:/home/a/boa-0.94.13/src#a

33、pt-getinstallflexmake:Nothingtobedoneforall.说明make没有检查到需要编译的东西,库或者应用程序已经编译好了。make主要检查的是时间戳,只要target比依赖的文件时间靠后它就认为不需要编译.今天写个程序,要求有输入两个数字,想都没想就用了scanf;本想写的严谨一些,就加了判断条件ifscanf“%d,%d,&a,&b != 2perror(input errorn);exit(1);测试时,输入少于两了数据,一个或不插入时错误信息被打印出来,但是当我输入的数字个数超过两个时,不会出现打印信息,测试结果也正常这样让我觉得这个判断条件有些鸡肋了,于

34、是到网上找一下关于scanf原函数#include #include #include loc_incl.hint scanf(const char *format, .) va_list ap; int retval; va_start(ap, format); retval = _doscan(stdin, format, ap); va_end(ap); return retval;其中,_doscan(stdin,fromat,ap)很复杂,大致功能 定义一些后面需要用到的变量跳过format格式串中的空格,并且跳过输入流中的空格输入流stream与format格式串中的空白符空白符可

35、以是空格(space)、制表符(tab)和新行符(newline)保持一致在format中的字符为%的前提下,stream中的字符也为%,那么继续format当前字符为*,表示读指定类型的数据但不保存指定说明最大域宽。 在百分号(%)与格式码之间的整数用于限制从对应域读入的最大字符数于宽度所以我出现的问题很好解释了,我输入数字时被放在输入缓冲区中,scanf对有需要的数字进行格式化输入,多余的还在缓冲区内,所以不会报错。输入一个数字后再输入任何间隔符,都会被scanf吃掉,直到输入第二个数字为止,格式化输入结束。工程中涉及到温湿度传感器,原理图给出,用DHT11温湿度一体ICDHT11 数字温

36、湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件。单总线说明DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备主机或从机通过一个漏枀开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 5.1k 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线

37、序列,如果出现序列混乱,器件将不响应主机。单总线传送数据位定义DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。数据格式:8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。校验位数据定义“8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据 8bit 校验位等于所得结果的末 8 位。例如一:接收到的 40 位数据为:0011 0101 0000 0000 0001 1000 0000 0000 0100 1101湿

38、度高 8 位 湿度低 8 位 温度高 8 位 温度低 8 位 校验位计算:0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101下面是一些代码,其中涉及到时序的地方做出注释uint32_t Read_Temp_Hum(uint8_t *temp, uint8_t *hum) uint32_t cnt_last; uint8_t hum_10, hum_01, temp_10, temp_01, chksum, chk; uint32_t tc1, tc; uint32_t i; p3_2_counter = 0; / 用来检测中断是否产生,在中断中

39、进行p3_2_counter+; cnt_last = p3_2_counter; GPIOIntDisable(PORT1, 5);/* 微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后微处理器的 I/O 设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作 出答复信号*/ GPIOSetDir(PORT1, 5, 1); / Set PIO1_5 to output GPIOSetValue(PORT1, 5, 0); delay_ms(30); /保证时间大于18ms GPIOSetV

40、alue(PORT1, 5, 1); /变成高电平 GPIOSetDir(PORT1, 5, 0); /set PIO1_5 to input GPIOSetInterrupt(PORT1, 5, 0, 0, 0); /设置下降沿触发,使能中断 GPIOIntEnable(PORT1, 5);/* DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA 引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接 收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平DHT11 回

41、应信号后,等待 80 微秒的高电平后的数据接收*/ for(i=0; i3; i+) /应答信号刚好是三个跳变沿,全部接受后,进行数据的接收 GPIOSetInterrupt(PORT1, 5, 0, 0, i&0 x01); while(p3_2_counter = cnt_last); /用来检测是否有中断产生,生成中断后p3_2_counter+; cnt_last = p3_2_counter; /* 由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据, 位数据“0的格式为: 50 微秒的低电平和 26-28 微秒的高电平。 位数据

42、“1的格式为: 50 微秒的低电平加 70微秒的高电平。*/ for(i=0; iVAL;在中断中完成GPIOSetInterrupt(PORT1, 5, 0, 0, 0); while(p3_2_counter = cnt_last); cnt_last = p3_2_counter;if(p3_2_tc tc1)tc = tc1 - p3_2_tc; /高电平时间,低电平都是50us不判断,判断高电平是时间来判断是0 or 1elsetc = 48000 - (p3_2_tc - tc1);/* DATA 用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位

43、数据,高位先出。 数据格式: 8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。 */if(i 8)hum_10 = 2328)/ 这里的2328是怎么得到的,系统时钟设置为48MHz,(1/48MHZ )*2328 = 48.5us; hum_10 |= 0 x01;/ 上面提到位数据“0时高电平26-28 微秒我们取27us,位数据“1时高电平70, / 判断上下的临界值27 + 70/2 = 48.5;else if(i 16)hum_01 = 2328) hum_01 |= 0 x01;else if(i 24)t

44、emp_10 = 2328) temp_10 |= 0 x01;else if(i 32)temp_01 = 2328) temp_01 |= 0 x01;elsechksum = 2328) chksum |= 0 x01; /* 当一位数据传输结束后,总线重新恢复高电平状态,下面的一次中断,就是恢复高电平状态同时也用来 同步p3_2_counter = cnt_last;*/ GPIOSetInterrupt(PORT1, 5, 0, 0, 1); while(p3_2_counter = cnt_last); GPIOIntDisable(PORT1, 5); *temp = temp_

45、10; *(temp+1) = temp_01; *hum = hum_10; *(hum+1) = hum_01;/* 下面是对校验位核对,如上面所诉“8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据 8bit 校验位等于所*/ chk = hum_10; chk += hum_01; chk += temp_10; chk += temp_01; if(chk = chksum) return 1; else return 0;以上就是单总线下温湿度传感器的核心代码,其中中断局部不同处理器定义不同,这里就不进行阐述了。还有不处理器的系统

46、时钟设置不同,在临界值得判断也不一样。关于ucos在lpc上移植:主要有四个文件,传统的有三个文件:os_cpu_c.c,os_cpu_a.s,os_cpu.h还有一个是IRQ.incOs_cpu.h:这个文件相对来说还是很简单的,关于变量的重新定义,堆栈生长度,临界区了,最有特色的是运用swi软中断。Os_task_sw()肯定是用软中断了,在mdk中要声明一个没有定义的函数,就要在这个函数前面加上_SWI(),也就是用它声明,而_swi()就是一个关键字了。uc在x86上移植也是用的软中断int 0 x80。在lpc中一旦调用os_task_sw()就会触发_swi(0 x00)这个软中断

47、,那它就会使arm进入管理模式然后执行软中断函数SoftwareInterrupt,这个函数在os_cpu_a.s中定义,后续。关于os_task_sw()osstartHighRdy()进入临界区的两个函数 还有一些ARM用到的函数它们为什么要用软中断而不用普通函数调用呢?答案是这样的:ARM处理核有两个指令集,用户任务还可以使用两种模式:用户和系统,组合起来就有4种方式了,各种方式对系统资源有不同的访问控制权限。为了使底层接口函数与处理器状态无关,同时在任务调用相应的函数时不需要知道函数位置,也就是说:统一进入管理模式,统一用软中断调用。Os_cpu_a.s:这个文件主要当然是Softwa

48、reInterrupt了,在这个函数里有三方面跳转:1.os_task_sw2.osstartHighRdy3. SWI_Exception1.一个任务切换也调用OSIntCtxSw这个标号,说明它和中断切换过程一样,都是先保存老的再迎取新的,但是有一点不同:就是这两个函数调用的模式不同:任务级切换是进入管理模式而中断级是进入IRQ模式。妙就妙在虽然是进入的不同模式但一进来都是在SP指针下取老任务的数据然后保存,然后迎新。可以看出这时的SP指针一个是管理的一种情况是IRQ的。Spsr记录了任务的环境,而不管什么模式都用R3来记录spsr,然后保存,总之陈明计写得太效率和有技巧了。2.ossta

49、rtHighRdy其实就是调用OSIntCtxSw_1,就不多说了它就是迎新呗3.这个函数在.c文件里,后续。Os_cpu_c.c:文件有一个OSTaskStkInit函数就很明显了,按照堆栈格式模拟,就不多说了。SWI_Exception这个函数有好几路转向,去除了第一和第二路,因为在os_cpu_a.s中定义了。临界区函数其实就是进去把中断位关闭就行了。但是还有一个陈添上去的一个全局变量OsEnterSum:主要来实现临界区嵌套,当OsEnterSum = 0的时候才开中断。剩下的函数也是改变cpsr就完了没什么。主要是在调用完SWI_Exception这个函数后还得回SoftwareIn

50、terrupt里面实现任务的继续运行关于函数的参数问题两个参数一个放到R0一个放到R1中传过来,呵呵。IRQ.inc: 这个文件是汇编头文件里面定义了一个宏,在不少应用里直接把它复制到IRQ.S中了,然后在写上;/*中断*/IRQ_Handler HANDLER IRQ_Exception;/*定时器0中断*/Timer0_HandlerHANDLER Timer0_Exception这就是对这个宏的运用,分别套用就行了,它实现了os对IRQ的管理。在这个宏里面调用了两个函数:一个是IRQ_Exception_Function,一个是OSIntExit。第一个可以是Timer0_Excepti

51、on在它里面调用timetick(),第二个调用OSIntExit(),在这个函数里调用osIntctxSw(),但是在includes.h中#define OSIntCtxSw() return,把这个函数给费了,呵呵,直接返回啦。然后在宏里判断是否执行中断级切换。但是我就不明白陈为什么这样做了。也可以还用os的osIntctxSw()调用啊,如果回来了说明不切换,然后直接恢复现场也行吧。切换就调用osIntctxSw呗。ISL20223是一款综合性光传感器,内部有16位ADC转换,通过I2C用户配置参数,可编程lux范围选择。大致了解一下芯片知识,然后详细追踪代码,看I2C实现。REXT

52、External resistor pin for ADC reference; connect this pin to ground through a (nominal) 100kresistor两个二极管,一个队可见光540 nm敏感,一个对红外线敏感,模式一对应第一个二极管工作,模式二对应第二个二极管工作,模式三对应二个二极管同时工作Diode1 - Diode2。8*8位内部控制存放器:2*8控制存放器2*8设置上下中断阈值4*8data存放器,只读模式 ,2个reading 2个timer countsISL20223的原理图如下所示:由原理图可以看出,ISL20223数据传输是由

53、I2C总线传输的,I2C协议简单介绍一下。具体的定义这里不说了,主要是怎么用,以其中一种模式进行说明。I2C SDA Out 从机数据时序,I2 CSDA in 主机发送的时序。解释一下上面的时序:时钟高电平时一个下降沿,表示开始信号Start。接着在8个时钟周期内发送1000100 0w前七位是从机地址,最后一位是代表R/W。下一个时钟第九个时钟,从机拉低应答。接下来8个时钟周期是存放器的地址,00000 xxx三位可变的。从机应答。主机接收后SCL高电平期间,由主机产生一个上升沿的信号作为停止。主机产生一个下降沿作为start。接下来发送8位的读指令,10001001.拉低SDA放弃总线。

54、接下来从机发送8位数据。主机将SDA不操作,作为应答非信号。迫使从机释放总线。主机发送停止信号。A1-6代表从机地址,R7-0 存放器地址,D7-0数据。I2C写时序原理和上面相同,对应读写位改变就行。这里只是 I2C SDA Out 只从机,I2 CSDA in 主机发送的。解释一下上面的时序:时钟高点评时一个下降沿,Start。接着在8个时钟周期内发送10001000w下一个时钟,从机压低应答。接下来8个时钟周期是存放器的地址,00000 xxx三位可变的。从机应答。主机接收后SCL高电平期间,由主机产生一个上升沿的信号作为停止。主机产生一个下降沿作为start。接下来发送8位的读指令,1

55、0001001.拉低SDA放弃总线。接下来从机发送8位数据。主机将SDA不操作,作为应答非信号。迫使从机释放总线。主机发送停止信号。A1-6代表从机地址,R7-0 存放器地址,D7-0数据I2C的写时序和上面类似。这里只是ISL20223的简单介绍,I2C具体传输还要看LPC11C14配置存放器。配置LPC11C14可以不用考虑每个时序的数据。是不是觉得上面分析的时序没有用了,其实还是有用的,当你用io口模拟时序时就必须要考虑每个时序的数据了。这种情况还是存在的,有的IC传输协议不是标准I2C的协议,而是变种协议,大致相同,细节处要自己考虑。下一篇准备写一下LPC11C14s上的I2C存放器配

56、置,以及,存放器控制时序方法。很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比方main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。 atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void); 在一个程序中最多可以用atexit()注册3

57、2个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。下面是一段代码例如:#include /使用atexit()函数所必须包含的头文件stdlib.h#includevoid fn1(void);int main(void)atexit(fn1);printf(a./n);return 0;void fn1()printf(b./n);输出结果是:a.b.什么是仓储系统编辑仓储系统指的是产品分拣或储存接收中使用的设备和运作策略的组合。 12仓储系统的构成编辑存储空间货物仓储设施设备人员作业及管理系统等要素。3仓储系统的经济优化编辑对于仓储系统的根

58、本要求是满足供给需求前提下,尽量减少存贮物资的数量,从而降低存贮费用,提高存贮系统经济效益。为到达这一要求, 在存贮管理和运输上必须选择合理的策略。确定性存贮模型的特点是需求消耗速度和入库补充特性都是确定的。它又依入库物资速率是否有限制和出库物资是否允许短缺分为有限供给率、无限供给率、允许缺货、不许缺货四种类型。本文主要讨论基于(,S)混合策略确实定性存贮理论,即物资补充和消耗满足一定的规律下,当存贮量Q低于最底库存量 时,就进行物资补充,把存贮量提高到S;反之,当QS时,就不做补充。一、物流仓储模型的建立(一)无限供给率根本问题假设无限供给率,即定货物资在规定时间一次到货。每次定货量为常数Q

59、;需求连续均匀,速度为常数R,t时间的需求量为R(t);当存贮量下降到时,又进行下一次补充。存贮量随时间的变化如下图;每次定货费用C0和单位物资年存贮费C1为常数;年度保障经费用Cy为运输费Cd和存贮费 Cb之和,即Cy=Cd + Cb.。(二)数学模型的建立与分析在每次输送量Q,年需求量D的条件下,年运输次数为,每次运输费用C0 ,因而年运输费用为 ;在无限供给率及常需求速度情况下,物资存贮量以匀速减小。当存贮量接近警戒量时,一次定货入库。因而,年平均存贮量为 ,于是年存贮费用为;由此得到年度保障费用公式:由公式可以看出,增加每次定货量Q,一方面可以减少年度运输费Cd,另一方面又增加年存贮费

60、Cb 。研究每次定货量Q对年度保障费用Cy的动态影响,将公式积分得到:,由此计算得到最小经济定货量,相应的年度保障经费优化值 .二、应用举例(一)问题陈述为满足市场需求,某物资仓库每年从上级仓库申请补充某型号物资5000箱,每箱物资每月存贮费用折算大约50元,其每次运输费10000元, 每次运量为200箱。仓库不允许缺货,始终保持800箱的库存量用于市场调拨。现明确研究问题为:如何调整运输方案和运输量,在满足市场供给的情况下,使仓库经费最少。(二)数学模型的验证计算根据的运输存贮模型,可知当前每次运输量Q=200箱,仓库最低存贮要求=800箱,单位物资年度存贮费用C1=50 x12=600 元

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论