精华内容
下载资源
问答
  • 以字节组织的存储器
    千次阅读
    2019-09-08 13:03:07

    作为一个整体一次存放或取出内存储器的数据称为“存储字” 在现代计算机系统中,

    特别是在微机系统中,内存储器一般都以字节为单元编址,即一个存储地址对应一个8位字节单元。

    这样一个16/32位存储字就占了两个/四个连续的8位存储单元,其中最低地址为字地址。

    “小数端”(little endian)存放

    小数端存放即低地址对应存放低位字节数据。   例如,IntelX86处理器的32位存储字12345678H存放在内存中的情况如图(a)所示,占有24300H  24303H四个地址的字节单元,其中最低字节78H存放在24300H中。 

     

    “大数端(big endian)存放

    在Motorola的680X0系统中,32位存储字12345678H存放在内存中的情况如图(b)所示,最高8位信息12H存放在最低地址24300H,称为“大数端(big endian)存放。32位存储字的地址24300H指向最高8位的存储单元。

    更多相关内容
  • 在ADUC845内部的基本结构中,有两块存储器:RAM和快闪存储器(FLASH),每个存储空间都具有连续的字节地址空间,其地址都是从0开始至最大存储范围的字节地址,即它们的地址是全部重叠的。利用不同的指令寻址方式来...
  • 存储器带宽的追求成为系统设计最突出的主题。SoC设计人员无论是使用ASIC还是FPGA技术,其思考的核心都是必须规划、设计并实现存储器。系统设计人员必须清楚的理解存储器数据流模式,以及芯片设计人员建立的端口。...
  • 微机原理与接口技术 第二章 8086系统结构 第3小节 8086存储器组织

    2.3 8086存储器组织

    一、存储器地址的分段

    1、存储器地址的分段

     

     

    8086有20条地址总线,直接寻址能力为220=1M字节

    矛盾:存储器地址空间1MB,20bit地址线;内部各寄存器和数据总线均为16bit。  

    解决方法:将整个存储器分为若干个逻辑段,每段内地址16bit,即最多地址空间64KB。允许各逻辑段在整个存储空间浮动,段与段之间可以是连续的,如左图。也可以是分开的或重叠

    存储器地址分段: 

        IBM PC机对段的起始地址有限制,即段不能从任意地址开始:约定段的起始地址低4位必须是0(或能被16整除)

        段内地址16位,每个段 £64KB根据需要确定段大小,可以是在64K范围内的任意字节数。

    两个定义:

     段地址(段基址):一个段的起始地址的高16位。 1MB空间可有216个段地址。

     段内偏移地址(有效地址EA):相对于段起始地址的偏移量,16位。所以每个段的大小最大可达64KB。

    结论:存储器段与段之间可互相覆盖。

    根据定义1MB空间可有216个段地址,相邻两段地址相距16个存储单元。

       16进制表示的地址中,最低位为0H(即20位地址的低4位为0000B)。段首地址为:

       段地址                                                        0000  0H

    0001  0H

    4123  0H

    4124  0H

    FFFE  0H

                                                                          FFFF  0H

      程序执行前,分别对相应的段寄存器CS,DS,SS,ES置“段基值”。

       2.   20位物理地址的形成

    定义:

    逻辑地址:在程序中使用的地址。对给定的任一存储单元,有两部分逻辑地址(均为16位的无符号二进制数):

    段基址(段地址)——CS,DS,SS,ES决定。

    段内偏移量(段内有效地址)——该单元相对于段基址的距离。

    物理地址:存储器的实际地址(20位)范围从00000H~FFFFFH,CPU访问存储器时由地址总线发出的地址。

      例     8000:0100H——80100H

    * 每个存储单元只有唯一的物理地址。但可由不同的段地址和不同的偏移地址组成。

     物理地址计算方法:

     把段地址左移4位再加上偏移地址值形成物理地址。

      物理地址= 16d*段地址+偏移地址。

    例:已知CS=2000H,IP=003AH,求物理地址?

    20000H+003AH    =  2003AH

     归纳:

    注意:

      (1)由操作系统负责各段在存储器中的分配

      一般情况,各段在存储器中的分配是由操作系统负责。每个段可以独立地占用64K存储区。也可以允许重迭, 但使用时要防止冲突。

      (2)在程序的首部设定各段寄存器的值

      程序员要在程序的首部设定各段寄存器的值。

    (38086CPUIBMPC系统中,存储器首尾地址的用途固定,用户不能占用。

       00000H~003FFH共1K内存单元用于存放中断向量。

       FFFF0H~FFFFFH是存储器底部的16个单元。

        系统加电复位时,会自动转到FFFF0H单元执行,

        在FFFF0H处存放一条无条件转移指令,转向系统初始化程序。

    二、8086存储器的分体结构

      1.  问题的提出:  

        8位机(MCS-51、8088)的存储器地址空间和数据存储格式以字节(8bit)为单位组织存储器地址空间,访问一次存储器,获得一个字节的数据。

        而8086CPU的数据总线为16位,CPU除了可以对一个字节寻址外,还必须能进行一个字的读写。即:如何组织数据存储格式使CPU访问一次存储器,获得一个字的数据?

    l 计算机对内存的读/写操作
    CPU 发出地址信号,选中相应的内存单元。

       读操作CPU发出内存读控制信号,内存单元内容经数据总线送入CPU。

       写操作CPU发出内存写控制信号,CPU将欲写的内容经数据总线写入内存单元。

     8086存储单元地址:按照字节编址

     8086CPU能寻址1MB的存储单元,每个存储单元存放一字节信息并用唯一的一个地址码标识

    字(16位)数据的存放:

      一个字存入存储器占有相继的二个单元,低位字节存入低地址,高位字节存入高地址。

     字单元的地址采用它的低地址来表示。例:

    字单元:  (00004H)=1234H,

    字节单元:(00004H)=34H

    * 同一地址既可以看作字节单元地址,又可看作字单元地址,需要根据使用情况确定。

    * 字单元地址:可以是偶数也可以是奇数。

    2. 8086系统的存储器结构

    (1)将1M的存储空间分成两个存储体:偶地址和奇地址存储体。

     (2)将数据总线的低8位与偶地址存储体数据线相连,数据总线的高8位与奇地址存储体数据线相连。

    (3)用地址线A0BHE信号选择存储体。

     

     如何利用8086CPU16位数据总线,完成字数据的读/写操作

    (a)  操作数存放在偶地址开始两个存储单元或两I/O端口

     此时可在一个总线周期内完成16位数据传送。

    (b)操作数存放在奇地址开始两个存储单元或两个 I/O端口

        操作数存放在奇地址开始两个存储单元或两个I/O端口中进行数据传输,8086需要二个总线周期。

    字的地址为偶地址——对准存放,或称规则字

    字的地址为奇地址——未对准好的非规则字。

    3. 8086I/O端口

      8086系统和外部设备之间都是由I/O接口电路来联系的, I/O接口内部通常有一个或多个I/O端口。系统给每个端口分配一个地址,称为端口地址

        I/O接口内部通常有一个或多个寄存器,用以存放各种信息,称I/O寄存器或I/O端口。根据存放内容的不同可分为:状态端口,数据端口,控制端口

    CPU I/O 端口的读/写操作 (与 内存的读/写操作相类似)
    • CPU发出地址信号,选中相应的I/O端口。
    • ­ 若是读操作CPU发出I/O端口读控制信号,被选中的I/O端口将其内容经数据总线送入CPU。
    • 若是写操作CPU发出I/O端口写控制信号,CPU将欲写的内容经数据总线,写入被选中的I/O端口中。(若是没有选中则以三态门接口断开)

    8086CPU利用地址总线的低16位作为对8位I/O端口的寻址线,最多可访问65536(64KB)个端口

    ----端口地址不需要分段管理(端口不是逻辑地址)

      当8位I/O设备连在数据总线低8位上时,则所有端口地址都将是偶数地址(A0=0);若连在数据总线高8位上,那么所有端口地址都将是奇数地址(A0=1)。

    ----端口访问仍存在分体问题

      IBM-PC系统只使用了A9~A010条地址线作为I/O端口的寻址线,故最多可寻址1024(1KB)个端口。

    存储器需要分段分体

    I/O不需要分段需要分体

    三、堆栈的概念

    堆栈是利用RAM区中某一指定区域(由用户规定),用来暂存数据或地址的存储区。 堆栈段是由段定义语句在内存中定义的一个段,段基址由SS指定。

     堆栈存取数据的原则是“先进后出”,存取数据的方法是压入(PUSH)和弹出(POP)。

    栈底——固定的最高地址。

    栈顶——栈顶不断改变,是堆栈区的最低地址,用堆栈指针SP指示

    执行一条PUSH指令, SP=(SP)-2,向堆栈压入16bit数据。

    执行一条POP指令,从堆栈弹出16bit数据,SP=(SP)+2。

     

    展开全文
  • 选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将...

    说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。
    自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。
    FLASH分类
    根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。

    FLASH的页面
    STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产品每页2KB。页面典型的用途就是用于按页擦除FLASH。从这点来看,页面有点像通用FLASH的扇区。

    STM32产品的分类
    STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。
    小容量产品主存储块1-32KB, 每页1KB。系统存储器2KB。
    中容量产品主存储块64-128KB, 每页1KB。系统存储器2KB。
    大容量产品主存储块256KB以上, 每页2KB。系统存储器2KB。
    互联型产品主存储块256KB以上, 每页2KB。系统存储器18KB。
    对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:
    STM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。
    互联型产品与其它三类的不同之处就是BootLoader的不同,小中大容量产品的BootLoader只有2KB,只能通过USART1进行ISP,而互联型产品的BootLoader有18KB,能通过USAT1、4、CAN等多种方式进行ISP。小空量产品、中容量产品的BootLoader与大容量产品相同。

    关于ISP与IAP
    ISP(In System Programming)在系统编程,是指直接在目标电路板上对芯片进行编程,一般需要一个自举程序(BootLoader)来执行。ISP也有叫ICP(In Circuit Programming)、在电路编程、在线编程。 IAP(In Application Programming)在应用中编程,是指最终产品出厂后,由最终用户在使用中对用户程序部分进行编程,实现在线升级。IAP要求将程序分成两部分:引导程序、用户程序。引导程序总是不变的。IAP也有叫在程序中编程。 ISP与IAP的区别在于,ISP一般是对芯片整片重新编程,用的是芯片厂的自举程序。而IAP只是更新程序的一部分,用的是电器厂开发的IAP引导程序。综合来看,ISP受到的限制更多,而IAP由于是自己开发的程序,更换程序的时候更容易操作。

    FPEC
    FPEC(FLASH Program/Erase controller 闪存编程/擦除控制器),STM32通过FPEC来擦除和编程FLASH。FPEC使用7个寄存器来操作闪存:

    FPEC键寄存器(FLASH_KEYR) 写入键值解锁。
    选项字节键寄存器(FLASH_OPTKEYR) 写入键值解锁选项字节操作。
    闪存控制寄存器(FLASH_CR) 选择并启动闪存操作。
    闪存状态寄存器(FLASH_SR) 查询闪存操作状态。
    闪存地址寄存器(FLASH_AR) 存储闪存操作地址。
    选项字节寄存器(FLASH_OBR) 选项字节中主要数据的映象。
    写保护寄存器(FLASH_WRPR) 选项字节中写保护字节的映象。

    键值
    为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值:
    RDPRT键 = 0x000000A5 用于解除读保护
    KEY1 = 0x45670123 用于解除闪存锁
    KEY2 = 0xCDEF89AB 用于解除闪存锁

    闪存锁
    在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。
    当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对
    FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。
    复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。

    主存储块的擦除
    主存储块可以按页擦除,也可以整片擦除。

    页擦除
    主存储块的任何一页都可以通过FPEC的页擦除功能擦除。 建议使用以下步骤进行页擦除:
    1.检查FLASH_SR寄存器的BSY位。以确认没有其他正在进行的闪存操作。必须等待BSY位为0,才能继续操作。
    2.设置FLASH_CR寄存器的PER位为1。选择页擦除操作。
    3.设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页。FLASH_AR的值在哪一页范围内,就表示要擦除哪一页。
    4.设置FLASH_CR寄存器的STRT位为1,启动擦除操作。
    5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
    6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
    7.读出被擦除的页并做验证。擦完后所有数据位都为1。

    整片擦除
    整片擦除功能擦除整个主存储块,信息块不受此操作影响。 建议使用以下步骤进行整片擦除:
    1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。
    2.设置FLASH_CR寄存器的MER位为1。选择整片擦除操作。
    3.设置FLASH_CR寄存器的STRT位为1。启动整片擦除操作。
    4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
    5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
    6.读出所有页并做验证。擦完后所有数据位都为1。

    主存储块的编程
    对主存储块编程每次可以写入16位。当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。 建议使用如下步骤对主存储块进行编:
    1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。
    2.设置FLASH_CR寄存器的PG位为1。选择编程操作。
    3.在指定的地址写入要编程的半字。直接用指针写。
    4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
    5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
    6.读出写入的地址并验证数据。

    关于主存储块擦除编程操作的一些疑问
    1. 为什么每次都要检查BSY位是否为0?
    因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。
    2. 如果没有擦除就进行编程,会出现什么结果?
    STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。
    3. 为什么操作后要读出数据并验证?
    STM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功。所以,保险起见,操作后都要读出所有数据检查。
    4. 等待BSY位为1的时间以多少为合适?
    请参考STM32固件库中的数据。
    5. FLASH编程手册上说进行闪存操作(擦除或编程)时,必须打开内部的RC振荡器(HSI),是不是一定要用HIS进行闪存的擦除及编程操作?
    对于这点,我的理解是,进行闪存操作时,必须要保证HIS没有被关闭,但是操作时的系统仍然可以是HSE时钟。STM32复位后,HIS默认是开的,只要你不为了低功耗去主动关闭它,则用什么时钟都可以进行闪存操作的。我所编的程序也验证了这一点。

    选项字节
    选项字节用于存储芯片使用者对芯片的配置信息。
    目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下:

    RDP 字节0。读保护字节,存储对主存储块的读保护设置。
    USER 字节2。用户字节,配置看门狗、停机、待机。
    Data0 字节4。数据字节0,由芯片使用者自由使用。
    Data1 字节6。数据字节1,由芯片使用者自由使用。
    WRP0 字节8。写保护字节0,存储对主存储块的写保护设置。
    WRP1 字节10。写保护字节1,存储对主存储块的写保护设置。
    WRP2 字节12。写保护字节2,存储对主存储块的写保护设置。
    WRP3 字节14。写保护字节3,存储对主存储块的写保护设置。

    选项字节写使能
    在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。

    选项字节擦除
    建议使用如下步骤对选项字节进行擦除:
    1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。
    2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。
    3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。
    4.设置FLASH_CR寄存器的STRT位为1。
    5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
    6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
    7.读出选项字节并验证数据。
    由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。

    选项字节编程
    建议使用如下步骤对选项字节进行编程:
    1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。
    2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。
    3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。
    4.写入要编程的半字到指定的地址。启动编程操作。
    5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
    6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
    7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。

    主存储块的保护
    可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。
    写保护用于保护数据不被非法改写,增强程序的健壮性。

    读保护
    主存储块启动读保护后,简单的说具有以下特性:
    1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。
    2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。
    3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。
    只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。

    写保护
    STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。

    选项字节与它的寄存器映象
    我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?
    选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。 有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。

    关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)
    1.选项字节编程一节中:
    对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程
    实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。 2.对读保护的描述中:
    对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。

    看了半天,原来只要几句就可以解决,当然是不考虑其他功能,只是简单的读写操作。
    其中写操作如下:
    FLASH_Unlock(); //解锁FLASH编程擦除控制器
    FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
    /*********************************************************************************
    // FLASH_FLAG_BSY FLASH忙标志位
    // FLASH_FLAG_EOP FLASH操作结束标志位
    // FLASH_FLAG_PGERR FLASH编写错误标志位
    // FLASH_FLAG_WRPRTERR FLASH页面写保护错误标净
    **********************************************************************************/
    FLASH_ErasePage(FLASH_START_ADDR); //擦除指定地址页
    FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开始写
    FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
    FLASH_Lock(); //锁定FLASH编程擦除控制器

    从上面可以看出基本顺序是:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。其中FLASH_START_ADDR是宏定义的0x8000000+2048255,0x8000000是Flash的起始地址,2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。addr2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,也就是说一个字节的数据也会占用两个字节地址。

    读操作如下:
    u16 value;
    value = (u16)(FLASH_START_ADDR+(addr*2));//从指定页的addr地址开始读Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目Value
    电脑$1600
    手机$12
    导管$1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列第二列第三列
    第一列文本居中第二列文本居右第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPEASCIIHTML
    Single backticks'Isn't this fun?'‘Isn’t this fun?’
    Quotes"Isn't this fun?"“Isn’t this fun?”
    Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to- HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。1

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

    Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. 注脚的解释 ↩︎

    展开全文
  • 8086存储器组织和IO组织 奇偶分体

    千次阅读 多人点赞 2020-03-30 21:00:46
    8086的存储器组织 存储器的基本存储单位是字节,每个字节用唯一的地址码表示。 若存放的信息是8位的字节数据,将按顺序存放; 若存放的信息是16位的字数据,则将字的高位字节放在高地址中,低位字节放在低地址中。 ...

    8086的存储器组织

    存储器的基本存储单位是字节,每个字节用唯一的地址码表示。

    • 若存放的信息是8位的字节数据,将按顺序存放;
    • 若存放的信息是16位的字数据,则将字的高位字节放在高地址中,低位字节放在低地址中(8086属于小端处理器);
    • 若存放的信息是32位的双字指针数据,其低位地址中的字数据是偏移量,高位地址中的字数据是段基址。

    存储器引脚

    在这里插入图片描述

    地址线 A0- An地址输入用来选择存储器件中的一个存储单元。
    数据线 D0-Dn通过数据线输入数据存储,也能够提取数据。
    选择线 CS*(片选)选择线上信号为逻辑0时,存储器件执行一次读或写操作。如果是逻辑1,则存储器件不能进行读或写操作(处于禁用状态)
    控制线 OE* WE*OE*(Output Enable),WE*(Write Enable)

    字数据的存取——奇偶分体

    为了能对存储器进行字节寻址和整字(16位)的读写,把存储器分成容量相等的两个字节存储体——“偶存储体”和“奇存储体”,所谓奇偶分体。
    在这里插入图片描述
    如图所示,相邻的地址位于不同的存储体中,属于低位多体交叉存储器

    • 偶存储体同DB的低8位D7-D0相连
    • 奇存储体同DB的高8位D15-D8相连
    • AB的An-A1同两个存储体中的地址线An-1-A0
    • 最低位地址线A0和BHE*用来选择存储体(根据半字边界对齐的要求,最低位默认为0,A0可移做他用)

    这样可以选择:

    • 传送两个字节(整字数据)
    • 传送奇地址的高位字节
    • 传送偶地址的低位字节

    存放字数据时:

    • 低地址为偶数,高地址为奇数存放的字被称为规则字
    • 低地址为奇数,高地址为偶数存放的字被称为非规则字

    读取规则字时,D7-D0传输偶存储体中的低8位数据,D15-D8传输奇存储体中的高8位数据。

    读取非规则字时,因为A0地址线用作了奇偶体选择,所以存储器收到的地址都是偶数,不能从起始的奇数地址开始读。所以读取非规则字时,需要分开读取。

    第一个总线周期D15-D8从奇地址单元读取数据高8位
    第二个总线周期D7-D0从偶地址单元读取数据的低8位。

    对于8086,非规则字的读取需要两个总线周期,规则字的读取只需要一个总线周期
    对于8088,非规则字和规则字都要用两个总线周期(8088仅有8条数据线,16位的数据一定要读两遍)。

    微机原理的问题:为什么8086存取一个非规则字比存取一个规则字多用一个总线周期?

    分段管理

    8086有20根地址线,拥有220=1M字节的内存空间,但8086的内部寄存器是16位的,只能直接寻址64KB的地址空间(216字节),为此16位微处理器引入分段概念。
    8086把1MB空间分为若干逻辑段,每个段最多可以包含64KB的连续存储单元。
    段和段之间可以是连续的,分开的,部分重叠的或完全重叠的。
    每个段的起始地址值又叫段基址(Base Address),段区的分配工作由操作系统完成,也允许程序员手动指定。

    物理地址和逻辑地址

    物理地址:
    CPU和存储器进行数据交换时使用的地址,是唯一能够表示存储空间每个字节单元的地址。用20位二进制数或5位十六进制数表示。
    逻辑地址:
    由两部分组成

    • 段基址
    • 偏移量

    偏移量是指存储单元所在位置离段基址的偏移距离,又称偏移地址。基址和逻辑地址都用无符号16位二进制数或4位十六进制数表示。

    物理地址 = 逻辑地址左移4位 + 偏移地址(通过地址加法器完成)

    段基址来源于4个段寄存器,偏移地址来源于SP,BP,SI,DI和IP
    在这里插入图片描述

    I/O组织

    8086系统和外设之间都是通过I/O芯片联系的。每个I/O芯片都有一个端口或者几个端口,一个端口对应芯片内部的一个寄存器或者一组寄存器。微机系统要为每个端口分配一个地址,这个地址叫端口号。
    8086是用地址线的低16位来寻址8位I/O端口的,因此CPU可访问216 = 65536个I/O端口,并且,I/O端口的64KB寻址空间不需要分段。

    通过M/IO*信号可以区分当前访问的是存储器还是I/O地址

    展开全文
  • 在按字节组织的内存储器中,主要错误模式为单字节错;而在按位组织的内存储器中,主要错误模式为单位错。 半导体存储器的错误大体上分为硬错误和软错误,其中主要为软错误。硬错误所表现的现象是在某个
  • 四、随机访问存储器 五、RAM阵列 六、大规模RAM阵列 七、64K x 8 的RAM阵列 一、八位锁存器  可以将电平触发的D型锁存器表示成如下形式:  从结构上来讲,这套电路与先前的电平触发的D型锁存器是同一种...
  • 存储器

    千次阅读 2021-07-25 01:32:52
    8位二进制数为一个字节(Byte),字(word)是由一个或若干个字节组成。存储单元的遍号称为地址。1.2 分类1.2.1 按存储介质分类磁心存储器半导体存储器磁表面存储器存储器1.2.2 按信息的可保存性分类易失性非易失性...
  • AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。 本文主要介绍这三种存储器的使用问题。
  • 存储器组织

    2018-11-06 23:49:27
    存储器组织信息 计算机存储信息的基本单位是一个二进制位(bit),一个位可存储的二进制数。0或者1. 一般使用小写字母b。八个二进制组成一个字节(byte)常用大写字母B表示。 1、 存储模型 主存储器需要处理器通过...
  • 一、存储结构 ...数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。  可访问的存储器空间被分成8个主要块,每个块为512MB...
  • 8086虚拟存储器There are 20 address lines in the 8086 microprocessor. This gives us 220 different memory locations. Hence the total size is 220 Bytes (as each memory location is Byte Addressable, i.e. ...
  • 由于首地址是08000H,所以末地址是08000H + 4K - 1 = 08FFFH(默认按字节寻址)。这样我们就可以写出首地址和末地址了,如下图: 其次确定所需要的芯片数量。 位扩展要2块,字扩展需要4块,所以需要8块(应该不用...
  • 数据写入必须在李白的区块或者擦除后的区块巾进行,其底层技术要求块为单位进行擦除(将“Oxff”写入到要擦除的存储块中),再按页写入。Flash存储器的擦除次数是有限的,一般是100000次。当某块执行过度的擦除操作...
  • 计算机组成原理——存储器(一)

    千次阅读 2021-09-30 23:32:05
    存储器是计算机系统中的记忆设备,用来存放程序和数据。构成存储器的存储介质,目前主要采用半导体器件和磁性材料。一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元,均可以存储一位二进制代码。这个二进制...
  • 字节按小端格式在存储器中编码。字中编号最低的字节被视为该字的最低有效字节,而编号最高的字节被视为最高有效字节。 有关外设寄存器映射的详细信息,请参见相关章节。 可寻址的存储空间分为 8 个主要块,每个块...
  • 计算机存储器介绍

    2021-07-27 06:03:56
    《计算机存储器介绍》由会员分享,可在线阅读,更多相关《计算机存储器介绍(31页珍藏版)》请在人人文库网上搜索。1、第五章 存储器,5.1 存储器概述 5.2 存储器芯片 5.3 存储器的应用,作用: 存储程序和被处理的数据...
  • 嵌入式存储器

    2013-07-06 09:41:00
    嵌入式存储器的扩展实验, NANDFLASH产品市场竞争激烈,各大厂商会经常更新产品的制成,纳米技术的提升会带来成本的降低,所以在选择的时候一定要定期关注新版本的测试,其实新产品对于芯片本身没有任何变化,只是...
  • 虚拟存储器

    2022-06-20 11:23:53
    动态存储器分配器
  • 8086存储器结构

    千次阅读 多人点赞 2020-09-15 19:46:45
    8086存储器结构笔记
  • 存储器试题

    2012-12-02 22:59:07
    存储器有关经典的测试题及答案以及相关的重要概念。
  • 内部存储器

    千次阅读 2021-05-26 23:56:21
    存储器的基本知识 构成存储器的存储介质主要是半导体材料和磁性材料。 用半导体器件组成的存储器叫半导体存储器;用磁性材料组成的存储器叫磁表面存储器 存储位元(存储元):存储器中最小的存储单位,是一个二进制...
  • 我们可能一下子就能想起来,也可能几分钟都想不起来,不过,总的来说,我们通常能够重新组织自己的生活,保持高度的连续性,开始新的一天。  当然,人类的记忆是无序的。当回忆高中的几何课时,你可能会想到是谁坐...
  • 摘要:计中则容中障行政部正门责由劳令改动保,存储储器存储罚并处款。条件经审的查不符合法定受理,单元的存单元内作个工作日应在予受理决定出不,在收机关议申请人请后保障劳动到申的复复议。...计中则容中根据...
  • 文档介绍:新编电类专业计算机基础5.4结构与特点15.4.1控制器目录5.4.2运算器5.4.3...3外部程序存储器程序计数器PC8051P0.0/A0P0.7/A7...P2.0/A8P2.7/A15...低8位地址总线高8位地址总线8051单片机共16根地址线。最...
  • 高速缓存可组织成个高速缓存组的数组。每个组包含E个高速缓存行,每一个行由字节的数据块构成。有效位代表本行是否有意义。m位的地址可以被分为 t位(标记),s位(组索引),b位(块偏移)。 高速缓存的结构用...
  • 内部存储器练习

    千次阅读 2021-07-18 02:52:18
    单选题(共30题,60.0分)1、存储器是计算机系统中的记忆设备,它主要用来( )。(2.0分)A、存放数据B、存放程序C、存放程序和数据D、存放微程序正确答案: C答案解析:2、某一RAM芯片,其容量为1024*8位,其数据线和地址线...
  • 存储器映像寄存器

    2021-07-28 07:50:57
    (一)数字量输入和输出映象区1.输入映象寄存器(数字量输入映象区)(I)数字量输入映象区是S7-200CPU为输入端信号状态开辟的一个...可以按位、字节、字、双字四种方式来存取。(1)按"位"方式:从I0.0~I15.7,共有128点(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,520
精华内容 12,208
关键字:

以字节组织的存储器