AVR单片机相关问题.doc_第1页
AVR单片机相关问题.doc_第2页
AVR单片机相关问题.doc_第3页
AVR单片机相关问题.doc_第4页
AVR单片机相关问题.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

AVR单片机相关问题AVR读写外部RAM时出现的问题问:1,对AT90S8515来说,外部RAM的地址肯定是从0x0260开始的?2,我用ICE200仿真8515读写外部RAM,RAM大小为32K Bytes,地址映射到0x0000-0x7fff,用PC7做它的片选。把SRE置为1,当我访问0x0300时PC7为低,这是对的,但当我不去访问0x0000-0x7fff地址空间时(例如进入死循环),问题出现了,此时PC7仍为低,按道理应为高的。这是阿AVR与51的不同,还是我弄错了。答:1、对AT90S8515来说,外部RAM的地址肯定是从0x0260开始的。这是没问题的,访问0x0000-0x025F的地址为内部RAM。2、当你访问过0x0300,PC7为低,当你不访问0x0000-0x7FFF时,由于没有一条把PC7置高的指令,所以PC7当然还为低了。不过这也不要紧,因为当你访问0x0000-0x025F的时候,RD和WR是没有的,所以即使外部RAM被选中了,没不会产生读写。当你访问0x0260-0x7FFF的时候,RD和WR就自动产生了。所以就是你把外部RAM的CS直接接地也是可以的。Mon,26 Mar 2007 15:45:57 GMT以前看到#define SREG(*(volatile unsigned char*)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,第一步是要把它强制转换为指针类型(unsigned char*)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向unsigned char类型。volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种意想不到地改变,不是由程序去改变,而是由硬件去改变-意想不到。第二步,对指针变量解引用,就能操作指针所指向的地址的内容了*(volatile unsigned char*)0x5F第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以:#define SREG(*(volatile unsigned char*)0x5F)类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义:#define RAM_ADDR(*(volatile unsigned long*)0x 0000555F)然后就可以用C语言对这个内存地址进行读写操作了读:tmp=RAM_ADDR;写:RAM_ADDR=0x55;定义volatile是因为它的值可能会改变,大家都知道为什么改变了;如果在一个循环操作中需要不停地判断一个内存数据,例如要等待SREG的I标志位置位,因为SREG也是映射在SRAM空间,为了加快速度,编译器可能会编译出这样的代码:把SREG读取到Register中,然后不停地判断Register相应位。而不会再读取SREG,这样当然是不行了,因为程序或其它事件(中断等)会改变SREG,结果很可能是一个死循环出不来了。如果定义成volatile型变量,编译的代码是这样的:每次要操作一个变量的时候都从内存中读取一次。#define SREG(*(volatile unsigned char*)0x5F)之后,可以进行如下基本操作,unsigned char temp,*ptr;temp=SREG;把SREG值保存到temp中SREG=temp;把temp的值赋给SREG ptr=&SREG;不知对否,大家试一下。Mon,26 Mar 2007 12:56:10 GMT AVR提供了几种不同的中断源。这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。所有中断都被分配一个私有的使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使能位置1。程序存储器空间最低的一些地址,被默认定义为复位和中断向量。完整的向量列表见中断部分。该列表也决定了不同中断的优先级。地址越小,优先级越高。RESET具有最高的优先级,其次是INT0-外部中断请求0。详细讨论见中断部分。当某个中断产生时,全局中断使能位I被清零,所有中断都被禁止。用户程序可以向I位写入1,以实现中断嵌套。所有已使能的中断就可以中断当前的中断程序。当从中断指令-RETI-的执行返回时,I位被自动置位。基本上有两种类型的中断。第一种是由事件触发的,把中断标志置位。对于这些中断,程序计数器被引导到实际的中断向量,以执行中断处理程序,同时硬件把相应的中断标志清除。通过向要清除的标志位位置写一个逻辑1,也可以被清除中断标志。如果中断使能位被清除后,相应的中断条件发生时,中断标志将被设置,而后保持到中断被使能为止,或者由软件把标志清除。类似地,如果在全局中断使能位被清除后,一个或多个中断条件产生时,相应的中断标志将被设置,并保持到全局中断使能位被设置为止,然后按优先级顺序执行。第二种中断,只要中断条件存在,就会被触发。这些中断没有必要具有中断标志。如果中断条件在中断被使能前消失,那么中断将不被触发。当AVR从一个中断中退出时,它一般会返回主程序,并且执行再执行一条指令后,才会响应后续的中断。注意,当进入中断程序时状态寄存器不会自动保存,当从中断程序返回时,它也不会自动恢复。这必须由用户软件来完成。当使用CLI指令禁能中断时,中断将立即被禁能。当CLI指令执行后,将没有中断再被执行,即使中断在CLI执行的同时发生。下例所示为怎样使用CLI指令来避免在定时的EEPROM写时序期间避免产生中断。汇编代码例子in r16,SREG;保存SREG值cli;在定时程序中禁能中断sbi EECR,EEMWE;开始写入EEPROM sbi EECR,EEWE out SREG,R16;恢复SREG值(I位)C代码例子char cSREG;cSREG=SREG;/*保存SREG值*/*在定时程序中禁能中断*/_CLI();EECR|=(1 EECR|=(1 SREG=cSREG;/*恢复SREG值(I位)*/当使用SEI指令来使能中断时,紧跟在SEI后面的指令将在任何后续的中断前被执行,示例如下。汇编代码例子sei;置位全局中断使能sleep;进入休眠,等待中断;注意:将在任意中断前进入休眠C代码例子_SEI();/*置位全局中断使能_SLEEP();/*进入休眠,等待中断*/*注意:将在任意中断前进入休眠*/中断响应时间对于所有使能的AVR中断,中断执行响应最少为四个时钟周期。在四个时钟周期之后,实际中断处理程序的向量地址被执行。在这四个时钟周期内,程序指针(PC)被压入堆栈。该失量正常为一到中断程序的跳转,并且该跳转花费三个时钟周期。如果中断发生在一个多周期指令的执行期间,在中断被响应前,该指令要执行完毕。如果当MCU在休眠模式中有中断产生,那么该中断响应时间要再增加四个时钟周期。这是由于从选择的睡眠模式中唤醒需要启动时间。从中断处理程序返回需要四个时钟周期。在这四个时钟周期内,程序指针(两个字节)从堆栈中被弹出,堆栈指针加2,SREG的I位被置位。Mon,26 Mar 2007 00:22:41 GMT AVR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。完整的中断向量见第二章表2-23。在中断向量表中,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位RESET拥有最高优先级。中断设计注意点:1.具备Bootloader功能的AVR,其中断向量区可以在Flash程序存储器空间最低位置和Bootloader区的头部来回迁移,这主要用于配合Bootloader程序的应用。如果不使用Bootloader功能,一般不要中断向量区进行迁移。2.Flash较小的AVR芯片,其一个中断向量占据1个字的空间,用于放置一条相对转移RJMP指令(范围-2K+2K字),跳到中断服务程序。对于不使用的中断,在中断向量区中应放置1条中断返回指令RETI,增强程序的抗干扰性。3.ATmega128的Flash空间为64K字节,因此它的一个中断向量占据2个字的空间,用于放置一条绝对转移JMP指令(指令长度为2个字),跳到中断服务程序。对于不使用的中断,在中断向量区中应连续放置2条中断返回指令RETI,增强程序的抗干扰性。当使用汇编语言编写系统程序时应注意。4.当MCU响应一个中断时,其硬件系统会自动中断返回地址压入系统堆栈,并将关闭全局中断响应(硬件将中断标志I位清0),清除该中断的中断标志位;执行中断返回指令RETI时,硬件会先允许全局中断响应(硬件将中断标志I位置1),然后从系统堆栈中弹出返回地址到PC程序计数器中,继续执行被中断打断的程序。除此之外,MCU的硬件没有对中断保护做其他处理。5.因此,用户在编写中断服务程序时,首先要编写中断现场保护程序,如保护MCU的状态寄存器等。在中断返回之前,不要忘记恢复中断现场。6.如果设置和允许外部中断响应,即使是外部INT0.7引脚设置为输出方式,在引脚上的电平变化也会触发外部中断的发生,这一特性提供了使用软件产生中断的途径。7.外部中断可选择采用上升沿触发、下降沿触发以及电平变化(由高变低或由低变高)和低电平触发等方式,无外部高电平触发方式。具体触发方式由外部中断控制寄存器EICRA(INT3:0)和EICRB(INT7:4)决定。8.如果选择外部低电平方式触发中断时应特别注意:(1)引脚上的低电平必须一直保持到当前一条指令执行完成后才能触发中断;(2)低电平中断并不置位中断标志位,即外部低电平中断的触发不是由于中断标志位引起的,而是外部引脚上电平取反后直接触发中断(当然需要开放全局中断允许)。因此,在使用低电平触发方式时,中断请求将一直保持到引脚上的低电平消失为止。唤句话说,只要中断引脚的输入引脚保持低电平,那么将一直触发产生中断。所以,在低电平中断服务程序中,应有相应的操作命令,控制外部器件释放或取消加在外部引脚上的低电平。B.中断优先级以及中断嵌套处理1.AVR中断的优先级由该中断向量在中断向量区中的位置确定,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位RESET拥有最高优先级。2.当两个中断同时发生申请中断时,MCU先响应中断优先级高的中断。低优先级的中断一般将保持中断标志位的状态(外部低电平中断除外),等待MCU响应处理。3.MCU响应一个中断后,在进入中断服务前已由硬件自动清零全局中断允许位。因此此时即使有更高优先级的中断请求发生,MCU也会不响应,要等执行到RETI指令,从本次中断返回,并执行了一条指令后,才能继续响应中断。所以,在缺省情况下,AVR的中断不能嵌套。AVR中断的优先级只是在有多个中断同时发生时才起作用,此时MCU将首先响应高优先级的中断。4.AVR中断嵌套处理是通过软件方式实现的。如在B中断服务中,如需要MCU能及时的响应A中断(不是等本次中断返回后再响应),B中断的服务程序应这样设计:(1)B中断的现场保护;(2)屏蔽除A以外其它的中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断(6)恢复在本中断程序被屏蔽的中断允许标志;(7)B中断现场恢复;(8)B中断返回。5.采用软件方式实现中断嵌套处理的优点,是能够让程序员可以根据不同的实际情况和需要来决定中断的重要性,有更加灵活的手段处理中断响应和中断嵌套,如让低优先级的中断(此时很重要)打断高优先级中断的服务等,但同时也增加了编写中断服务程序的复杂性。6.由于AVR的指令执行速度比较高,因此在一般情况下,不建议使用中断嵌套的处理方法。当然,这还需要用户在编写中断处理服务程序中,应遵循中断服务程序尽量要短的原则。C.高级语言开发环境中中断服务程序的编写1.在高级语言开发环境中,都扩展和提供了相应编写中断服务程序的方法,但不同高级语言开发环境中对编写中断服务程序的语法规则和处理方法是不同的。用户在编写中断服务程序前,应对所使用开发平台,中断程序的编写方法,中断的处理方法等有较好的了解。2.使用ICCAVR、CVAVR、BASCOM-AVR等高级语言编写中断服务程序时,通常不必考虑中断现场保护和恢复的处理,因为编译器在编译中断服务程序的源代码时,会在生成的目标代码中自动加入相应的中断现场保护和恢复的指令。3.如果用户要编写效率更高或特殊的中断服务程序,可以采用嵌入汇编、关闭编译系统的自动产生中断现场保护和恢复代码等措施,但程序员要对所使用的开发环境有更深的了解和掌握,并具备较高的软件设计能力。本人中给出的USART接收和发送中断服务程序(使用CVAVR开发平台)就是一个非常典型的示例。Sun,25 Mar 2007 23:59:45 GMT中断响应后由硬件自动清零全局中断,任何中断都无法响应,在执行完中断程序后,全局中断打开.如果需要中断嵌套,则在中断程序里软件添加打开全局中断.就可以响应任何中断(包括比本中断优先级低的中断).以至可以中断自己嵌套自己(例如中断时间是每隔100ms一次,而中断执行时间是1s.那样中断就自己嵌套自己,程序就混乱了).中断响应后,全局中断被屏蔽,如果还有中断进入,那么无论优先级高低都无法响应,但响应的中断标志位置位,当中断执行完毕后,总中断打开,接着执行未响应的中断.Tue,20 Mar 2007 22:17:54 GMT在实际AVR应用中很多朋友往往需要扩展external SRAM,首先我声明一点,AVR扩展SRAM的方法和51扩展的方法一样,在此不在累述。语言写得非常土,高手可以不看。下面主要讲ATmega162扩展SRAM的特点。先摘录datasheet里面的一段:An optional external data SRAM can be used with the ATmega162.This SRAM will occupy an area in the remaining address locations in the 64K address space.This area starts at the address following the internal SRAM.The Register File,I/O,Extended I/O and Internal SRAM uses the occupies the lowest 1280 bytes in Normal mode,and the lowest 1120 bytes in the ATmega161 compatibility mode(Extended I/O not present),so when using 64KB(65,536 bytes)of External Memory,64,256 Bytes of External Memory are available in Normal mode,and 64,416 Bytes in ATmega161 compatibility mode.SeeExternal Memory Interfaceon page 24 for details on how to take advantage of the external memory map.翻译:ATmega162可以选择使用外部SRAM。外部SRAM会占据64K中的一部分地址空间,这个地址紧接在内部SRAM的后面。内部Register,IO,扩展IO和内部SRAM占据了1280字节的空间,(略了161),所以当使用了全部的64KB的外部空间后,外部存储器只有64256Byte有效。when the addresses accessing the SRAM memory space exceeds the internal data memory locations,the external data SRAM is accessed using the same instructions as for the internal data memory access.When the internal data memories are accessed,the read and write strobe pins(PD7 and PD6)are inactive during the whole access cycle.External SRAM operation is enabled by setting the SRE bit in the MCUCR Register.翻译:当存取SRAM的地址超出了内部数据存储器的地址的范围时,存取外部数据存储器的指令与存取内部数据存储器的指令相同(这点与51不同),当存取内部存储器时,RD和WR在整个存取期间处于非活动状态。如果你想对外部存储器进行操作,应该怎么办?你就要将MCUCR中的SRE位置位。(SRE:External SRAM/XMEM Enable)Accessing external SRAM takes one additional clock cycle per byte compared to access of the internal SRAM.This means that the commands LD,ST,LDS,STS,LDD,STD,PUSH,and POP take one additional clock cycle.If the Stack is placed in external SRAM,interrupts,subroutine calls and returns take three clock cycles extra because the 2-byte Program Counter is pushed and popped,and external memory access does not take advantage of the internal pipeline memory access.When external SRAM interface is used with wait-state,one-byte external access takes two,three,or four additional clock cycles for one,two,and three wait-states respectively.Interrupt,subroutine calls and returns will need five,seven,or nine clock cycles more than specified in the instruction set manual for one,two,and three wait-states.翻译:存取外部SRAM比存取内部SRAM每个字节要额外多一个时钟周期。这意味这那几个烦人的汇编指令的执行也需要额外的一个时钟周期。如果堆栈设定在外部SRAM,那么中断,子程序调用以及返回将要耗费三个额外的时钟周期,因为2字节的程序计数器必需要入栈和出栈,(加上那个额外的时钟,是不是三个?嘿嘿),所以外部SRAM的存取远没有内部SRAM的流水线操作来得高效。当外部SRAM接口使用的等待功能,每字节的存取将要花去2,3或4个额外的时钟周期。随即中断、子程序调用-大家不看也知道下面什么意思了,嘿嘿!Using all Locations of External Memory Smaller than 64 KB Since the external memory is mapped after the internal memory as shown in Figure 11,the external memory is not addressed when addressing the first 1,280 bytes of data space.It may appear that the first 1,280 bytes of the external memory are inaccessible(external memory addresses 0x0000 to 0x04FF).However,when connecting an external memory smaller than 64 KB,for example 32 KB,these locations are easily accessed simply by addressing from address 0x8000 to 0x84FF.Since the External Memory Address bit A15 is not connected to the external memory,addresses 0x8000 to 0x84FF will appear as addresses 0x0000 to 0x04FF for the external memory.Addressing above address 0x84FF is not recommended,since this will address an external memory location that is already accessed by another(lower)address.To the Application software,the external 32 KB memory will appear as one linear 32 KB address space from 0x0500 to 0x84FF.This is illustrated in Figure 17.Memory configuration Brefers to the ATmega161 compatibility mode,configuration Ato the non-compatible mode.翻译:因为外部存储器在那个图中的内部存储器之后才被映射,所以呢,在外部存储器的头1280字节的空间是不可以寻址的,这就表现为不能存取外部存储器的0X0000-0X04FF。当然有个特殊的情况,当使用的外部存储器小于64K(典型值32K)时,外部存储器的0X0000-0X04FF范围可以通过访问0x8000 to 0x84FF进行存取(想一想为什么?)。因为高位地址线A15没有接入,外部寻址范围只有0X0000-0X7FFF,当访问0x8000 to 0x84FF时,低14位地址线定位在外部0X0000-0X04FF处(或许大家会疑惑,怎么不是访问的内部0X0000-0X04FF?请注意了,我们现在访问的是外部存储器,因为地址范围为0x8000 to 0x84FF,不是内部存储器,所以自然不是定位在内部0X0000-0X04FF范围)。不推荐大家对0x84FF以外的范围进行访问,因为这将改变0X04FF-0X7FFF的数据,因为低14位地址是重复的。在应用中,地址在0x0500 to 0x84FF范围的存取是连续的线性的,只有0X0000-0X04FF有写特殊。大家可以参考下图。Tue,20 Mar 2007 16:36:11 GMT地址分配0X0000-0X10FF内部4KRAM 0X1100-0X7FFF外部32KRAM系统频率16M,BAUD=9600,下面对程序对0/1/2/2+1等待状态下,RAM进行测试,全部通过!/ICC-AVR application builder:2006-8-14 16:03:08/Target:M128/Crystal:16.000 Mhz/1.debug rs232/#include iom128v.h#include macros.h#include stdio.h#include string.h/MCU时钟频率#define F_CPU 16000000/默认的系统BAUD#define baud 115200#define MCUBAUD9600 1/declare memory mapped variables#define txbuf1_head 0x1100/外部RAM大小0X7FFF-0X1100=0X6EFF=28415byte extern volatile unsigned char txbuf128415;/define mappings void mapping_init(void)asm(.area memory(abs) 0x1100n_txbuf1:.blkb 28415n.textn);/定义外部RAM地址#define ext_PORT1(volatile unsigned char*)0x1100)/定义一个指针指向外部RAM首地址unsigned char*p=(unsigned char*)ext_PORT1;/RAM测试的读写数据unsigned char testramtable4=0x00,0x55,0xaa,0x00;void Delay(void)void Delay1ms(void)unsigned int i;for(i=0;i=(unsigned int)(16*143-2);i+);void Delayxms(unsigned char ms)unsigned char i;for(i=0;i=ms;i+)Delay1ms();/unsigned char readram(unsigned int iaddr);void port_init(void);void watchdog_init(void);void uart1_init(void);/void writeram(unsigned int iaddr,unsigned char ctemp);void RAM_TEST(unsigned char);void test_net(void);/void sendstring1(unsigned int*txbuf);char char2hex(char t1)if(t1=00)&(t1=0x09)t1=t1+0x30;/0-9elseif(t1=0x0a)&(t1=0x0f)/A-Ft1=t1-0x0a+0x61;return t1;void sendinthex1(int c)char temph=0,templ=0;char t1=0,t2=0;temph=c/256;templ=c%256;t1=(c/256)/16;/t1=t1 8;UDR1=char2hex(t1);while(!(UCSR1A&0x40);UCSR1A|=0x40;t1=(c/256)%16;UDR1=char2hex(t1);while(!(UCSR1A&0x40);UCSR1A|=0x40;t2=(c%256)/16;/templ&0xf0;/t2=t2 8;UDR1=char2hex(t2);while(!(UCSR1A&0x40);UCSR1A|=0x40;t2=(c%256)%16;/templ&0x0f;UDR1=char2hex(t2);while(!(UCSR1A&0x40);UCSR1A|=0x40;void sendchar1(char c)/发送UDR1=c;while(!(UCSR1A&0x40);UCSR1A|=0x40;void sendint1(int c)/发送UDR1=(c&0xff00)8;while(!(UCSR1A&0x40);UCSR1A|=0x40;UDR1=c&0xff;while(!(UCSR1A&0x40);UCSR1A|=0x40;void sendstring1(unsigned char*txbuf)/发送unsigned int j;for(j=0;*txbuf;j+,txbuf+)sendchar1(*txbuf);/for(;*txbuf!=/0;txbuf+)void port_init(void)/PA AD0-AD7地址/PC AD8-AD15 PORTA=0xFF;DDRA=0xFF;PORTC=0xFF;/m103 output only DDRC=0x00;/PB4 NETRST OPORTB=0xFF;DDRB=0x10;PORTD=0xFF;DDRD=0x00;/PE0 RXD0/PE1 TXD0/PE4 NET_IRQ i/PE5 INFRA_IRQ i/PORTE=0xFF;DDRE=0x00;PORTF=0xFF;DDRF=0x00;PORTG=0x1F;DDRG=0x00;/Watchdog initialisation/prescale:2048K cycles void watchdog_init(void)WDR();/this prevents atimout on enabling/WDTCR=0x0F;/WATCHDOG ENABLED-dont forget to issue WDRs/*reset WDT*/*Write logical one to WDTOE and WDE*/WDTCR|=(1 WDTOE)|(1 WDE);WDTCR=0X18;/现在把WDTCH给关掉了/*Turn off WDT*/WDTCR=0x00;/WDTCR=0X17;/UART0 initialisation/desired baud rate:115200/actual baud rate:111111(3.7%)/char size:8 bit/parity:Disabled/*void uart0_init(void)UCSR0B=0x00;/disable while setting baud rate UCSR0A=0x00;UCSR0C=0x06;/UBRRL=(fosc/16/(baud+1)%256;/UBRRH=(fosc/16/(baud+1)/256;UBRR0L=(F_CPU/16/(baud+1)%256;/0x03;/0x08;/set baud rate lo UBRR0H=(F_CPU/16/(baud+1)/256;/0x00;/set baud rate hi UCSR0B=0x18;/0x98;*/UART1 initialisation/desired baud rate:115200/actual baud rate:111111(3.7%)/char size:8 bit/parity:Disabled void uart1_init(void)#ifdef MCUBAUD9600/UBRRL=(fosc/16/(baud+1)%256;/UBRRH=(fosc/16/(baud+1)/256;UCSR1B=0x00;/disable while setting baud rate UCSR1A=0x00;UCSR1C=0x06;UBRR1L=0x67;/set baud rate lo UBRR1H=0x00;/set baud rate hi UCSR1B=0x18;#else/baud 115200 UCSR1B=0x00;/disable while setting baud rate UCSR1A=0x00;UCSR1C=0x06;UBRR1L=(F_CPU/16/(baud+1)%256;/0x03;/0x08;/set baud rate lo UBRR1H=(F_CPU/16/(baud+1)/256;/0x00;/set baud rate hi UCSR1B=0x18;/0x98;#endif/*#pragma interrupt_handler int0_isr:2 void int0_isr(void)/external interupt on INT0*/call this routine to initialise all peripherals void init_devices(void)/stop errant interrupts until set up CLI();/disable all interrupts XDIV=0x00;/xtal divider port_init();mapping_init();watchdog_init();uart1_init();/External RAM will reside between 8000h-FFFFh./There will be 2wait states for both read and write./MCUCR=0x80;/EICRA=0x03;/extended ext ints/EICRB=0x00;/extended ext ints/EIMSK=0x01;/TIMSK=0x00;/timer interrupt sources/ETIMSK=0x00;/extended timer interrupt sources SEI();/re-enable interrupts/all peripherals are now initialised/测试RTL8019AS void test_net(void)/void RAM_TEST(unsigned char umode)unsigned int k=0;unsigned int i=0,j=0;unsigned char DATA,u;/unsigned char*p=(unsigned char*)ext_PORT1;/unsigned char*pointer=p;sendstring1(init system ok!n);sendstring1(now test system-ram all is 32k!n);for(u=0;u 4;u+)sendstring1(-now write ram);sendinthex1(testramtableu);sendstring1(n);i=0;doif(!umode)*(p+i)=testramtableu;/testok else txbuf1i=testramtableu;i+;while(i 0x6f00);/while(i 0x6eff);/while(i 0x6eff);sendstring1(-write okn);sendstring1(-now check writen);k=0x1100;i=0;doif(!umode)DATA=*(p+i);/test ok else DATA=txbuf1i;if(DATA!=testramtableu)sendstring1(addr=);sendinthex1(k);/sendstring1(=);/sendinthex1(DATA);sendstring1(n);k+;i+;while(k 0x8000);/while(k 0x1110);/0x7fff);sendstring1(-test system-ram end!n);void main(void)init_devices();sendstring1(RAMTEST START!n);sendstring1(-POINTER READ AND WRITE EXTERNAL 32K RAM-n);sendstring1(0 READ AND WRITE NO WAIT PC7 RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x40;/0x00 external memory XMCRB=0x01;/释放PC7,作为通用I/O引脚使用DDRC=0xff;/PC7用于输出,(不影响PC0-PC6地址线)PORTC=0x00;/PC7输出0,(不影响PC0-PC6地址线)RAM_TEST(0);sendstring1(1 READ AND WRITE 1WAIT PC7 RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x44;/0x00 external memory XMCRB=0x01;/释放PC7,作为通用I/O引脚使用DDRC=0xff;/PC7,PC6用于输出,(不影响PC0-PC5地址线)PORTC=0x00;/PC7,PC6输出0,(不影响PC0-PC5地址线)RAM_TEST(0);sendstring1(2 READ AND WRITE 2WAIT PC7 RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x48;/0x00 external memory XMCRB=0x01;/释放PC7,作为通用I/O引脚使用DDRC=0xff;/PC7,PC6用于输出,(不影响PC0-PC5地址线)PORTC=0x00;/PC7,PC6输出0,(不影响PC0-PC5地址线)RAM_TEST(0);sendstring1(3 READ AND WRITE 2+1 WAIT PC7 RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x4C;/0x00 external memory XMCRB=0x01;/释放PC7,作为通用I/O引脚使用DDRC=0xff;/PC7,PC6用于输出,(不影响PC0-PC5地址线)PORTC=0x00;/PC7,PC6输出0,(不影响PC0-PC5地址线)RAM_TEST(0);sendstring1(*POINTER READ AND WRITE EXTERNAL 32K RAM*n);sendstring1(n-BUFFER READ AND WRITE EXTERNAL 32K RAM-n);sendstring1(4 READ AND WRITE NOWAIT PC7 NO RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x40;/external memory RAM_TEST(1);sendstring1(5 READ AND WRITE 1WAIT PC7 NO RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x44;/external memory RAM_TEST(1);sendstring1(6 READ AND WRITE 2WAIT PC7 NO RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x48;/external memory RAM_TEST(1);sendstring1(7 READ AND WRITE 2+1WAIT PC7 NO RELEASED!n);MCUCR=0x80;/允许外部并行扩展接口,忽略高位0X8000的等待时间XMCRA=0x4A;/external memory RAM_TEST(1);sendstring1(n*BUFFER READ AND WRITE EXTERNAL 32K RAM*n);sendstring1(-RAM TEST OK!-n);/while(1)/sendstring1(now test rtl8019as!n);/test_net();/sendstring1(-test rtl8019as end!n);Tue,20 Mar 2007 14:58:13 GMT变量定位普通变量的定义和访问同标准C语言,在HCS08 C语言中我们主要要解决映像寄存器变量和某些特殊变量的定位问题,即把这些变量存放在RAM中指定的位置。1映像寄存器定位映像寄存器单片机中跟硬

温馨提示

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

最新文档

评论

0/150

提交评论