STC 8051单片机扩展SRAM介绍、使用以及配置

2023-05-16

总述

STC8051系列单片机中很多具有内部扩展的数据存储器SRAM(单片机内部的RAM一般都是SRAM,区别于SDRAM,下面叙述中的RAM,即表示SRAM),所谓的内部扩展RAM,即是说在基本型的8051基础上扩展数据存储空间。从逻辑上来说,扩展的RAM空间应该是在芯片外部通过外部总线读取的,但从物理上看却又是在芯片内部的,一定数目的RAM空间被集成到了单片机内部,从而扩大了单片机的RAM。

片内RAM介绍以及使用

STC系列单片机内部RAM及其可扩展情况如下图1所示:


图1

Idata空间表示单片机自身具有的基础RAM,xdata即是STC额外扩展的位于芯片内部的RAM。Idata和xdata所代表的意思即是是说数据到底是在片内的低256字节还是扩展的RAM地址上。

在程序中可以通过在类型后面声明来指定位置,如果不声明的话,数据存放的默认位置和编译器的SRAM编译设置有关。(此点后面介绍)。

Eg:

Unsigned char idata a;//定义一个uchar型变量,将会在程序运行时,被分配到低256或128字节的RAM上去

Unsigned int xdata b;//定义一个uint型变量,程序运行建立该变量时,将会被指定到扩展的RAM区域去。

这儿注意,STC的单片机只有40个引脚以上的才可以进行片外RAM扩展,最多支持片外字节地址为64KB。


其实,低256字节的RAM空间也并不是全部能通用访问的,其中还有工作组寄存器,堆栈指针寄存器,SFRs等,大体分布如图2,这些都是很多8051书上讲得很详细了,这里就不再赘述。


图2

STC8051的内部RAM计量方法是:标称RAM=集成RAM+扩展RAM。例如:stc15f2k60s2,内部具有2K的ram,这2K的RAM其实是由256字节的集成RAM和1792字节的扩展RAM构成的。在Keil中开发时,如果需要使用超过256字节的RAM,则应该在Keil的工程Option中设置MemoryModel为:Large:Variables in XDATA.,并勾选”use on-chip XRAM选项”(如图3所示),这样在代码中默认声明的变量即为xdata型变量,如果要使用集成RAM那部分空间,还需要额外声明idata.


图3

以上为STC 8051单片机的一般性RAM使用方法。接下来说一下STC单片机片外扩展RAM的使用和设置方法。

 片外扩展RAM介绍以及使用

在工程中,我们可能遇到需要较大的数据暂存空间的情况,这个时候内部的2K、4K RAM就完全不够用了。使用单片机内部自带的EEPROM或Flash存储空间不失为一种方法,不过存在擦写次数有限和操作周期长的问题,在某些对实时性要求较高的场合,会耽误MCU对其它任务的处理。

 1)硬件连接

这儿先来介绍下STC单片机扩展片外RAM的物理连接方式:通过使用P0、P2端口来进行地址、数据传输,其中P0口为数据/地址复用端口,并通过锁存芯片进行地址锁存。其他使用的信号还包括:ALE(P4.5),用于控制P0口连接的数据/地址数据线的锁存芯片,RD(P4.4)和WR(P4.2)用于对RAM存储芯片进行读写指示。具体的连接示例如图4所示:


图4

 

STC单片机片外扩展RAM空间的逻辑地址最大支持64Kbyte,此64KB是指除了单片机内部基本的256字节之外能扩展的地址,所以如果单片机内部进行了RAM扩展,使用了一部分地址,那么片外扩展的存储芯片地址就不一定能全部使用。

例如:stc15f2K60s2,如果同时使用内部和外部扩展的RAM空间地址,那么扩展的片外RAM空间最多只能访问:64k-(2k-256)=62.75k个字节地址了。

 2)片外RAM编程使用介绍以及工程设置

