调试单片机内部扩展RAM
51单片机内部只有128字节的RAM(8051),而8052有256字节的RAM,低128字节RAM直接或间接寻址都可以,高128字节RAM与SRF特殊功能寄存器共用地址,SFR只能直接寻址,高128字节RAM只能间接寻址。所以通常用总线方式扩展一片RAM。一般用62256(32kX8bit RAM)。访问方式可参考我的博文:
http://blog.ednchina.com/tengjingshu/218041/message.aspx
现在新出的51单片机都在内部扩展了外部RAM。这个RAM还是叫外部RAM,不过在芯片内部,之所以还叫外部RAM,是因为是用外部总线连接的,访问方式还是用MOVX访问。可以参考STC89C58RD+,扩展了1024字节(byte)RAM。所以STC89C58RD+一共有1024byte+256byte=1280byte这么多字节的RAM。
内部扩展RAM的使用
STC89C58RD+内部扩展RAM的使用是通过对特殊功能寄存器AUXR赋值实现的。
|
Mnemonic |
Add |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
复位值 |
|
AUXR |
8Eh |
— |
— |
— |
— |
— |
— |
EXTRAM |
ALE0FF |
xxxx,xx00 |
其中
EXTRAM Internal/External RAM access 内部/ 外部 RAM 存取
0: 内部扩展的EXT_RAM 可以存取.
RD+ 系列单片机
在00H 到3FFH 单元(1024 字节),使用MOVX @DPTR 指令访问,超过400H 的地址空间总是访问外部数据存储器(含400H 单元),MOVX @Ri 只能访问00H 到FFH 单元
RC 系列单片机
在00H 到FFH 单元(256 字节),使用MOVX @DPTR 指令访问,超过100H 的地址空间总是访问外部数据存储器(含100H 单元),MOVX @Ri 只能访问00H 到FFH 单元
1: External data memory access.
外部数据存储器存取,禁止访问内部扩展RAM,此时MOVX @DPTR / MOVX @Ri 的
使用同普通8052 单片机
调试经过
之前的板子是使用STC89C51RD+总线方式驱动62256,但只用到1024字节的RAM,而STC89C51RD+自身就有内部扩展的1k(外部)RAM,所以这次先没焊接62256。沿用以前程序(问题就处在这!!!)。(以下程序经过简化)
#include <reg52.h>
#include <stdio.h>
#include <stcmcu.h>
void Serial_Init(void);
void printValue(void);
void main(void)
{
AUXR=0x03;
Serial_Init();
printValue();
);
}
void Serial_Init(void)
{
//--------serial init--------------------- //串口初始化
SCON = 0x50; //8 bit UART,enable
TMOD |= 0x20; //t1 8 bit reload
PCON |=0x80; //bandrate X 2
TH1 = 0xFF; //0xfa set bandrate 9600 with crystal 11.0592M
TL1 = 0xFF; //0xff : 57600
TR1 = ; //t1 start
ES=; //serial interrupt enable
REN=; //recieve enable
}
void printValue(void)
{ //串口输出ScanData,一共3个值
unsigned int j;
xdata unsigned ];
TI=; //开串口定时器
;j<;j++)
{
ScanData[j]=;
}
;j<;j++){
printf("%d\n",ScanData[j]);
}
Delayms();
TI=; //关串口定时器
}
printf串口输出。应该输出ScanData[0], ScanData[1], ScanData[2],都为0,可是确输出
0
256
512
我很吃惊,这么简单的程序都会出错,所以一直找问题。问题出在AUXR=0x03,之前是用了62256的,但这次没有用,xdata的数据应该存储在内部扩展的RAM里面,但确因为AURX这个寄存器进行相应改动,仍然访问外部RAM(62256)。因改为AUXR=0x01 / AUXR="0x00"。(AUXR第一位是ALEOFF,用于ALE禁止输出)。改了之后,串口输出:
0
0
0
正确了,后来程序又改为:
#include <reg52.h>
#include <stdio.h>
#include <stcmcu.h>
void Serial_Init(void);
void printValue(void);
xdata unsigned ];
void main(void)
{
AUXR=0x01;
Serial_Init();
printValue();
);
}
void Serial_Init(void)
{
//--------serial init--------------------- //串口初始化
SCON = 0x50; //8 bit UART,enable
TMOD |= 0x20; //t1 8 bit reload
PCON |=0x80; //bandrate X 2
TH1 = 0xFF; //0xfa set bandrate 9600 with crystal 11.0592M
TL1 = 0xFF; //0xff : 57600
TR1 = ; //t1 start
ES=; //serial interrupt enable
REN=; //recieve enable
}
void printValue(void)
{ //串口输出ScanData,一共3个值
unsigned int j;
xdata unsigned ];
TI=; //开串口定时器
;j<;j++)
{
ScanData[j]=;
}
;j<;j++){
printf("%d\n",ScanData[j]);
}
Delayms();
TI=; //关串口定时器
}
定义了一个全局变量数组adData[512],这个数组的元素是int型的(16bit),所以一共占用1024字节RAM,加上3字节的ScanData数组,一共使用了1027个字节,编译后也可以在keil的Output Window中看出。
Program Size: data="32".1 xdata="1027" code="1175"
此时,虽然AUXR=0x01,定义成访问内部扩展RAM,但由于adData[512]是全局变量,定义时就分配RAM,所以但在printValue里分配局部变量ScanData时,RAM已经超过的STC89C58RD+的1024内部扩展RAM的上限,所以串口输出出错,和之前一样,输出
0
256
512
所以,千万要注意外部RAM够不够,不够的话,就不要省一片62256了J
注意的话:
快速使用的数 用内部RAM,只有128字节(8051)/256字节(8051) 访问只用1个机器周期
存储的数据 内部扩展的RAM 要注意芯片DataSheet上内部扩展RAM的大小
外部RAM 用总线方式访问,如32kX8 RAM 62256
51单片机最大可64k寻址
调试单片机内部扩展RAM的更多相关文章
- 51单片机局部变量占用ram的问题
51单片机局部变量占用ram的问题 一.问题 自从工作以来基本不使用51或者增强型51之类的单片机.最近调试芯圣HC89S003F4增强型51,移植了32的实用代码,结果发现RAM爆了!!! 二.实践 ...
- STM32L系列单片机内部EEPROM的读写
STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...
- 自制单片机之七……扩展:DS18B20温度测量
DS18B20数字温度测量传感器,网上介绍很多,我就不罗嗦了.见图 DS18B20与前产品DS1820的不同: DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0-- ...
- 单片机FLASH与RAM、ROM的关系
片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~10万的都有,但存储时间可以保 ...
- Windbg程序调试系列1-Mex扩展使用总结
最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...
- Linq调试实时输出信息扩展方法(摘抄)
原文在此 [译]如何在C#中调试LINQ查询 原linq语句: var res = employees .Where(e => e.Gender == "Male") .Ta ...
- STC89C52单片机内部EEPROM驱动
STC89C52单片机自身带有4K的存储空间,分为8个扇区,每个扇区512字节,第一扇区起始地址为:0x2000, 结束地址为:21FF, 第八扇区起始地址为0x2E00,结束地址是2FFF #inc ...
- 单片机成长之路(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图: /*------------ ...
- 单片机引脚扩展芯片74HC595手工分解实验
我们先来看下效果 74HC595是常用的串转并芯片,支持芯片级联实现少量IO口控制多个IO口输出功能 14脚:DS,串行数据输入引脚 13脚:OE, 输出使能控制脚,它是低电才使能输出,所以接GND ...
随机推荐
- Git Bash 使用心得
1:下载Git Git for Windows 2:点击安装,依次默认下一步 3:安装完成 4:设置SSH建立计算机与Github的链接 4.1 点击开始菜单找到Git Bash,并点击: 4.2 ...
- Unity3D基础学习 NGUI Example 7-Scroll View(Panel)制作固定包裹栏,点击传递参数显示物体
最终效果如下: 实现ScrollView主要是NGUI的三个脚本"UIDraggable Panel","UIGrid","UIDrag Panel ...
- Flashback Version Query、Flashback Transaction Query快速闪回细粒度数据
Flashback Version Query 闪回版本查询 使用Flashback Version Query 返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本. ...
- 机房管理系统——vb与excel链接2
因为我之前找的文档让我以为在创建表里面走了非常大的误区,所以当时我直接就在学生管理系统的目录里建了张表,执行时候直接打开这样表即可了. 可是这里面还是存在着非常大的误区. 后来我看了周坤的博客感觉他比 ...
- Android笔记之 文件保存、压缩与清空删除
这两天改进优化项目中图片上传的代码.考虑到可能有7.8M的比較大的图片,由于要先进行压缩.所以设计到文件的压缩,保存与清空删除操作. 在这里记下笔记. /** * 压缩并另存为,每次先清空再保存 */ ...
- Trie和Ternary Search Tree介绍
Trie树 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie树与二叉搜索树不同,键不是直接保存在节 ...
- Underscore.js 常用类型判断以及一些有用的工具方法
1. 常用类型判断以及一些有用的工具方法 underscore.js 中一些 JavaScript 常用类型检查方法,以及一些工具类的判断方法. 首先我们先来谈一谈数组类型的判断.先贴出我自己封装好的 ...
- Android 网络编程与通信协议
大多数的Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操作, HttpURLConnection和HttpClient.这两种方式都 ...
- C#获取磁盘列表与信息
方法1:使用Environment //获取当前计算机逻辑磁盘名称列表 String[] drives = Environment.GetLogicalDrives(); Console.WriteL ...
- phpMyAdmin配置及 错误 缺少 mysqli 扩展。请检查 PHP 配置
PHPMyadmin配置文件config.inc.php内容如下,在需要设置的地方增加了相关注释. 非常适合对数据库操作命令不熟悉的数据库管理者,下面我就说下怎么安装该工具: 1.先到网上下载 ...