EDN首页   博客首页

最新日志

发表于:2008-11-30 19:28:09
标签:无标签

0

LPC2104的Boot与Remap详解

引言
        随着半导体工艺技术与处理器设计技术的不断提高,嵌入式处理器的速度愈来愈快;而非易失性存储器的读取速度却远远跟不上CPU的发展。传统的单片机运行模式——机器代码存储在非易失性存储器(如ROM,FLASH),在运行时由CPU直接从其中取出指令执行——逐渐显得力不从心。如果继续沿用传统的程序运行模式,那么在绝大多数时间内高速CPU将处于空闲等待状态,这既浪费了CPU的计算能力,也无法实现高密度数据流的实时处理与传输。而在短期之内,半导体工业界尚无法实现低成本的非易失性高速存储器技术。为了解决上述处理器和非易失性存储器之间速度不匹配的矛盾,工程师们在嵌入式系统领域内引用了Boot技术和Remap技术。而要正确理解Boot技术和Remap技术,必须先建立Memory Map(存储器映射)的概念。


技术概念描述

Memory Map
    计算机最重要的功能单元之一是Memory。Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码。在嵌入式处理器内,集成了多种类型的Memory,通常,我们称同一类型的Memory为一个Memory Block。一般情况下,处理器设计者会为每一个Memory Block分配一个数值连续、数目与其存储单元数相等、以16进制表示的自然数集合作为该Memory Block的地址编码。这种自然数集合与Memory Block的对应关系,就是Memory Map(存储器映射),有时也叫Address Map(地址映射)。实际上,Address Map在字面意义上更加贴切。

    需要强调的是,Memory Map是一个逻辑概念,是计算机系统在(上电)复位后才建立起来的。Memory Map相当于这样一个数学函数:函数的输入量是地址编码,输出量被寻址单元中的数据。当计算机系统掉电后或复位时,这个数学函数不复存在,只剩下计算机系统中实现这个数学函数的物理基础——电路连接。也可以这样认为:Memory Map是计算机系统(上电)复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。

Boot/Bootload
    Boot在计算机专业英文中的意思是“引导”,它是计算机系统(上电)复位后CPU的第一个机器动作。那么,Boot引导的是什么呢?简要地说,Boot就是引导CPU如何装入机器指令。最简单的Boot动作就是8位单片机系统复位后从复位向量中取出跳转指令,转移到用户程序代码段执行的这个过程。

    通常,在计算机系统中,(上电)复位后除了执行Boot动作,还跟随着一个Load过程。一般情况下,该Load从低速非易失性存储器中“搬运”一些数据到高速易失性存储器中。Boot和Load连续执行,一气呵成,我们称之为Bootload。最典型的例子之一就是DSP实时信号处理系统,系统上电后,将存储在EEPROM中的实时信号处理程序复制到系统的RAM中,然后CPU直接从RAM中读取机器指令运行。

Remap
    Remap与计算机的异常处理机制是紧密相关的。

    完整的计算机系统必须具备异常处理能力。当异常产生时,CPU在硬件驱动机制下跳转到预先设定的存储器单元中,取出相应的异常处理程序的入口地址, 并根据该入口地址进入异常处理程序。这个保存有异常处理程序入口地址的存储器单元就是通常所说的“异常入口”,单片机系统中也叫“中断入口”。实际的计算机系统有多种类型的异常,CPU设计人员为了简化芯片设计,一般将所有的异常入口集中起来置于非易失性存储器中,并在系统上电时映射到一个固定的连续地址空间上。位于这个地址空间上的异常入口集合就是“异常向量表”。

    系统上电后的异常向量表是从低速非易失性存储器映射得到的。随着处理器速度的不断提高,很自然地,人们希望计算机系统在异常处理时也充分发挥出CPU的处理能力,而非易失性存储器的读取速度使得CPU只能以多个空闲等待同期来获取异常向量,这样就限制了CPU计算能力的充分发挥。尤其是非易失性存储器位宽小于CPU位宽时,这种负面的影响更加明显。于是,Remap技术被引入,以提高系统对异常的实时响应能力。

    从Remap这个英文单词的构成不难看出,它是对此前已确立的存储器映射的再次修改。从本质上讲,Map和Remap是一样的,都是将地址编码资源分配给存储器块,只不过二者产生的时间不同:前者在系统上电的时刻发生,是任何计算机系统都必需的;而后者在系统上电后稳定运行的时刻发生,对计算机系统设计人员来说是可选的。典型的8位单片机系统中,就没有使用Remap技术。

    完整的Remap过程实际上通常始于系统的Bootload过程。具体执行动作为:Bootload将非易失性存储器中的异常向量复制到高速易失性存储器块的一端,然后执行Remap命令,将位于高速易失性存储器中的异常向量块映射到异常向量表地址空间上。此后,系统若产生异常,CPU将从已映射到异常微量表地址空间的高速非易失性存储器中读取异常向量。具体到典型的ARM7嵌入式系统中,就是由Bootload程序将片内或片外的Flash/ROM中的异常向量复制到片内的SRAM中指定的存在器单元中,然后再执行Remap命令。由于片内的SRAM数据位宽通常与CPU数据位宽相等,因而CPU可以无等待地全速跳入异常处理程序,获得最佳的实时异常响应。