根据STC手册,控制是否使用内部扩展的RAM决定于AUXR寄存器的EXTRAM位。当该位为1,则不使用单片机内部扩展的RAM,而直接使用片外扩展的RAM。所以如果此时外部扩展了一片64K字节的RAM芯片,那该RAM芯片的所有地址都是可以访问到的。如果该位为0,则内部扩展的RAM和片外扩展的RAM都会使用,扩展地址总和同样是64K,但由于单片机内部扩展的RAM使用了一部分扩展地址,所以此时所能使用到的片外RAM 空间为64K与内部扩展RAM地址空间的差值了。如图5

 

在EXTRAM为0情况下,STC单片机会首先使用内部扩展RAM,当地址超过了内部扩展RAM地址时,会自动地使用外部RAM的,这就不用我们操心了。(STC 单片机复位时,EXTRAM位为0,即默认是内部和外部扩展RAM都会使用的。)


图5

 

同时,要使用片外的扩展RAM,在Keil中同样要进行相应的设置,指定外部RAM的起始字节地址以及大小。如图6所示:


图6

 

我实际使用的是 STC15F2K60S2(2K RAM,60K ROM)型单片机并使用32KByte的RAM芯片进行片外扩展,起始地址Start由图6可以看出是:0x0700。这个起始地址是这样计算的:2K(2048)-256=1792=0x0700,这就是片外扩展的RAM起始地址。空间大小Size由图6可以看出是:0x7D00,计算过程为:32K=32*1024=32768=0x8000.这样就完成了Keil中使用片外扩展RAM的配置。

 

我在程序中如此定义一个变量:

#define DATA_NUM               32768

uchar xdata P_rBuff1[DATA_NUM];

其它还有一些定义的idata和xdata变量。

Keil中程序编译结果如图7:

 

图7

程序经过测试,也能正常运行。

 3)片外RAM访问时序和速度介绍

最后还有一点,STC15系列还有一个特殊功能寄存器(SFR)专门用于控制外部64K数据总线速度:BUS_SPEED。该寄存器的低两位:EXRTS[1:0]可以控制片外RAM访问动作的建立、保持、读或写所需的CPU时钟周期。

 

众所周知的是,片外RAM访问,时序大致分这样几个阶段:地址数据建立、地址数据保持(MCU的ALE管脚控制锁存地址数据)、数据的读或写。如图8所示:


图8

 

所以访问外部的RAM所需要的时钟周期也至少是这几部分动作的周期和,再加上额外的一些CPU跳转周期。而BUS_SPEED就是控制这些动作所需持续的时间的。

 

所以该寄存器数值和访问速度关系如图9所示:


图9

图9中两条MOVX命令都是访问片外RAM的,只是前者是访问片外RAM 8位地址,后者是访问片外RAM 16位地址,差别仅为一个周期,所以不用过多纠结此处。

接下来请看图10和图11:

图10

图11

 

图10是读写片内扩展RAM所需时钟周期,图11是读写片外扩展RAM(BUS_SPEED已设置为最快速度)所需时钟周期。8位的读写也是与此类似的。从对比中我们可以知道,片外扩展的RAM访问所需时间是片内扩展RAM所需时间的2~3倍。所以即便是在考虑使用片外扩展的RAM,也要注意其存取速度是否能够满足要求。另外还要考虑的是存储芯片的数据信号跳变所需时间。


结束

