欢迎来到天天文库
浏览记录
ID:29481645
大小:116.52 KB
页数:44页
时间:2018-12-20
《avr单片机相关问题》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、AVR单片机相关问题AVR读写外部RAM时出现的问题问:1,对AT90S8515来说,外部RAM的地址肯定是从0x0260开始的?2,我用ICE200仿真8515读写外部RAM,RAM大小为32KBytes,地址映射到0x0000-0x7fff,用PC7做它的片选。把SRE置为1,当我访问0x0300时PC7为低,这是对的,但当我不去访问0x0000-0x7fff地址空间时(例如进入死循环),问题出现了,此时PC7仍为低,按道理应为高的。这是阿AVR与51的不同,还是我弄错了。答:1、对AT90S8515来说,外部RAM的地址肯定是从0x0
2、260开始的。这是没问题的,访问0x0000-0x025F的地址为内部RAM。2、当你访问过0x0300,PC7为低,当你不访问0x0000-0x7FFF时,由于没有一条把PC7置高的指令,所以PC7当然还为低了。不过这也不要紧,因为当你访问0x0000-0x025F的时候,RD和WR是没有的,所以即使外部RAM被选中了,没不会产生读写。当你访问0x0260-0x7FFF的时候,RD和WR就自动产生了。所以就是你把外部RAM的CS直接接地也是可以的。Mon,26Mar200715:45:57GMT以前看到#defineSREG(*(vola
3、tileunsignedchar*)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,第一步是要把它强制转换为指针类型(unsignedchar*)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向unsignedchar类型。volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就
4、不会去假设这个变量的值了。这种"意想不到地改变",不是由程序去改变,而是由硬件去改变--意想不到。第二步,对指针变量解引用,就能操作指针所指向的地址的内容了*(volatileunsignedchar*)0x5F第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以:#defineSREG(*(volatileunsignedchar*)0x5F)类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义:#defineRAM_ADDR(*(volatileunsignedlong*)0x000
5、0555F)然后就可以用C语言对这个内存地址进行读写操作了读:tmp=RAM_ADDR;写:RAM_ADDR=0x55;定义volatile是因为它的值可能会改变,大家都知道为什么改变了;如果在一个循环操作中需要不停地判断一个内存数据,例如要等待SREG的I标志位置位,因为SREG也是映射在SRAM空间,为了加快速度,编译器可能会编译出这样的代码:把SREG读取到Register中,然后不停地判断Register相应位。而不会再读取SREG,这样当然是不行了,因为程序或其它事件(中断等)会改变SREG,结果很可能是一个死循环出不来了。如果定
6、义成volatile型变量,编译的代码是这样的:每次要操作一个变量的时候都从内存中读取一次。#defineSREG(*(volatileunsignedchar*)0x5F)之后,可以进行如下基本操作,unsignedchartemp,*ptr;temp=SREG;把SREG值保存到temp中SREG=temp;把temp的值赋给SREGptr=&SREG;不知对否,大家试一下。Mon,26Mar200712:56:10GMTAVR提供了几种不同的中断源。这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。所有中断都被分配一个私有的
7、使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使能位置1。程序存储器空间最低的一些地址,被默认定义为复位和中断向量。完整的向量列表见"中断"部分。该列表也决定了不同中断的优先级。地址越小,优先级越高。RESET具有最高的优先级,其次是INT0--外部中断请求0。详细讨论见"中断"部分。当某个中断产生时,全局中断使能位I被清零,所有中断都被禁止。用户程序可以向I位写入1,以实现中断嵌套。所有已使能的中断就可以中断当前的中断程序。当从中断指令--RETI--的执行返回时,I位被自动置位。基本上有两种类型的中断
8、。第一种是由事件触发的,把中断标志置位。对于这些中断,程序计数器被引导到实际的中断向量,以执行中断处理程序,同时硬件把相应的中断标志清除。通过向要清除的标志位位置写一个逻辑1,也
此文档下载收益归作者所有