LPC2000的Boot和Remap解析
    从上面的技术描述中可知,典型的Boot、Memory Map和Remap的时间顺序应该是:Memory Map-〉Boot-〉Remap。但是,LPC2000处理器中这三个动作的顺序却有一点不同,依次为Memory Map-〉Remap-〉Boot-〉Remap,最后一个Remap过程是用户可选的,可执行也可不执行。每当系统复位以后,LPC2000处理器就顺次执行上述四个过程,下面分析这几个阶段。为简化起见,以总线不开放的LPC2104处理器为例。

LPC2106的片上存储器分类
    LPC2104片内的存储器类型只有两种:Flash块和SRAM块。其中,部分Flash存储器块在芯片出厂前由Philips写入了Bootload程序和64字节的异常向量表。为方便讨论,我们称这部分Flash块为Bootload子块,其大小为8KB。如前所述,在处理器未上电之前或复位时,Flash块和SRAM块仅仅是两个没有地址编码的物理存储器,与地址编码尚未建立起实际的映射关系。

Memory Map
    LPC2104处理器(上电)复位以后,Flash块和SRAM块的地址映射结果为:SRAM占据0x40000000—0x40003FFF范围的地址编码空间;Flash占据0x00000000—0x0001FFFF范围的地址编码空间。该映射结果是个中间态,只存在极短的时间,应用系统开发人员无法看到这个中间态。处理器内核外围模块的地址映射结果为0xE0000000—0xFFFFFFFF。

点击看大图
Remap
    Memory Map完成以后,紧接着LPC2104会作一次Remap,这次Remap操作的对象是Bootload子块,由处理的内部硬件逻辑执行完成,不受开发人员的控制。经过Remap后,Bootload子块被整体Remap到了0x7FFFE000—0x7FFFFFFF的片内高地址内存空间;同时,原Memory Map后占用0x00000000—0x0000003F地址空间的那部分64 字节大小的Flash子块被暂时注销映射关系,由Bootload子块中的异常向量部分取而代之。

    至此,Flash块对内存地址空间的占用情况如下:
    1、除去因Remap被暂时注销了映射关系的那小部分64字节的Flash子块外,Flash块作为一个整体占用的地址编码空间为0x00000040—0x0001FFFF;
    2、同时,Bootload子块又占用了0x7FFFE000—0x7FFFFFF的地址编码空间,Bootload子块中的异常向量表部分占用了0x00000000—0x0000003F。
    因此,Bootload子块中的异常向量表部分实际上是占用了重复占用了三段地址编码空间:0x00000000—0x0000003F、0x0001E000—0x0001E03F以及0x7FFFE000—0x7FFFE03F。

    图2中,存储器的映射顺序为:Memory Map-〉Reset Remap-〉Bootload Remap。
    SRAM块和内核外围模块的映射关系在Remap之后保持不变,可参见图1。
点击看大图
Boot
    LPC2104有效的异常向量表地址编码空间是0x00000000—0x0000003F(严格来说应该是0x00000000—0x0000001F)。处理器复位后的Boot动作就是从0x00000000处起始字中取出跳转指令,开始程序的执行。由于处理器复位后,映射到0x00000000—0x0000003F地址空间的异常向量表源于Bootload子块,因此CPU实际上开始执行的是Philips在芯片出厂前写入的Bootload程序。

    进入Bootload后,程序首先检查看门狗溢出标志是否置位。
    若看门狗溢出标志置位,则表明当前的系统复位是内部软复位,CPU下一步将对Flash块中的异常向量表进行加和校验。如果加和检验结果为零,Bootload程序将撤销Bootload子块中异常向量表部分在0x00000000—0x00000003F地址空间上的映射,恢复Flash块的异常向量表在这64字节地址空间上的映射关系(如图3),然后跳转到异常向量表地址0x00000000处转入用户程序的执行。如果加和校验结果不为零,Bootload程序将进行UART0接口的波特率自动侦测,随时响应ISP宿主机的编程请求,执行处理器芯片的ISP编程工作。
