ROM或者闪存,叫程序存储区,写的程序是存在这里面的,上电后从这里面执行。程序存储区也分为片内和片外,闪存或者罗不管是片内还是片外的,只能用来定义常量,是用代码来修饰。也就是说,用代码来修饰的东西,在程序运行过程中,不能修改。
51-RAM
- 内部RAM的低128位(00-7F),对应Ç语言就是数据;直接或间接寻址内部RAM的0×20~值为值为0x2F是一块可位寻址区,对应于Ç语言的BDATA。
- 内部RAM的高128位(80-FF),对应Ç语言就是IDATA;间接寻址。
- IDATA的范围是256位(00-FF),可以看出IDATA是包含数据(00-7F)的,区别只是寻址方式不同,同时在80〜FF,这块片内RAM通常用于中断和函数调用的堆栈,一般不区使用的的.idata是用类似ç中的指针方式访问的。
- 特殊功能寄存器(SFR)
- 外部RAM 64K(0000-FFFF)。前256个算是一页,这一页比较特殊,是用pdata来修饰的,当然,也可以用xdata来修饰。除了第一页的256个以外的其他65280个空间,只能用XDATA来修饰;
向地址80H地址写一个数值,内部的高128位RAM?还是SFR?是用指令。
直接寻址 | 访问的就是SFR |
R0或者R1间接寻址 | 内部高128位RAM |
DPTR或者是R0,R1间接寻址且配合的是MOVX指令 | 访问外部外部RAM中地址 |
存储类型与存储区关系
- data --->可寻址片内ram
- bdata --->可位寻址的片内ram
- idata --->可寻址片内ram,允许访问全部内部ram
- pdata --->分页寻址片外ram(MOVX @ R0)(256 BYTE /页)
- xdata --->可寻址片外ram(64k地址范围FFFFH)
- code --->程序存储区(64k地址范围),对应MOVC @DPTR
8051 CPU核心是一个单周期8051兼容的核心。它有三个不同的内存访问总线(SFR,DATA和CODE / XDATA),具有对SFR,数据和主SRAM的单周期访问。它还包括一个调试接口和一个18输入的扩展中断单元.CPU和内存的详细功能将在第2章中介绍。 - - - - - - - - - - - - - - - - - - 内存仲裁程序是系统的核心,因为它通过SFR总线将CPU和DMA控制器与物理内存和所有外设连接起来。仲裁内存器有四个内存访问点,其中的访问可以映射到三个物理内存中的一个:RAM,闪存和XREG / SFR寄存器。内存仲裁程序负责执行对同一物理内存的同时内存访问之间的仲裁和排序。 - - - - - - - - - - - - - - - - - - 这是低功耗应用程序的一个重要特性。 - - - - - - - - - - - - - - - - - - 32,64,96,128或256 kb的闪存块为设备提供了在线可编程的非易失性程序内存,并映射到CODE和XDATA内存空间。除了保存程序代码和常量之外,非易失性内存还允许应用程序保存必须保存的数据,以便在重新启动设备后可用例如,使用这个特性可以使用保存的特定于网络的数据,从而避免完全启动和网络查找-连接过程的需要。 |
8051 CPU架构有四个不同的RAM内存空间.8051有独立的内存空间用于程序内存和数据内存 .8051内存空间如下(详见2.2.1节和2.2.2节): 1,CODE。用于程序内存的只读存储器空间。这个内存空间的地址是64 KB。 2,DATA。可由单周期CPU直接指令或间接访问的读写数据内存空间。这个内存空间的地址是256字节。数据内存空间的下128字节可以直接或间接寻址,而上128字节只能间接寻址。 3,XDATA。读写数据内存空间,通常需要4-5个CPU指令周期来访问。这个内存空间的地址是64 KB【0-FFFF】。对XDATA内存的访问也比数据访问慢,因为CODE和XDATA内存空间在CPU核心上共享一个公共总线,因此不能与XDATA访问并行执行来自代码的指令预取。 4,SFR。读写一种寄存器内存空间,可由单个CPU指令直接访问。这个内存空间由128字节组成。对于地址可被8整除的SFR寄存器,每个位也可以单独寻址。 这四个不同的内存空间在8051架构中是不同的,但是在设备中有部分重叠,以简化DMA传输和硬件调试器操作。 不同的内存空间如何映射到三个物理内存(闪存程序存储器,SRAM和存储器映射寄存器)在2.2.1和2.2.2节中进行了描述。 |
内存映射内存映射与标准8051内存映射在两个重要方面不同,如下所述。 首先,为了允许DMA控制器访问所有物理内存,从而允许不同8051内存空间之间的DMA传输,将SFR和DATA内存空间的部分映射到XDATA内存空间(见图2-1)。 其次,可以使用两种替代方案进行代码内存空间映射。 如图1所示,第一种方案是标准8051映射,其中只有程序内存(即闪存)映射到CODE内存空间。该映射是设备重置后的默认映射,如图2-2所示。 2,第二种方案用于从SRAM执行代码。在这种模式下,SRAM映射到0x8000到(0x8000 + SRAM_SIZE - 1)的区域,映射如图2-3所示。从SRAM执行代码可以提高性能并降低功耗。 XDATA的上32 KB是一个只读区域,称为XBANK(参见图2-1)。任何可用的32 KB闪存blonk都可以在这里映射。这使得软件可以访问整个闪存。这个区域通常用来存储额外的常量数据。有关所有8051内存空间映射的详细信息在2.2.2节中给出。 图2-1到图2-3给出了显示不同物理内存如何映射到CPU内存空间的内存映射图。可用闪存库的数量取决于闪存大小选项。 |
128byte SFR地址---> xdata [7080-70FF];
256byte DATA地址---> xdata [0000-1FFF];
CPU的内存空间: XDATA内存空间.XDATA内存映射如图2-1所示。 1,SRAM映射到地址范围0x0000到(SRAM_SIZE - 1)。若SRAM_SIZE = 8 kb【0x0000-0x1FFF】 |
iamgeB | iamgeA | ||||||||||
126976 | 126976 | BIM工程代码 | 0x0000-0x07FF | 0 | 0 | 0 | 0 | ||||
7 | CODE_BEG | 0x0830 | 800 | 1 | 1 | ||||||
1000 | 2 | 2 | |||||||||
1800 | 3 | 3 | |||||||||
2000 | 4 | 4 | |||||||||
2800 | 5 | 5 | |||||||||
3000 | 6 | 6 | |||||||||
CODE_END | 0x3FFF | 3800 | 7 | 7 | |||||||
8 | CODE_BEG | 0x4030 | 4000 | 8 | 8 | ||||||
4800 | 9 | 9 | |||||||||
5000 | 10 | 10 | |||||||||
5800 | 11 | 11 | |||||||||
6000 | 12 | 12 | |||||||||
6800 | 13 | 13 | |||||||||
7000 | 14 | 14 | |||||||||
CODE_END | 0x7FFF | 7800 | 15 | 15 | |||||||
16 | BANK1_BEG | 0x18000 | 18000 | 16 | 0 | 1 | 10000 | 8000 | |||
18800 | 17 | 1 | |||||||||
19000 | 18 | 2 | |||||||||
19800 | 19 | 3 | |||||||||
1A000 | 20 | 4 | |||||||||
1A800 | 21 | 5 | |||||||||
1B000 | 22 | 6 | |||||||||
1B800 | 23 | 7 | |||||||||
1C000 | 24 | 8 | |||||||||
1C800 | 25 | 9 | |||||||||
1D000 | 26 | 10 | |||||||||
1D800 | 27 | 11 | |||||||||
1E000 | 28 | 12 | |||||||||
1E800 | 29 | 13 | |||||||||
1F000 | 30 | 14 | |||||||||
BANK1_BEG | 0x1F000 | 1F800 | 31 | 15 | |||||||
16 | BANK2_BEG | 0x28000 | 28000 | 32 | 0 | 2 | 20000 | 8000 | |||
28800 | 33 | 1 | |||||||||
29000 | 34 | 2 | |||||||||
29800 | 35 | 3 | |||||||||
2A000 | 36 | 4 | |||||||||
2A800 | 37 | 5 | |||||||||
2B000 | 38 | 6 | |||||||||
2B800 | 39 | 7 | |||||||||
2C000 | 40 | 8 | |||||||||
2C800 | 41 | 9 | |||||||||
2D000 | 42 | 10 | |||||||||
2D800 | 43 | 11 | |||||||||
2E000 | 44 | 12 | |||||||||
2E800 | 45 | 13 | |||||||||
2F000 | 46 | 14 | |||||||||
BANK2_BEG | 0x2F000 | 2F800 | 47 | 15 | |||||||
16 | BANK3_BEG | 0x38000 | 38000 | 48 | 0 | 3 | 30000 | 8000 | |||
38800 | 49 | 1 | |||||||||
39000 | 50 | 2 | |||||||||
39800 | 51 | 3 | |||||||||
3A000 | 52 | 4 | |||||||||
3A800 | 53 | 5 | |||||||||
3B000 | 54 | 6 | |||||||||
3B800 | 55 | 7 | |||||||||
3C000 | 56 | 8 | |||||||||
3C800 | 57 | 9 | |||||||||
3D000 | 58 | 10 | |||||||||
3D800 | 59 | 11 | |||||||||
3E000 | 60 | 12 | |||||||||
3E800 | 61 | 13 | |||||||||
3F000 | 62 | 14 | |||||||||
BANK3_BEG | 0x3F000 | 3F800 | 63 | 15 | |||||||
6 | BANK4_BEG | 0x48000 | 48000 | 64 | 0 | 4 | 40000 | 8000 | BANK4用作存储常量数据段映射到代码段中 | ||
48800 | 65 | 1 | |||||||||
49000 | 66 | 2 | |||||||||
49800 | 67 | 3 | |||||||||
4A000 | 68 | 4 | |||||||||
BANK4_END | 0x4AFFF | 4A800 | 69 | 5 | |||||||
10 | BANK4_BEG | 0x4B000 | 4B000 | 70 | 6 | ||||||
4B800 | 71 | 7 | |||||||||
4C000 | 72 | 8 | |||||||||
4C800 | 73 | 9 | |||||||||
4D000 | 74 | 10 | |||||||||
4D800 | 75 | 11 | |||||||||
4E000 | 76 | 12 | |||||||||
4E800 | 77 | 13 | |||||||||
4F000 | 78 | 14 | |||||||||
BANK4_END | 0x4FFFF | 4F800 | 79 | 15 | |||||||
16 | BANK5_BEG | 0x58000 | 58000 | 80 | 0 | 5 | 50000 | 8000 | BANK5用作存储常量数据段映射到代码段中;BANK5数据会传输到XDATA的区域中去 | ||
58800 | 81 | 1 | |||||||||
59000 | 82 | 2 | |||||||||
59800 | 83 | 3 | |||||||||
5A000 | 84 | 4 | |||||||||
5A800 | 85 | 5 | |||||||||
5B000 | 86 | 6 | |||||||||
5B800 | 87 | 7 | |||||||||
5C000 | 88 | 8 | |||||||||
5C800 | 89 | 9 | |||||||||
5D000 | 90 | 10 | |||||||||
5D800 | 91 | 11 | |||||||||
5E000 | 92 | 12 | |||||||||
5E800 | 93 | 13 | |||||||||
5F000 | 94 | 14 | |||||||||
BANK5_END | 0x5FFFF | 5F800 | 95 | 15 | |||||||
16 | BANK6_BEG | 0x68000 | 68000 | 96 | 0 | 6 | 60000 | 8000 | |||
68800 | 97 | 1 | |||||||||
69000 | 98 | 2 | |||||||||
69800 | 99 | 3 | |||||||||
6A000 | 100 | 4 | |||||||||
6A800 | 101 | 5 | |||||||||
6B000 | 102 | 6 | |||||||||
6B800 | 103 | 7 | |||||||||
6C000 | 104 | 8 | |||||||||
6C800 | 105 | 9 | |||||||||
6D000 | 106 | 10 | |||||||||
6D800 | 107 | 11 | |||||||||
6E000 | 108 | 12 | |||||||||
6E800 | 109 | 13 | |||||||||
6F000 | 110 | 14 | |||||||||
BANK6_END | 0x6FFFF | 6F800 | 111 | 15 | |||||||
13 | BANK7_BEG | 0x78000 | 78000 | 112 | 0 | 7 | 70000 | 8000 | |||
78800 | 113 | 1 | |||||||||
79000 | 114 | 2 | |||||||||
79800 | 115 | 3 | |||||||||
7A000 | 116 | 4 | |||||||||
7A800 | 117 | 5 | |||||||||
7B000 | 118 | 6 | |||||||||
7B800 | 119 | 7 | |||||||||
7C000 | 120 | 8 | |||||||||
7C800 | 121 | 9 | |||||||||
7D000 | 122 | 10 | |||||||||
7D800 | 123 | 11 | |||||||||
BANK7_END | 0x7E7FF | 7E000 | 124 | 12 | |||||||
NV1 | 7E800 | 125 | 13 | ||||||||
NV2 | 7F000 | 126 | 14 | ||||||||
位锁页锁位页面 | 7F800 | 127 | 15 | ||||||||
78000 | 128 | ||||||||||