AVR单片机相关问题.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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位被自动置位。 基本上有两种类型的中断。第一种是由事件触发的,把中断标志置位。对于这些中断,程序计数器被引导

文档评论(0)

shujukd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档