单片机的存储_单片机程序存储器的寻址 - CSDN
精华内容
参与话题
  • 来源不详,看到了贴出来,想学嵌入式,刚入门嵌入式的,在学校没学明白51的朋友应该会受益。 在学校很少用到外扩ROM/RAM的情况,都是用C语言编程,不差空间,代码太大了,买个大ROM的芯片就行了。...

    来源不详,看到了贴出来,想学嵌入式,刚入门嵌入式的,在学校没学明白51的朋友应该会受益。

    在学校很少用到外扩ROM/RAM的情况,都是用C语言编程,不差空间,代码太大了,买个大ROM的芯片就行了。现在工作了,单位是做SoC的,采用了51的IP核,才算对51的代码/数据空间有了清晰的认识。

    MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。

    好,说回MCS-51。

    对于程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0000-0x0FFF的这一部分是否使用呢,这取决于单片机EA引脚的电平值。EA=1时就是使用内部ROM的这一部分,外部ROM的这一部分浪费不用;EA=0时就是使用外部ROM的这一部分,内部ROM浪费不用。从CODE段读取数据要使用汇编的MOVC指令,单片机会根据MOVC指令、EA状态、要读取的地址值,来自动地判断从什么存储器里取数据。

    对于数据存储器,则分为内部数据存储器(IDATA/RAM)和外部数据存储器(XDATA)两个部分,但这两个存储器就不像code存储器那样共享地址空间的了。一般的8051芯片,内部RAM只有128B,从0x00-0x7F,而从0x80-0xFF则是SFR(CPU工作寄存器和各种外设寄存器都在此)的区域。对于8052来说,内部RAM有256B,所以0x80-0xFF是高128B的RAM在使用。可这部分不是SFR专用的吗?是SFR专用,但注意,SFR的访问只能使用“直接寻址方式”(使用特定的汇编指令来实现),区别就在这里。只有通过直接寻址访问的地址才是SFR,否则就是普通的RAM。至于外扩的RAM(XDATA),地址也是从0x0000-0xFFFF的,而且这里的0x0000和内部RAM的0x00是不同的,是完全独立的两个空间。他们的访问方法也是不同的。MCS-51使用MOVX指令,来读写XDATA区。而且,访问XDATA区,是需要DPTR寄存器来辅助的。因为只有DPTR才能装得下十六位的XDATA地址。

    所以说,MCS-51读写IDATA区的速度是最快的,而且访问方法也是最多的。访问XDATA区的速度相对就要慢很多。MCS-51的堆栈要优先开辟在IDATA区中,并且在IDATA区中开辟的堆栈,可以使用栈指针寄存器SP来控制。如果栈实在太大,只能开辟在XDATA区中,那么CPU的SP寄存器就很难借力,只能由我们自己来构造堆栈结构和堆栈指针。既然外部程序空间和数据空间都是0-64K(0x0000-0xFFFF),那么我实际上可以为了省事/方便改写程序等原因,外部的CODE和DATA就可以共用一个可擦写存储器了(比如各种RAM什么可擦可写的)。比如系统有64K的外扩MEMORY,低32K我用作保存CODE,并让单片机在这32K之中读取程序运行,高32K我作为用户数据的保存处,完全可以。只是此时本来完全独立的CODE和DATA空间,因为在硬件芯片上共用了一个MEMORY,所以他们之间就可能互相影响了,程序就能自己改写程序了。比如0x0020处是一个指令,我通过MOVX把0x0020处改写了,那么再利用MOVC把0x0020处读取出来,数据就和原来不一样了。

    容易混淆的症结在于,单片机存储空间是一个逻辑上的概念,是人为划分出来的两个相互独立的空间。而硬件电路上的MEMORY芯片则是现实中的概念,单片机的存储空间最终会落实在电路层面的芯片上,所以逻辑上的存储空间会因为物理上的电路连接而发生重叠。但是在逻辑层面上,这两个空间还是完全独立的。

    附:各类存储空间名称的定义:

    data:固定指前面0x00-0x7f的128个RAM,可以用a寄存器直接读写的,速度最快,生成的代码也最小。

    idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mov ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,我不太会,所以这里不提。

    http://blog.csdn.net/shanzhizi

    展开全文
  • 单片机存储空间

    千次阅读 2018-10-15 17:03:55
    单片机从硬件上来说,只有两种空间: ROM和RAM! 再说一遍,只有ROM和RAM! 再说一遍,只有ROM和RAM! 也就是说,你程序里的所有东西,不是放在RAM里,就是放在ROM里。 ROM的属性是read only(只读),只能用来...

    单片机从硬件上来说,只有两种空间:

    ROM和RAM!

    再说一遍,只有ROM和RAM!

    再说一遍,只有ROM和RAM!

    也就是说,你程序里的所有东西,不是放在RAM里,就是放在ROM里。

    ROM的属性是read only(只读),只能用来读取,无法修改,其实也可以修改,只是需要特殊方法,这里暂时不谈!

    RAM的属性是read+write(可读可写)

    ROM和RAM区域有可能是间断的,分段的。其中RAM主要有数据段+堆+栈+通用寄存器+特殊功能寄存器等

    所以编译器(你可以认为是keil)根据只读或者读写的属性将程序划分为

    1、ROM区(也就是单片机的FLASH区)

    我们都了解,rom是只读的,所以里面的内容也是只读的,这里面包括

    1.1、软件的代码段(code)

    void main(void)
    {
        ;
    } 

    1.2、数据常量(被const修饰的数据常量)就是放在这里的。

    const unsigned int a[100] = 
    {
        1,2....
    };

    1.3、数据段,定义的数据(这个理解起来有点困难,因为涉及运行视图和加载视图

    2、RAM区

    RAM区域读写的,掉电易失的,再说一遍,掉电易失!

    那么问题来了,刚上电复位时,ram区肯定是空的,那么访问全局变量时,数是怎么找到的?

    如果我们仔细看一下ARM启动过程(从上电到main),就是main之前东西,我们就能知道了。这里我们首先要明白两个概念。程序的运行视图和加载视图。

    其中RAM区域主要包含以下内容:

    2.1、数据段(data)

    BSS(未初始化的全局变量+未初始化的静态变量)

    Data初始化的全局变量+初始化的静态变量

    2.2、STATCK(栈)

    (1)、函数传递参数较多时,参数会入栈;

    (2)、中断发生时,用于保存和恢复中断前的现场。

    2.3、HEAP(堆)

    Malloc函数申请的空间(需要了解操作系统内核和链表)

    2.4、SFR(通用寄存器,R1,R2。。。。。R15等)

    (1)传递函数参数(个数较少时,一般为3个)使用

    (2)中间变量使用

    (3)寻址等等(查看汇编的寻址方式等)

    2.5、SFR特殊功能寄存器(AD,UART,PWM等)

    (1)设置芯片工作状态,操作外设。

    展开全文
  • 单片机的各种存储的含义和区别

    千次阅读 2017-09-28 14:09:59
    闲着没事看看看STM32F4各种存储的发现 内部flash好像是FMC的的地址,细看FMC的原理只能从各种存储开始看起了。 先说STM32内部有的: 我用的是F429实际上没有2MB是只有1MB的FLASH FLASH (起始地址 0X08000000...

      闲着没事看看看STM32F4各种存储的发现 内部flash好像是FMC的的地址,细看FMC的原理只能从各种存储开始看起了。

    先说STM32内部有的:


    我用的是F429实际上没有2MB是只有1MB的FLASH

    FLASH (起始地址 0X08000000 大小 1MB)

    实际上就是 RAM存储器 在芯片中植入一个微型电源 可以像ROM一 保证信息不丢失 但由于是RAM 读写的速度快 故叫 闪存。,这个区域就是单片机程序存储的区域。 一般来讲 单片机执行完bootloader之后就根据 BOOT0和BOOT1选择要执行的区域我们一般的模式(把BOOT0拉低进入的就是这段区域,也可以改变boot进入一会介绍的RAM区


    我们一般操作MAIN memory 部分其他区域是系统控制区我也不多解释

    FLASH是只能整块擦除的而且程序是在FLASH 里的不知道程序有多大随便修改FLASH是很容易使程序出问题的

    SRAM Static Random-Access Memory(静态随机存取存储器)


    简单来说就是程序的一些堆栈随机数缓存的地方,简单理解为运存,类比与手机 FLASH ROM是程序软件可以放得空间。SRAM是手机程序使用时占的内存。SRAM的运行很快适合动态存储但掉电会失去数据。

    在KEIL里修改这个也很简单。可以把程序放在SRAM里调试据说是快一点。有兴趣可以去试试。


    再来看芯片手机F4升级的一个很好用的功能就是支持了SDRAM 那SDRAM是什呢

    我们来看看

    SDRAM:Synchronous Dynamic Random Access Memory:

    同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。

    W9825G6KH 32MB这个是正点原子开发版上搭载的一个SDRAM我们看一下他的资料

    4M 4BANK 16bit的一款SDRAM是4*4*16/8,及32M的储存芯片

    看见了这个博主的文章大概 sukhoi27smk 点击打开链接 总结一下SRAM 和SDRAM的区别,因为DRAM是动态随机存储。说以需要不断刷新电路此案呢个保存数据 ,而SRAM 是静态的随机只要不断电数据就不会丢失,由于工艺原因SDRAM内存一般大于SRAM但是SRAM的速度是快于SDRAM的。实际上我都不知道拓展了这些内存运存有什么作用感觉只有做高端系统再才会有用吧。你们也只到=当入门看看吧到时候又提起有点印象。

    PSRAM也是类似SRAM的产品只是牺牲一部分速度扩大内存,降低价格降低功耗的替代产品。不多解释

    再看一下可以外接的NOR FLASH和NAND FLASH 模块

    flash存储器”经常可以与相“NOR存储器”互换使用。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。NOR Flash 的读取和我们常见的 SDRAM 的读取是一样,用户可以直接运行装载在 NOR FLASH 里面的代码,这样可以减少 SRAM 的容量从而节约了成本。 NAND Flash 没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的, 通常是一次读取 512 个字节,采用这种技术的 Flash 比较廉价。用户 不能直接运行 NAND Flash 上的代码,因此好多使用 NAND Flash 的开发板除了使用 NAND Flah 以外,还作上了 一块小的 NOR Flash 来运行启动代码。
    NOR flash是intel公司1988年开发出了NOR flash技术。NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能.

    Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NAND flash结构。其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。

    再来看一下FMC的地址(我这里实际一开始还是不理解为什么F1x和f40x系列FSMC而到F42X,F43X更高版本就有两个。那地址不是冲突掉了。实际不然F42X系列就没有FSMC而是被FMC取代功能更加完善了)


    是0X60000000开头的内部FLASH不是一个位级别啊,问题迎刃而解了。顺便提一句所有FSMC 和FMC配置的外设内存都可以通过内存地址直接调用使用十分方便。

    今天的文件储存笔记就到这里了,过会研究一下文件系统开始学习STM32系统HAL配置了



    展开全文
  • 通过串口采集单片机存储的历史记录,并存入ACCESS数据库,生成小时、日、月报表。
  • 51单片机存储结构

    千次阅读 2008-01-18 16:38:00
    数据存储器是为正在运行的程序提供空间,即RAM,程序存储器为程序的存储提供空间,即ROM,刚开始的单片机一旦写入程序就不能修改,后来出现了紫外线擦除(EPROM)、电擦除(EEPROM)和FlashROM。 数据存储器又分片...

           

           

            首先介绍一些基本概念:

            51单片机存储器有数据存储器,程序存储器。数据存储器是为正在运行的程序提供空间,即RAM,程序存储器为程序的存储提供空间,即ROM,刚开始的单片机一旦写入程序就不能修改,后来出现了紫外线擦除(EPROM)、电擦除(EEPROM)和FlashROM

            数据存储器又分片内数据存储器和片外数据存储器,标准的51单片机的片内数据存储器容量是256字节,地址编码00HFFH,其中高128字节(80HFFH)是SFR区(特殊功能寄存器),低128字节(00H7FH)用户数据存储器,在这个128字节中,00H1FH32个字节分给了4组工作寄存器(R0~R7),20H2FH16字节是位寻址区,30H7FH80字节是用户RAM区,可以随意使用。通过51单片机内部的并行扩展总线,51单片机可以访问最多64K范围的外部数据存储器(注:这个说法是有问题的,看后面),由于内部的AB宽度是16位,所以内部数据存储器寻址能力是64K。

        程序存储器也分为片内和片外,由于片内外的AB宽度是16位,所以寻址能力都是64K。

        但是由于I/O端口和外围设备与数据存储器统一编址,暂用了片外数据存储器的地址空间,所以片外数据存储器寻址范围不足64K。

        前面我们分析了存储结构,发现无论是数据存储器和程序存储器,它们片内外的寻址能力都是64K。那他们是如何编址的呢?答案是:统一编址0000H~FFFFH

        你是不是感到很疑惑?如何做到的?

        首先,片内数据存储器和片外数据存储器,对于同一个地址(假设1111F)CPU是如何区分到那个存储器呢?分析一下指令,如果是MOVX那么是到片外数据存储区,如果是MOV则是到片内数据存储区。

        其次,片内数据存储器和片内程序存储器,他们的控制信号不同,访问片内数据存储器信号是Ld等,访问片内程序存储器的控制信号是Emp等。

          第三,片内程序存储器和片外程序存储器,同“首先”

          第四,片外数据存储器和片外程序存储器,同“其次”

            如何扩展呢?

            我们知道P0口有时分复用功能,既可以作为8位数据总线又可以作为低8位地址总线,我们使用地址锁存器把8位的数据总线和低8位的地址总线分开,这样P0提供低8位的地址总线和P2提供的高8位总线构成了16位的外部地址总线,P0提供了8位外部数据总线,加上控制总线,这样就形成了三总线结构。所有外围芯片都是通过这三总线进行扩展。

            可能有这个疑问:P0口如何时分复用的?

           通过内部CBALE控制信号,下降沿时将P0口输出的数据作为地址信息储存,此时P0作为低8位地址总线,在其他时刻P0作为8位数据总线。与外界的通信除了少部分通过P1,全部通过P0

            我们稍微了解一下51单片机的时序单位……

            晶振提供的频率我们称为振荡频率,假设它的周期为T0,一个T0周期称为一个节拍,用字母P表示,振荡频率经过二分频后我们得到振动频率,它的周期为T1(T1=2T0),一个T1周期称为一个状态,用字母S表示,振荡周期经过6分频我们得到ALE控制信号(注:下面有具体介绍),振荡周期经过4分频我们得到PSEN信号(注:下面有具体分析)。定义12个振荡周期为一个机器周期,那么指令周期是什么?有些指令只需要一个机器周期能执行(确切说是:取指令、译指令、执行指令)完,有些需要几个(不管如何,一般指令周期是机器周期的整数倍,通常情况是1~4倍)。

            我们有必要了解一下外部CB, 先介绍ALE控制信号:

            ALE:高电平有效,是振荡频率的6分频,利用下降沿来控制地址锁存器锁存低8位地址A0~A7。一个周期两次有效,第一次是S1P2~S2P1,第二次是S4P2~S5P1。

            然后介绍一下PSEN控制信号:

            PSEN:低电平有效,是振荡频率的4分频,用于访问外部程序存储器。一个周期两次有效,第一次是S1P2~S2P2,第二次是S4P2~S5P2。

        我们通过一个实例来理解它,假设我们访问外部程序存储器。

        PSEN是和外部存储器的OE端口接的(OE是低电平有效),ALE是接地址锁存器(假设是74HC373)的LE脚(高电平有效)。S1P2时刻,ALE上跳为高电平,74HC373的LE脚有效,74HC373内部8个锁存器打开,到S2P1这个下降沿时刻,P0输出的低8位地址被锁存在锁存器中,此时PSEN仍然为高电平,而P0由原来的低8位地址总线转化为数据总线,等待外部程序存储器输出端的数据输入,直到S2P2这个时刻,PSEN为下降沿,由无效转化为有效,这时P2口的高8位地址和锁存的P0的低8位地址组成16位地址,这个地址就是CPU要访问的外部存储器的地址,从这个地址中找出存储的信息,输出这个信息通过P0这个数据总线到达内部总线,最后到达目的地。

        访问外部数据存储器与之类似,不过控制信号不是PSEN,而是WR和RD。

        WRRD:低电平有效,用于访问外部数据存储器的读写控制,当执行MOVX时,这两个信号自动生成。

        

        尽可能避免错误,如果你发现任何错误请联系我,不胜感激 

    展开全文
  • 单片机存储理解

    千次阅读 2017-11-07 16:50:28
    单片机内部存储分为三块以AVR1280为例,该单片机内部存储有三个部分:1、内存RAM 2、FLASH 3、EEPROM有时候,我们的代码过大,为了避免给RAM造成压力,我们定义数组、变量等可定义存储在EEPROM或者FLASH中,这就给...
  • 嵌入式(十八):单片机存储

    千次阅读 2020-05-29 15:31:58
    1、单片机:计算机系统向“小”和“满足应用需要”方向发展的产物 2、单片机继续在技术支持下向“小而强”和“面向应用需要”方向发展,形成各种各样的的单片机系统 3、单片机小而强对应于嵌入式控制为主(MCU类)、...
  • 单片机存储结构

    千次阅读 2011-05-31 12:20:00
    单片机存储结构
  • 介绍一种应用于单片机测试系统的链式存储结构,其特点在于采用数据结构的存储方式,并结合有效的存储管理方法对系统的存储空间进行管理和分配,从而在普通的单片机测试系统中实现了对大量测试结果的抽象化数据管理,...
  • 51单片机存储原理

    2018-04-27 10:08:42
     对于电子设计类的学生来说,其实在学校很难通过实例来理解51单片机存储原理。因为学校的课程很少用到外扩ROM/RAM,大多会采用C语言来进行语言编程。很多人是在工作后才实际接触到51单片机的IP核,才对存储...
  • 主控MCU:一个M0核的单片机; 由于需要存储的数据有点大(大概130MB)。为了能够将数据上传到PC机,我计划将该设备的存储模块做成一个类似于U盘的东西------只要插上PC机就可以识别,并能够把里面数据文件拷贝出来。...
  • 51 单片机数据存储

    2019-09-09 11:07:41
    从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的...
  • 51单片机-存储

    2017-10-10 15:15:36
    8051是传统的8位单片机,一般为256B 数据存储器RAM,4k程序存储器ROM (8052有384bytes的RAM,8K的ROM) 在51系列中可定义的数据类型有data,idata,xdata,pdata:   data:指芯片内核中地址0x00-0x7F的128个字节RAM区域...
  • 请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1解答:int checkCPU( ) { { union w { int a; char b; } c; c.a = 1; ...
  • 51单片机存储

    2014-04-15 11:20:05
    data:直接寻址的片内RAM...idata:单片机间接访问的片内RAM区,允许访问全部片内RAM pdata:Ri间接访问的片外RAM的低256B(00H~FFH) xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM(0000H~FFFFH)
  • 51单片机的代码存储问题

    千次阅读 2017-11-27 21:25:06
    数组定义 51单片机 Code
  • 特点是掉电不丢失数据,在单片机中主要用来存储代码和常量等内容。(二)RAM(Random Access Memory)随机存储器,可读可写,特点是掉电会丢失数据。RAM又分为SRAM(Static RAM)和DRAM(Dynamic RAM),SRAM是读写速度...
  • 在开发单片机中,通常用到与网络通信,在接收通信协议的时候,避免不了使用typedef定义结构体。...这时,可以发现用typedef定义的结构体时,单片机存储空间没有变化 3、该结构体定义全局变量时,...
  • 单片机的内存分配(变量的存储位置)详解

    千次阅读 多人点赞 2019-09-29 10:57:39
    对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM、RAM启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。 通常,...
  • 单片机存储器结构

    千次阅读 2018-09-08 10:27:33
    单片机内部存储结构分析   我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,然后取下单片机单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后...
1 2 3 4 5 ... 20
收藏数 26,285
精华内容 10,514
关键字:

单片机的存储