点击看大图
若Bootload没有发现看门狗溢出标志置位,则表明当前的系统复位是外部硬复位,CPU将采样P0.14引脚的外部逻辑电平输入。如果为0,Bootload执行UART0的自动波特率侦测,随时响应ISP宿主机的编程请求;如果为1,Bootload的后续动作将与前面检测到看门狗溢出标志置位的程序执行完全相同。点击看大图
Remap(可选)
    最后这一步可选的Remap动作完全处于用户的控制之下,Remap的对象是片内SRAM存储器块的异常向量部分,共计64字节大小。用户可以编程决定何时Remap、Remap之后是否再修改异常向量表以及如何修改异常向量表等等。需要强调的是,引发Remap动作的指令与建立SRAM块中异常向量的所有功能代码全部驻留在Flash块的用户编程区中,是用户应用软件的一部分。

    曾经有网友对Philips在LPC2000系列处理器中引入这个可选的Remap功能提出质疑:LPC2000系列处理器片内的Flash块被分割成了两组,每组都配备了相互独立的128位宽度的读取缓冲,在绝大多数情况下,CPU从Flash块的访问是全速进行的,不存在有等待的状况;另一方面,一般应用LPC2000的嵌入式系统并不需要动态地改变异常向量表。因此,对片内SRAM进行Remap后,并不能提高处理器对异常的响应能力,实际意义不大。

    事实上,LPC2000系列处理器引入SRAM的Remap功能对于IAP操作具有重要的意义。相对于其它基于ARM7DMI内核的处理器而言,LPC2000系列处理器有一个独具特色的功能—IAP。在IAP擦除/写入操作时,片上Flash块,包括该块上的异常向量部分,是无法被访问读取的,为了在IAP擦除/写入操作时有效地响应异常,必须在调用IAP擦除/写入操作之前,将SRAM中的异常向量部分提前映射到系统的异常向量表地址空间上。
点击看大图

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(39)
发表于:2008-11-27 9:42:53
标签:无标签

1

AT+CNMI

 AT+CNMI=<mode>,<mt>,<bm>,<ds>,<bfr>
<mode>
0: Buffer unsolicited result codes in the TA. If TA result code buffer is full, indications can be buffered in some other place or the oldest indications may be discarded and replaced with the new received indications
1: Discard indication and reject new received message unsolicited result codes when TATE link is reserved. Otherwise forward them directly to the TE
2: Buffer unsolicited result codes in the TA when TA-TE link is reserved and flush them to the TE after reservation. Otherwise forward them directly to the TE 3: Forward unsolicited result codes directly to the TE. TA-TE link specific inband used to embed result codes and data when TA is in on-line data mode
<mt> sets the result code indication routing for SMS-DELIVERs. Default is 0.
<mt>
 0: No SMS-DELIVER indications are routed.
1: SMS-DELIVERs are routed using unsolicited code : +CMTI: “SM”,<index>
2: SMS-DELIVERs (except class 2 messages) are routed using unsolicited code : +CMT : [<alpha>,] <length> <CR> <LF> <pdu> (PDU mode) or +CMT : <oa>,[<alpha>,] <scts> [,<tooa>, <fo>, <pid>, <dcs>, <sca>, <tosca>, <length>] <CR><LF><data> (text mode)
3: Class 3 SMS-DELIVERS are routed directly using code in <mt>=2 ; Message of other classes result in indication <mt>=1
<bm> set the rules for storing received CBMs (Cell Broadcast Message) types depend on its coding scheme, the setting of Select CBM Types (+CSCB command) and <bm>. Default is 0.
<bm>
0: No CBM indications are routed to the TE. The CBMs are stored.
1: The CBM is stored and an indication of the memory location is routed to the customer application using unsolicited result code: +CBMI: “BM”, <index>
2: New CBMs are routed directly to the TE using unsolicited result code. +CBM : <length><CR><LF><pdu> (PDU mode) or +CBM :<sn>,<mid>,<dcs>,<page>,<pages>(Text mode) <CR><LF> <data>
3: Class 3 CBMs : as <bm>=2. Other classes CBMs : as <bm>=1.
 
<ds> for SMS-STATUS-REPORTs. Default is 0.
 <ds>
0: No SMS-STATUS-REPORTs are routed.
1: SMS-STATUS-REPORTs are routed using unsolicited code : +CDS : <length> <CR> <LF> <pdu> (PDU mode) or +CDS : <fo>,<mr>, [<ra>] , [<tora>], <scts>,<dt>,<st> (Text mode)
2: SMS-STATUS-REPORTs are stored and routed using the unsolicited result code : +CDSI: “SR”,<index>
<bfr> Default is 0.
<bfr>
 0: TA buffer of unsolicited result codes defined within this command is flushed to the TE when <mode> 1…3 is entered (OK response shall be given before flushing the codes)
1: TA buffer of unsolicited result codes defined within this command is cleared when <mode> 1…3 is entered.

系统分类: 3G与手机   |    用户分类:    |    来源: 转贴

该用户于2008-11-27 9:42:59编辑过该文章

评论(0) | 阅读(17)
发表于:2008-11-26 10:07:26
标签:无标签

0