STC51单片机作为国产的8位51系列增强型单片机,使用起来的性价比还是不错的,入手也很简单,其功能还是能够满足一般的开发应用的。但同时也存在一些功能还不够好的,如UART。使用手册的一些介绍也不够详细。要在芯片制造领域达到比较先进的水准,还是需要多静下来研究的,我们也会在STC51能够胜任的条件下优先选择STC51,支持本土芯片的发展。


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STC 8051单片机扩展SRAM介绍、使用以及配置 的相关文章

  • Keil调试中遇到问题汇总

    1 Keil MDK中工程编译弹出提醒框 xff1a Browse information of one of more files is not available Doing a project rebuild might fix th
  • C语言实现TCP服务器与客户端通信

    以上是TCP通信客户端与服务器实现通信的基本原理流程图 1 客户端的实现 xff08 4个步骤 xff09 1 1创建socket对象 1 2请求连接 1 3发送数据 1 4关闭套接字 include lt stdio h gt inclu
  • 关闭select监控的fd出现的问题及解决方案

    关闭select监控的fd出现的问题及解决方案 前言一 实现思路二 问题三 bind 失败分析1 使用netstat查看socket状态2 为什么srv fd引用计数会加13 select 超时后srv fd引用计数减14 man sele
  • SVN如何打tag,以及主干,分支的相互合并操作

    1 给项目打 tag的步骤 1 xff09 选中项目后 xff0c 点击鼠标的左键弹出对话框 选择TortoiseSVN gt Branch tag 如图所示 点击Branch tag后弹出如下对话框 svn 显示的路径是需要打tag文件的
  • OKHttp使用详解

    一 xff0c OKHttp介绍 okhttp是一个第三方类库 xff0c 用于android中请求网络 这是一个开源项目 是安卓端最火热的轻量级框架 由移动支付Square公司贡献 该公司还贡献了Picasso和LeakCanary 用于
  • HttpUrlConnection使用详解

    一 xff0c HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一 xff0c Android SDK中对HTTP 超文本传输协议 也提供了很好的支持 xff0c 这里包括两种接口 1 标准Java接
  • SwipeRefreshLayout的使用详解

    一 xff0c 概述 SwipeRefreshLayout意思为下拉刷新的布局 xff0c 其继承ViewGroup xff0c Google在android5 0中提供的下拉刷新控件 xff0c 且提供了v4支持包 这是一个容器布局 xf
  • Java操作数据库方式(六)DataSource详解

    概述 在java世界里操作数据库有很多方式 xff0c 在众多方式中除了JDBC外都有DataSource对象 DataSource可以看作数据源 xff0c 它封装了数据库参数 xff0c 连接数据库 xff0c 程序中操作DataSou
  • MySql(四)之项目实战

    概述 MySql项目实战是结合实际开发工作 xff0c 来说明数据库分析 xff0c 数据库设计 xff0c 数据库创建等一些列流程 这部分知识不属于严谨的技术 xff0c 不同的人有不同的方法 xff0c 如果你不认可你可以继续自己的方法
  • MySql(五)之sql优化

    概述 作为一个高级程序员 xff0c 不仅要熟练使用sql语句 xff0c 更应该使用高效的sql语句 本篇blog讲解的内容主要包括 xff1a 索引的使用 执行计划分析 sql优化常见案例分析 索引 一 xff0c 什么是索引 索引的作
  • Oracle(一)之安装与使用

    概述 oracle是关系型数据库中的一种 xff0c 与MySql类似 xff0c 也是一种数据库服务 xff0c oracle公司出品 比MySql安全可靠 xff0c 但收费 oracle数据库无论在存储数据量 xff0c 性能 xff
  • Oracle(二)之视图的使用

    概述 什么是视图 视图可以理解为一张虚拟表 xff0c 它是由固定的sql查询语句操作真实表得到的一个临时表 视图中的数据就是查询sql语句的结果 得到视图之后 xff0c 我们可以使用sql操作视图 xff0c 但只能是查询操作 查询视图
  • CMUX 软件包发布 | 不一样的串口复用

    1 什么是 CMUX CMUX xff08 Connection Multiplexing xff09 xff0c 即连接 xff08 串口 xff09 多路复用 xff0c 其功能主要在一个真实的物理通道上虚拟多个通道 xff0c 每个虚
  • Linux中使用curl命令发送带参数的get请求和post请求

    1 curl与wget 命令的区别 相似之处 xff1a wget 和 cURL 都可以下载内容 xff0c 都可以向互联网发送请求并返回请求项 xff0c 也可以进行 HTTP POST 请求 xff0c 它们都是命令行工具 xff0c
  • STM32片上Flash内存映射、页面大小、寄存器映射

    本文以STM32F103RBT6为例介绍了片上Flash Embedded Flash 若干问题 xff0c 包括Flash大小 内存映射 块大小 页面大小 寄存器 二 块大小 Flash先分块再分页 xff0c 擦除是按块进行 xff0c
  • keil 修改RAM、ROM

  • 单片机flash不足,keil如下方式进行优化

    单片机的flash不够的时候可以使用keil的优化等级进行优化 xff1b 但是使用Opt进行优化的时候会遇到难以预料的错误 xff0c 所以使用时要对一些变量进行标识 xff0c 比如使用volatile关键字 还有其他方式也能减少内存的
  • msp430看门狗定时器

    看门狗定时器用来防止程序因供电电源 空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故 在很多单片机中都内置了看门狗 xff0c 看门狗本身是一个定时器 xff0c 当定时器溢出时即进行系统复位 xff0c 因此需要在程序中对看门狗定时器
  • UART、SPI和IIC详解与比较(超级实用的调试经验)

    1 UART UART有4个pin xff08 VCC GND RX TX xff09 用的TTL电平 低电平为0 0V xff0c 高电平为1 xff08 3 3V或以上 xff09 UART使用的是异步串行通信 UART是两线 xff0
  • RS232、RS485和CAN协议总结与对比

    一 RS232串口是计算机上一种非常通用的设备通信协议 串口的电气特性 xff1a 1 RS 232串口通信最远距离是50英尺 xff1b 2 RS232可做到双向传输 xff0c 全双工通讯 xff0c 最高传输速率20kbps xff1

