- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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位被自动置位。
基本上有两种类型的中断。第一种是由事件触发的,把中断标志置位。对于这些中断,程序计数器被引导
您可能关注的文档
最近下载
- 高一数学(必修二)立体几何初步单元测试卷及答案.docx VIP
- “二次元经济”崛起背后的商业逻辑.docx VIP
- 【阶段测试】人教版数学六年级上册第一单元《分数乘法》单元测试卷27.doc VIP
- 中国谷子经济分析:从哪吒旋风看二次元IP衍生品市场崛起.pdf VIP
- 2025年全国高考山东省物理真题试卷(含答案).pdf
- 2025年人教版数学六年级上册单元测试卷-第一单元 分数乘法(含答案).pdf VIP
- 《不负'食'光拒绝浪费》班会课件.pptx VIP
- 部编本《一块奶酪》优质课公开课教案课堂教学实录.docx VIP
- DB13T 5448.3-2021 工业取水定额 第3部分:医药行业.docx VIP
- 山东省安装工程消耗量定额(2016).pdf
文档评论(0)