GSM模块SMS相关AT命令使用说明

    凡是利用GSM模块二次开发的,不管是用来做公话,还是GPRS通信,其中短消息基本都要使用的。本文大致介绍一下短消息相关的AT命令使用方法。
详细的AT指令说明,可以参考 07.05,或者西门子MC35I的AT手册,西门子手册感觉还是很不错的。

    由于本文表达的错误给您带来的物资损失和精神损伤,本人概不负责。

1、    短消息的格式

我所见到的模块短消息基本都提供2种格式,TEXT和PDU。文本模式相对来说比较简单,特别适合传输那些字符什么的,对于老外来说,基本就发26个字幕,简直太方便了。PDU模式需要进行编码,目前的汉字传输好多都采用PDU模式。由于本人对PDU和怎么发汉字基本一窍不通,这段就暂时忽略了。

一般模块默认的都是PDU模式,你可以使用如下命令切换到TEXT模式:
AT+CMGF=1
如果想再切换到PDU模式,使用:
AT+CMGF=0
即可,以下短消息发送&读取都采用TEXT模式,因为PDU我不是很懂。

2、    怎样给我发送一条短消息?
现在你手里有了G网模块,但首先你要确保如下操作已经完成:
1)    模块上电并且AT命令同你的PC串口通信顺畅。
2)    SIM卡没有欠费,并且已经登陆GSM网络(可以使用AT+CREG?查询,如果返回1或者5表示正常)。
3)     AT+CMGF=1设置完毕。

有了以上的过程,那么你就可以给我发信息了,你要使用的AT命令是:AT+CMGS。
假如我的手机号是:13636371111(后四位是假的)。

1)    从串口输入:AT+CMGS=”13636371111” 然后按回车键。
2)    这个时候你可以看到有个大于号 ‘>’弹出,提示你可以输入消息的内容了。

假如你想发送“hello world”,直接在’>’后面输入即可,输入完了后按’CTRL^Z”,稍微等一下,你的信息也就发出去了,如果编程好像是0x1B(记不清了,你可以查下ASCII表)。
全部过程如下:
AT+CMGS="13636371111"
> hello world
+CMGS: 199

OK
你需要一直等到OK返回,才能确定是成功发出,中间的那个东西可以先不管。如果你输入 “ hello world”后,但又不想发了,按ESC可以取消发送,就不再介绍。

3、    怎样打开传送回报?
手机上我们都可以找到一个菜单,可以选择传送回报的功能,也就是说别人收到你的信息后,短消息中心会给你一个确认信息,假如是发给心上人,这个功能尤其重要。
对于模块我们没有菜单可选,但我们有 AT+CSMP 这样一条AT命令,在TEXT模式下,对于手机上的那个选项可以通过这条命令实现,这个命令的具体含义我搞得不是很清楚,也懒得去研究,曾经有个人告诉我按照下面设置后,传送回报就可以回来:
AT+CSMP=33
   但即使你这样设置后,别人收到后,传送回报你可能还是看不到,你还需要设置另外一条AT命令:“AT+CNMI=2,1,,1”,下面就会介绍到这个命令的用法。
   对于PDU模式,控制传送回报有很大差别。
4、    AT+CNMI的用法。
到目前为止,你至少还有如下的疑惑:
1)    来了新短信,我怎么知道?
2)    我担心时间长了SIM卡会写坏,FLASH也可能写坏,或者我单片机很强短信不需要存储,就要模块直接给我,我该怎么办?
3)    我要看传送回报!
  上面一切疑虑都可以从AT+CNMI中得到答案。
我手头上有个西门子MC35的手册,CNMI的几个参数如下:
AT+CNMI =[<mode>][,<mt>][,<bm>][,<ds>][,<bfr>]
方括号表示参数是可选的,简要说明下:
<mode>  用来选择来了新短信,提示信息是否需要从串口直接打出,一般取2。
<mt>    用来选择新短信的提示方式,取1的话,就比较简单,比如“+CMTI: "SM",3”,告诉你新短信存在SIM卡里,序号是3,稍后告诉你怎样读取。取2的话,来了新短信就会不作存储,直接从串口显示出来。
<ds>   用来选择传送回报,如果想看回报的话,一般取1(同AT+CSMP结合使用)。
其他参数不作说明。
这里提供3组参数可以供你使用:
1)    AT+CNMI=2,1,,1
这组参数可以提供新信息提示,以及传送回报的功能
2)    AT+CNMI=2,2,,1
这组参数来了新信息直接显示到串口,不作存储,仍然打开传送回报。
3)    AT+CNMI=2,1
这组参数,一般的模块都会有新信息提示,不会打开回报功能(打开可能会干扰单片机处理)     以上仅供参考,不同厂家模块实现形式以及支持参数可能会有不同,需要实际测试。