随机推荐

  • STM32 GPIOx_CRL/GPIOx_CRH 寄存器

    GPIOx CRL GPIOx CRH xff08 x xff1a A F xff09 寄存器用来对GPIO进行端口设置 xff0c 如 xff1a 设置GPIO为输入模式或输出模式 每个寄存器含有32位 xff0c 每4位用来设置1个GP
  • SHT10 温湿度传感器的程序以及调试总结

    没有其他东西 直接上调试注意事项和代码 xff01 xff01 调试要点 xff1a 1 DATA加10K上拉电阻 2 注意示波器观察各个信号 基础要点 xff1a 1 串行时钟输入 xff08 SCK xff09 单片机模拟时钟 2 串行
  • 晶振原理解析

    目录 01 压电效应 02 晶体振荡器的应用 03 无源晶振和有源晶振的区别 04 STM32外接晶振 下文将进一步讲解晶振的原理 xff0c 以及晶振和STM32的关系 01 压电效应 压电效应 xff1a 某些电介质在沿一定方向上受到外
  • 字符串大小的比较

    字符串大小比较的步骤 xff1a 从左至右一位一位比较 xff0c 如果相同 xff0c 则继续下一位 xff0c 如果不同 xff0c 则谁的ASCII大谁的字符串就大如果比较到其中一者已经结束了 xff0c 还没有分出大小 xff0c
  • STM32延时函数的四种方法

    目录 1 普通延时 2 定时器中断 3 查询定时器 4 汇编指令 单片机编程过程中经常用到延时函数 xff0c 最常用的莫过于微秒级延时delay us 和毫秒级delay ms 本文基于STM32F207介绍4种不同方式实现的延时函数 1
  • STM32的FSMC外设简介

    目录 01 FSMC特点 02 AHB接口 03 外部设备地址映射 04 NOR PSRAM控制器 05 外部存储器接口信号 06 NOR PSRAM控制器异步事务 07 模式1 08 模式A 09 代码说明 01 FSMC特点 Flexi
  • STM32使用DMA接收串口数据

    目录 01 概述 02 DMA接收 03 中断 04 代码 01 概述 在之前的文章里 STM32串口详解 和 STM32 DMA详解 文章中 xff0c 详细讲解了STM32的串口和DMA外设 xff0c 本篇文章将不在细述串口和DMA的
  • 指针与数组

    1 定义 指针 xff1a C语言中某种数据类型的数据存储的内存地址 xff0c 例如 xff1a 指向各种整型的指针或者指向某个结构体的指针 数组 xff1a 若干个相同C语言数据类型的元素在连续内存中储存的一种形态 数组在编译时就已经被
  • 关于软件定时器的一些讨论

    1 简介 这里先介绍下软件定时器和硬件定时器的区别 硬件定时器 xff1a CPU内部自带的定时器模块 xff0c 通过初始化 配置可以实现定时 xff0c 定时时间到以后就会执行相应的定时器中断处理函数 硬件定时器一般都带有其它功能 xf
  • 表驱动法在STM32中的应用

    1 概念 所谓表驱动法 Table Driven Approach 简而言之就是用查表的方法获取数据 此处的 表 通常为数组 xff0c 但可视为数据库的一种体现 根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法 xff0c 即以
  • 关于共享资源保护的思考

    1 引言 先聊聊分享这篇文章的原因 xff0c 在使用STM32时 xff0c 我发现对于GPIO输出操作 xff0c 可以使用GPIOx ODR寄存器 xff0c 也可以使用GPIOx BSRR寄存器 对应的标准外设库API接口有 voi
  • 预编译#error的使用

    1 引言 说到预编译 xff0c 大家立刻就能想到 define if ifdef和 ifndef等熟悉的预编译命令 其实 include xff0c 我们通常放在源文件用来包含头文件 xff0c 它也是预编译命令 当然这不是这篇文章的重点
  • STM32 IIC详解

    目录 1 IIC定义 2 IIC协议规范 2 1 SDA和SCL信号 2 2 数据有效性 2 3 开始和结束信号 2 4 字节格式 2 5 从机地址和读写位 3 计算IIC的频率 4 PCF8536 4 1 Acknowledge 4 2
  • STM32 SPI详解

    目录 1 SPI简介 2 SPI特点 2 1 SPI控制方式 2 2 SPI传输方式 2 3 SPI数据交换 2 4 SPI传输模式 3 工作机制 3 1 相关缩写 3 2 CPOL极性 3 3 CPHA相位 3 4 极性和相位图示 3 5
  • STM32移植LWIP

    目录 01 IAR工程移植 02 修改Keil工程 在上篇文章 LWIP初体验 修改ST官方demo 中我们已经在自己的开发板上实现了简单的TCPsever和TCPclient功能 验证完了硬件 xff0c 接下来的工作就是优化代码 xff
  • 树莓派4B交叉编译工具链安装

    目录 一 安装配置环境介绍 xff1a 1 宿主机环境 xff1a 2 树莓派系统 xff1a 二 获取交叉编译工具链 xff1a 1 从GitHub下载 不推荐 xff1a 1 xff09 下载必要的软件和工具 xff1a 2 xff09
  • 一种复用模块原理图的设计方法(Port)

    在看一个参考设计时 xff0c 发现一种通过使用port来进行Pin Map 从而让子模块图保持干净 xff0c 以便重复利用的方法 子模块图如下 xff1a 在该图左边 xff0c 通过Port符号 xff0c 将芯片所有的信号管脚 xf
  • SourceTree 设置内置对比视图 不diff大文件

    有时候会往仓库里添加pdf rar等格式的大文件 xff0c 本来diff也看不出个差别来 xff0c 但在sourceTree里面添加时 xff0c 软件会自动去做diff xff0c 如果这类文档很大 xff0c 就会导致soucetr
  • win10 docker desktop运行故障自诊断

    在docker desktop运行出错时 xff0c 程序里有一个诊断工具用于本地诊断 xff0c 使用管理员权限打开powershell xff0c 然后依次执行如下语句 xff1a cd 34 C Program Files Docke
  • STC 8051单片机扩展SRAM介绍、使用以及配置

    总述 STC8051系列单片机中很多具有内部扩展的数据存储器SRAM xff08 单片机内部的RAM一般都是SRAM xff0c 区别于SDRAM xff0c 下面叙述中的RAM xff0c 即表示SRAM xff09 xff0c 所谓的内