5、    怎样读取SIM卡或者手机内部的信息?
比如我们收到这样的信息:“+CMTI: "SM",3”,知道来了新信息,并且存储在SIM卡,第3个位置区。我们怎么去读取呢?

   比较EASY,用AT+CMGR来读取,如下:
AT+CMGR=3,回车后,即可看到短信内容,比较简单,这里就不举例了。

还有一个用来读取短信的命令,AT+CMGL,可以列出手机内部的全部AT命令,
比如:
AT+CMGL=”ALL”,回车后可以返回当前存储区的所有短信,结果自己实践即可。
+CMGL还有另外3个参数,可以参考手册,并且PDU还有些不同,参数使用的是数字。


6、    怎样选择存储区?
现在的模块一般都提供2-3个存储区,SIM卡,手机(FLASH), SIM卡+FLASH。
我们可以使用 AT+CPMS?进行选择,关于CPMS的3个参数,这里简要介绍一下,比较容易搞混,并不是表示SIM卡或者手机分别有3个存储区。
设置命令如下:AT+CPMS=<mem1>[,<mem2>][,<mem3>]]
<mem1> Memory to be used when listing, reading and deleting messages:
<mem2> Memory to be used when writing and sending messages:
<mem3> Received messages will be placed to this storage if routing to TE is not
set. 
上面是我为了省事直接从西门子手册COPY的,需要仔细理解。组合着多试几次就知道了。

7、    怎样删除一条短信?
使用AT+CMGD,比如:
AT+CMGD=1 将删除<mem1>内部的第一条信息(注意模块返回OK都是删除成功,有些模块会返回ERROR,其实表示当前这个位置没有短信息)。
AT+CMGD还有个全删的功能,比如:
AT+CMGD=1,4 将删除<mem1>存储区内部的全部短信息。(注意第二个参数还有3个,可以看手册,并且并不是所有厂家模块都支持全删)

AT+CMGC Send an SMS command(发出一条短消息命令)
AT+CMGD Delete SMS message(删除SIM卡内存的短消息)
AT+CMGF Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
AT+CMGL List SMS message from preferred store
    (列出SIM卡中的短消息PDU/text: 0/“REC UNREAD”-未读,1/“REC READ”-已读,
     2/“STO UNSENT”-待发,3/“STO SENT”-已发,4/“ALL”-全部的)
AT+CMGR Read SMS message(读短消息)
AT+CMGS Send SMS message(发送短消息)
AT+CMGW Write SMS message to memory(向SIM内存中写入待发的短消息)
AT+CMSS Send SMS message from storage(从SIN|M内存中发送短消息)
AT+CNMI New SMS message indications(显示新收到的短消息)
AT+CPMS Preferred SMS message storage(选择短消息内存)
AT+CSCA SMS service center address(短消息中心地址)
AT+CSCB Select cell broadcast messages(选择蜂窝广播消息)
AT+CSMP Set SMS text mode parameters(设置短消息文本模式参数)
AT+CSMS Select Message Service(选择短消息服务)


对短消息的控制共有三种模式:
   Block Mode   基于AT命令的
   PDU Mode     基于AT命令的
   Text Mode    使用Block模式需要手机生产厂家提供驱动支持, 目前,PDU Mode 已取代 Block Mode, Text Mode比较简单,本文重点介绍模式PDU Mode,以西门子公司的产品TC35T为例。


TC35基本命令
 1.设置短消息中心
    AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
 2.接收短消息
    +CMTI:“SM”,X (X表示接收短消息的SIM卡存储号码)
    AT+CMGR=X回车 (从X存储区读短消息)
    AT+CMGD=X回车 (从X存储区删除短消息)
 3.发送短消息
    AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0) AT+CMGS=“+8613xxxxxxxxx”回车 >输入短消息。Crtl+Z结束并发送。
 4.重要的指令
  ATZ;E 回车 Echo OFF ATZ;E1回车 Echo ON AT+CREG?回车 回答x(X=2脱网,X=1注册,X=0状态不明) AT+COPS?回车 表示SIM卡是否被网络接受 AT+COPS=?回车 显示所有可用的网络。
 5.建立语音呼叫
 AT+CREG?回车(是否网络注册) ATD13xxxxxxxxx;回车(语音呼叫和数据呼叫建立的区别在于号码后所接的分号上)
 6.改变并保存参数
 AT+IPR=2400 回车(改变RS232口的速率至2400bps) AT&W 回车 (保存已改参数)
 7.输入PIN码
 AT+CPIN=“xxxx”

 
 2.计算机与TC35T的通信
 (1)RS232串口连接由于TC35T自带RS232串口线,故只需将其连接到计算机串口即可。打开超级终端,选择相应的串口,将端口参数设置为:速率—4800、奇偶校验位—无、数据位—8、停止位—1、流量控制—硬件。
 (2)连接测试输入“AT”然后回车,屏幕上返回“OK”表明计算机与TC35T已连接成功,TC35T能够正常工作。这时就可以测试各类AT命令。
 当测试命令“AT+CMGS=?<CR>”时,如果返回“OK”标明TC35T支持该指令。
 该指令的完整语法如下:
 如果此时TC35T处于PDU Mode(即“AT+CMGF?<CR>”返回“0”) AT+CMGS=<length><CR>PDU is given<^Z/ESC> 如果短消息发送成功,则返回“OK”,并显示信息号: +CMGS: <mr>[,<ackpdu>] 如果短消息发送失败,则返回如下信息号: +CMS ERROR: <err>
 如果此时TC35T处于Text Mode(即“AT+CMGF?<CR>”返回“1”) AT+CMGS=<da>[,toda]<CR>text is entered<^Z/ESC> 如果短消息发送成功,则返回“OK”,并显示信息号: +CMGS: <mr>[,<scts>] 如果短消息发送失败,则返回如下信息号: +CMS ERROR: <err>
 另外,由于使用的是TC35T,当有新的短消息到来时,需要TC35T产生提示,使用指令“AT+CNMI”。该指令的完整语法如下: AT+CNMI=[<mode>][,<mt>][,<bm>][,<ds>][,<bfr>]  如果有新的短消息来到,则TC35T将自动返回下列提示: +CMTI: “SM”, <index> 此时读出<index>,然后用“AT+CMGR”指令即可读出短消息内容。
 3.PDU数据格式分析:
 例如,我们要将字符“Hi”字符发送到目的地“13823788935” PDU字符串为: 08 91 683108701305F0 11 00 0D 91 3128738839F5 00 00 00 02 C834
  ⑴08—短信息中心地址长度。指(91)+(683108701305F0)的长度。
  ⑵91—短信息中心号码类型。91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号;此外还有其它数值,但91最常用。
 91—10010001 BIT No. 7 6 5 4 3 2 1 0
 Name 1 数值类型 号码鉴别
 数值类型(Type of Number):
 000—未知,001—国际,010—国内,111—留作扩展;
 号码鉴别(Numbering plan identification):
 0000—未知,0001—ISDN/电话号码(E.164/E.163),1111—留作扩展;  
 ⑶683108701305F0—短信息中心号码。
 由于位置上略有处理,实际号码应为:8613800731500(字母F是指长度减1)。这需要根据不同的地域作相应的修改。 ⑴、⑵、⑶通称短消息中心地址(Address of the SMSC)。  ⑷11—文件头字节。
 11&h=00010001&b BIT No. 7 6 5 4 3 2 1 0
 Name TP-RP TP-UDHI TP-SPR TP-VFP TP-RD TP-MTI &#118alue 0 0 0 1 0 0 0 1
 应答路径—TP-RP(TP-Reply-Path):0—不设置;1—设置
 用户数据头标识—TP-UDHL(TP-User-Data-Header-Indicator):
 0—不含任何头信息; 1—含头信息
 状态报告要求—TP-SPR(TP-Status-Report-Request):0—需要报告; 1—不需要报告
 有效期格式—TP-VPF(TP-Validity-Period-Format):
 00—不提供(Not present); 10—整型(标准);01—预留; 11—提供8位字节的一半(Semi-Octet Represented)
 拒绝复制—TP-RD(TP-Reject-Duplicates):0—接受复制; 1—拒绝复制
 信息类型提示—TP-MTI(TP-Message-Type-Indicator):00—读出(Deliver); 01—提交(Submit)
 ⑸00—信息类型(TP-Message-Reference)
 ⑹0B—被叫号码长度。
 ⑺91—被叫号码类型(同⑵)。
 ⑻3128738839F5—被叫号码,经过了位移处理,实际号码为“13823788935”。
 ⑹、⑺、⑻通称目的地址(TP-Destination-Address)。
 ⑼00—协议标识TP-PID(TP-Protocol-Identifier)
 BIT No. 7 6 5 4 3 2 1 0
 Bit No.7与Bit No.6: 00—如下面定义的分配Bit No.0—Bit No.5;01—参见GSM03.40协议标识完全定义;10—预留;11—为服务中心(SC)特殊用途分配Bit No.0—Bit No.5。一般将这两位置为00。 Bit No.5:0—不使用远程网络,只是短消息设备之间的协议;1—使用远程网络。
 Bit No.0—Bits No.4:
 00000—隐含;00001—电传;00010—group 3 telefax;00100—语音;00101—欧洲无线信息系统(ERMES);00110—国内系统;10001—任何基于X.400的公用信息处理系统;10010—Email。
 ⑽00—数据编码方案TP-DCS(TP-Data-Coding-Scheme)
 BIT No. 7 6 5 4 3 2 1 0
 Bit No.7与Bit No.6 :一般设置为00;
 Bit No.5:0—文本未压缩,1—文本用GSM标准压缩算法压缩;
 Bit No.4:0—表示Bit No.1、Bit No.0为保留位,不含信息类型信息,1—表示Bit No.1、Bit No.0含有信息类型信息;
 Bit No.3与Bit No.2:00—默认的字母表,01—8bit,10—USC2(16bit),11—预留;Bit No.1与Bit No.0:00—Class 0,01—Class 1,10—Class 2(SIM卡特定信息),11—Class 3。
 ⑾00—有效期TP-VP(TP-Valid-Period)
 VP &#118alue(&h) 相应的有效期 00 to 8F (VP+1)*5 分钟 90 to A7 12小时+(VP-143)*30分钟 A8 to C4 (VP-166)*1天 C5 to FF (VP-192)*1 周
 ⑿02—用户数据长度TP-UDL(TP-User-Data-Length)
 ⒀C834—用户数据TP-UD(TP-User-Data)
 “Hi” 4.短消息编码设需要发送的短消息内容为“Hi”,使用的GSM字符集为7位编码。首先将字符转换为7位的二进制,然后,将后面字符的位调用到前面,补齐前面的差别。
 例如:H翻译成1001000,i翻译成1101001,显然H的二进制编码不足八位,那么就将i的最后一位补足到H的前面。那么就成了11001000(C8),i剩下六位110100,前面再补两个0,变成00110100(34),于是“Hi”就变成了两个八进制数 C8 34。
 5.短消息的发送与接收案例鉴于TC35(T)支持TEXT格式,我们在试验中主要测试该格式。
 (1)设置短消息中心 AT+CSCA="+8613800731500"(短消息中心);
 (2)设置短消息发送格式 AT+CMGF=1 (1-TEXT; 0-PDU);
 (3)发送短消息(短消息内容为“test”) AT+CMGS="13823788935"(目的地址) <cr> > test ^z ;
 (4)设置短消息到达自动提示: 设置短消息到达提示当短消息被接收,将获取指令: +CMTI:"SM",INDEX(信息存储位置) AT+CNMI=1,1,0,0,1();
 (5)获取短消息内容(Once more),假设INDEX=8。 AT+CMGR=8 返回信息如下: +CMGR: "REC UNREAD","+8613823788935",,"01/07/16,15:37:28+32",Once more 6.注意事项 (1)短消息中心一般不会改动,如果短消息中心号码改动,在使用“AT+CSCA”语句时,记住TC35要重新启动,否则TC35不能正常工作(TC35T不存在此问题)。(
2)某些SIM卡带有密码,启动时需要输入密码。

系统分类: 3G与手机   |    用户分类:    |    来源: 转贴

该用户于2008-11-26 10:07:34编辑过该文章

评论(0) | 阅读(22)
发表于:2008-9-8 21:56:02
标签:PCB  布局  布线  原则  

1

PCB布局布线的一般原则

这段时间开始学做板子,每每花一两天把一个也不算太复杂的PCB图画好,可每进行DRC,总是超过500的Violations.主要原因还是没有把原则记熟,毕竟PCB图不是画画呀,不能只顾布局和布线错落有致,还要注意很多原则呀!PCB的布局和布线主要有以下几点:
一、布局原则

1. 元器件应尽量放在元件面上,分布均匀,排列紧凑,以缩短连线长度,降低连接电阻
2. 板上的元器件应按信号的流程逐个安排,以核心元件为中心,围绕它进行布局

3. 元器件在印制板上的重量应分布均匀,元器件不允许交叉重叠放置

4. 印刷板上大而重的元器件应安排在靠近板子固定端的位置,并留足够的装配位置

5. 为了提高机械强度,可将一些笨重的元器件如变压器、继电器等布放在辅助板上,利用附件将它们固定
6. 发热元器件应放在有利于散热的位置,必要时可单独放置或装散热器

7. 对于辐射电磁场较强的元件,以及对电磁感应较灵敏的元件,应加大它们之间的距离或加以屏蔽,元器件放置的方向与相邻的印制导线交叉
8. 对于电位器、可变电容器、可调电感或微动开关等可调元件的布局,应考虑整机的结构要求
9. 集成器件尤其是双列直插式器件,布局时应昼使方向一致,间隔相等,整齐有序
10. 印刷板边缘的元件离板边缘至少有2mm
11. 印刷板的形状应呈矩形,长宽比为3:2或4:3
12. 当板的尺寸大于300mm×200mm时应考虑分板
13. 印刷板上应留有固定支架,定位螺孔和连接插座的位置
二、布线的一般原则
1. 布线应首选单层,其次是双层,最后是多层
2. 布线力求路径短捷,以减少连接阻抗
3. 一般公共地线布置在印刷板的最边缘,便于与机架连接
4. 印刷板上应尽可能多地保留铜箔做地线
5. 高、低电平悬殊的信号应尽可能缩短,并加大距离
6. 导线拐弯处不应出现锐角,应为圆弧角或者135°
7. 输入、输出导线应心尽量避免相邻平行,最好加线间地线。两面的导线宜互相垂直、斜交或弯曲走线,避免相互平行,以减少寄生耦合
8. 印刷导线在不影响电气性能的前提下,应尽量避免采用大面积铜箔。如果 必须采用大面积铜箔,应局部开窗口,以防止长时间受热时铜箔膨胀和脱落现象
9. 模拟电路和数字电路的地线应分开布线以减少相互干扰
10. 高频电路中同一面的印制导线应避免相邻导线平行段过长,在允许的情况下适当加大信号间距
11. 一组平行导线应保持等间距
12. 导线宽度不宜大于焊盘尺寸
13. 在元器件尺寸较大、布线密度较低时,应适当加宽导线及其间距

系统分类: PCB   |    用户分类:    |    来源: 整理

评论(0) | 阅读(120)
发表于:2008-6-12 19:29:40
标签:无标签

1

AVR TWI实验

点击下载实验代码

从PC机转向单片机编程,很多的细节是需要积累的,很多都是很常识性的错误。本次TWI是挺有收获的,主要有下:
一、单片机的初始化:本次主要是端口的读写状态没做好,因为I2CSDA和I2CSCL与PORTD的PD0、PD1是复用的,没有对DDRD初始化为写。
二、暂停:对于并口的读写往往需要个shortdelay;对于串口当然时间要更长了,本次实验没有充分考虑暂停时间,因而在实验中一度出现错写入、错读出。对于暂停时间的适当选择目前还比较乱。
三、错误理解:TWI读出时的当前地址是要在写的状态下确定,然后才能进入读状态。

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(187)
发表于:2008-5-7 22:51:38
标签:C51  指令系统  

1

C51指令系统学习笔记(个人收藏无点击价值)

点击下载

花了一下午看了下C51指令,基本能掌握!

用PPT做笔记效果很好,唯进度慢了点!

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(242)
发表于:2008-4-22 21:00:34
标签:C程序  交换两个数  技巧  SWAP  

2

这样交换两个数,妙!

/*

怎样把两个数交换?
这个问题太菜了,脑中或许一下就出现了代码
void swap1(int *a,int *b)
{
 int temp;
 temp=*a;
 *a=*b;
 *b=temp;
}
很好,的确交换了位置,可是我还有个问题
如果没有临时变量,能做到吗?
可能你会绞尽脑汁想到
void swap2(int *a,int *b)
{
 *a=*a+*b;
 *b=*a-*b;
 *a=*a-*b;
}
很不错,当然在两个数不是很大是可以
如果考虑溢出,好像美很有点缺憾
不过我这还有一种方法
void swap3(int *a,int *b)
{
 *a=*a^*b;
 *b=*a^*b;
 *a=*a^*b;
}
"^"这是什么?异或呀!
哦,太妙了,好像没什么问题了
我们应该记住方法三
不要把方法一在脑中固化!!

*/
/******************实验例程********************/
#include
void swap1(int *a,int *b)
{
 int temp;
 temp=*a;
 *a=*b;
 *b=temp;
}
void swap2(int *a,int *b)
{
 *a=*a+*b;
 *b=*a-*b;
 *a=*a-*b;
}
void swap3(int *a,int *b)
{
 *a=*a^*b;
 *b=*a^*b;
 *a=*a^*b;
}
int main()
{
 int a="123",b=321;
 swap1(&a,&b);
 printf("a=%d,b=%d",a,b);
 swap2(&a,&b);
 printf("a=%d,b=%d",a,b);
 swap3(&a,&b);
 printf("a=%d,b=%d",a,b);
 return 0;
}

 

系统分类: 软件开发   |    用户分类:    |    来源: 原创

评论(1) | 阅读(315)
发表于:2008-4-20 15:57:47
标签:C++  写软盘镜像  

2

写软盘镜像文件

点击下载

开发时如果要使用虚拟机,就不可避免要创建软盘镜像!

这是我用C++写的一个创建软盘镜像的工具(含源程序)

系统分类: 软件开发   |    用户分类:    |    来源: 原创

评论(0) | 阅读(418)
发表于:2008-4-20 15:53:57
标签:十六进制查看器  C++  

2

十六进制查看器

点击下载

这是我以前用C++仿写的一款十六进制查看器!(含源程序)

要用命令行,所以使用批处理文件能很方便地查看到一个文件

(例如软盘镜像文件)的十六进制代码布局。

系统分类: 软件开发   |    用户分类:    |    来源: 原创

评论(2) | 阅读(406)
发表于:2008-4-14 23:29:50
标签:无标签

2

嵌入式软件优化的例子

点击下载

这篇文章很不错,极力推荐!

系统分类: 软件开发   |    用户分类:    |    来源: 无分类

评论(0) | 阅读(325)
2下一页总共 , 当前 /