嵌入式开发(STM32)--第一章

本文详细介绍了学习嵌入式设备时常用的手册资料,重点探讨了STM32芯片的架构,包括ARM内核、总线系统、DMA控制器、哈佛架构的优势,以及FMC和FMC的区别,特别关注了SRAM、DRAM和不同类型的闪存在存储器管理和高速数据传输中的应用。
摘要由CSDN通过智能技术生成

一、如何学习一款嵌入式设备?

        在学习的时候,有两个官方资料我们会经常用到,一个是参考手册(英文叫 Reference manual),另外一个是数据手册(英文叫 Data Sheet)。

        参考手册是对片上外设的功能说明和寄存器描述。对片上每一个外设的功能和使用做了详细的说明,包含寄存器的详细描述。编程的时候需要反复查询这个手册。

        数据手册包含下列内容

         功能概览:主要讲这个芯片有哪些功能,属于概括性的介绍。芯片选型的时候首先看这个部分。

        引脚说明:详细描述每一个引脚的功能,设计原理图的时候和写程序的时候需要参考这部分。         

        内存映射: 讲解该芯片的内存映射,列举每个总线的地址和包含有哪些外设。 封装特性讲解芯片的封装,包含每个引脚的长度宽度等,我们画 PCB 封装的时候需要参考这部分的参数。

二、STM32芯片架构

主要包含:

        ARM公司提供的内核:cortex-M7

        ARM公司提供的总线:Icode,Dcode,System总线

        ST公司提供的总线矩阵,DMA控制器,AHB总线,APB总线,以及各个外设控制器

        以上整体称之为片上系统(SOC),每个模块各司其职,存在竞争与合作。

(cortex-M3)

        计算机硬件由5大部分构成:运算器,控制器,存储,输入/输出设备。上图的系统架构体现出计算机组成原理的设计,各个模块之间通过总线进行通信。

        STM32芯片是属于哈佛架构。哈佛架构与冯诺依曼的最大区别在于:哈佛架构的数据总线,指令总线是分开独立的(冯·诺依曼结构数据空间和地址空间不分开)。CPU通过Icode从Flash中取指令,再译码,得到数据的地址,再通过Dcode总线和SRAM进行数据交互。

哈佛架构的优势:

        并行体系结构,将程序指令和数据存储在不同的存储空间中,每个存储器独立编址、独立访问。哈佛架构的微处理器通常具有较高的执行效率,其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令。

        总线矩阵的前级是主设备(Msater):cortex-M3和DMA;后级是从设备:存储器以及各个外设控制器通过总线矩阵,可以实现内核与DMA控制器对外设的访问,凡是挂在总线矩阵上的设备,内核与DMA都是有权访问的。

        内核(CPU),通过取指,译码,执行这样的三级流水线执行代码,若没有中断与异常,CPU一直顺序执行。但CPU很强大的功能之一就是有响应中断和异常的能力,通过规定好的异常向量表处理异常,通过规定好的中断向量表处理中断,中断的性能从一定程度上表示这款内核的性能。

        当外设与存储器之间有大量数据传输时,每次都通过CPU来处理,而CPU处理的方式有两种:一是轮询(polling),二是中断(interrupt),这两种都会使CPU不断的处理数据的传输,从而导致其他功能的执行会受影响。为了提高大数据量传输时CPU的效率,从硬件上增加了DMA控制器,来实现外设与内存之间的数据传输。

        直接存储器存取DMA,DMA处于总线矩阵的前级,与内核同级别,属于主设备(Master)。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

        DMA方式主要适用于一些高速的外设I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。

        但是,使用DMA也是有缺点的:它势必会影响到CPU访问内存的速度(CPU与DMA时分复用数据总线),影响其他功能的执行速度。对于数据量较小的传输来说,更没必要使用DMA,毕竟DMA每一次传输完成后也会引发CPU中断,而直接使用CPU中断,也是一次中断。只不过在中断向量表中的位置不同而已。

芯片主系统架构基于两个子系统,一个是 AXI 转多层 AHB 桥,一个是多层 AHB 总线矩阵。

        AXI 转多层 AHB 桥,从 AXI4 协议转成 AHB-Lite 协议,其中包含 3 个 AXI 转 32-bit AHB 桥通过 32-bit 的 AHB 总线矩阵连接到外部存储器 FMC 接口、外部存储器 Quad SPI 接口、内部 SRAM(SRAM1 and SRAM2)。还包含一个 AXI 转 64-bit AHB 桥通过 64-bit 总线矩阵连接到内部 FLASH。

        多层 AHB 总线矩阵,其中 32-bit 多层 AHB 总线矩阵互联 11 个主设备和 8 个从设备,64-bit 多层 AHB 总线矩阵则是 CPU 通过 AXI 转 AHB 桥通过这个 64-bit 多层 AHB 总线矩阵连接到内部 Flash。DMA 主设备通过 32-bit AHB 总线矩阵通过这个 64-bit 多层 AHB 总线矩阵连接到内部 Flash。主控总线通过一个总线矩阵来连接被控总线,总线矩阵用于主控总线之间的访问仲裁管理,仲裁采用循环调度算法。总线之间交叉的时候如果有个圆圈则表示可以通信, 没有圆圈则表示不可以通信。

        连接被控总线的是 FLASH,RAM 和片上外设,这些功能部件共同排列在一个 4GB 的地址空间内。我们在编程的时候,操作的也正是这些功能部件。

        存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如果给存储器再分配一个地址就叫存储器重映射。

        在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定 了用途,具体分类见表格 5‑1。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个 块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的一部分而已。

        在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Block0 用来设计成内部 FLASH,Block1 用来设计成内部 RAM,Block2 用来设计成片上的外设。

        Block0 是存放程序代码的区域。用户也可以在此处放置数据。通过 ITCM 或 AXIM 接口执行指令提取和数据访问。

        Block1 用于设计片内的 SRAM。用户也可以在这里进行编码。通过 DTCM 或 AXIM 接口执行指令提取和数据访问。

        Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了 APB 和 AHB 两部分, 其中 APB 又被分为 APB1 和 APB2,AHB 分为 AHB1 和 AHB2,还有一个 AHB3 包含了 Block3/4/5,AHB3 包含的 3 个 Block 用于扩展外部存储器,如 SRAM,NORFLASH 和 NANDFLASH 等。

FMC/FSMC

        FSMC( Flexible static memory controller)全称“灵活的静态存储器控制器”,是 STM32中一个很有特色的外设,通过 FSMC,STM32可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和Nand Flash存储器的引脚相连,从而进行数据的交换。

        要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。

提到这个就首先区分一下概念:

存储器:

        存储器就是按照二进制来存储数据的器件,存储空间叫做存储区。存储器的单元地址只有一个,固定不变,而存储在其中的信息是可以更换的。

        按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM)。

        存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。其中的“易失/非易失”是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘

RAM:
        随机存取存储器,缩写:RAM,也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。ROM:
        只读存储器以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。 当然,现在的ROM包括闪存就是U盘,包括固态硬盘等,都是可写入的。ROM已经不是只读的了。

        RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。 并且RAM的速度要远远高于ROM的速度。

SRAM:
        SRAM,静态的随机存取存储器,又被称为静态RAM,利用双稳态电路进行存储。即使有干扰对稳态电路也没影响,所以有双稳态性,“静态”是指只要不掉电,存储在SRAM中的数据就可以一直保存,只要有电,SRAM中的数据就不会有变化。加电情况下,不需要一直刷新,数据不会丢失,SRAM 的存储单元以锁存器来存储数据,种电路结构不需要定时刷新充电,就能保持状态。

        SRAM的速度非常快,在快速读取和刷新时能够保持数据完整性。SRAM内部采用的是双稳态电路的形式来存储数据。所以SRAM的电路结构非常复杂。制造相同容量的SRAM比DRAM的成本高的多。正因为如此,才使其发展受到了限制。因此目前SRAM基本上只用于CPU 内部的一级缓存以及内置的二级缓存。

DRAM:
        DRAM,动态随机存取存储器,需要不断的刷新,才能保存数据。主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制比特(bit)是1还是0。,有电荷代表 1,无电荷代表 0,由于在现实中电容会有漏电的现象,导致电位差不足而使记忆消失,因此除非电容经常周期性地充电,否则无法确保记忆长存。DRAM读取具有破坏性,也就是说,在读操作中会破坏内存单元行中的数据。因此,必需在该行上的读或写操作结束时,把行数据写回到同一行中。这一操作称为预充电,是行上的最后一项操作。必须完成这一操作之后,才能访问新的行,这一操作称为关闭打开的行。

SDRAM:
        SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步的DRAM。同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。SDRAM的内部是一个存储阵列,你可以把它想象成一张表格。我们在向这个表格中写入数据的时候,需要先指定一个行(Row),再指定一个列(Column),就可以准确地找到所需要的“单元格”,这就是SDRAM寻址的基本原理。DDR之前的文章已经讲解过,是一个时钟周期内传输两次数据,它能够在时钟的上升期和下降期各传输一次数据,因此称为双倍速率同步动态随机存储器。)

EEPROM:
        EEPROM(Electrically Erasable Programmable ROM) 是电可擦除存储器。EEPROM 可以重复擦写,它的擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。现在主要使用的 ROM 芯片都是 EEPROM。

FLASH:
        flash(Flash Memory)闪存是非易失存储器,掉电不丢失数据,容量大,价格便宜,容量一般比 EEPROM 大得多,且在擦除时,一般以多个字节为单位。flash又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据 ,同时可以快速读取数据。可以对存储器单元块进行擦写和再编程。

        可以分为NAND FLASH和NOR FLASH

NOR FLASH:
        NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,采取内存的随机读取技术

NAND FLASH:
        NAND 闪存的存储单元则采用串行结构,没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,存储单元的读写是以页和块为单位来进行(一页包含若干字节,若干页则组成储存块, NAND 的存储块大小为 8 到 32KB ),这种结构最大的优点在于容量可以做得很大,超过 512MB 容量的 NAND 产品相当普遍, NAND 闪存的成本较低,有利于大规模普及。

        NOR FLASH读取速度比NAND FLASH快,但是容量不如NAND FLASH,价格上也更高,但是NOR FLASH可以芯片内执行,同样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NAND FLASH密度更大,可以作为大数据的存储。

        回到FMC,单片机跟外部存储器通信,也需要知道数据的地址,然后把数据的内容传递过来。 那这样的话,存储器就需要地址传输线跟数据传输线,还要加上一些控制时序的引脚比方说复位、写数据、读数据等等,在STM32上,有一些引脚被专门设计成地址线,还有一些被专门设计成数据线,还有一些被设计成控制线,然后这些地址线和数据线对应着固定的地址,只要外部的DRAM等存储器将对应的数据线连接到STM32这些对应的引脚上,引脚功能设置为复用模式,通过配置FSMC ,你可以直接给上面那个固定的地址赋值 ,其他操作STM32都会自动给你完成,就可以把数据存储到SRAM中。总的来说,将AHB传输信号转换到适当的外部设备协议;满足访问外部设备的时序要求。所有的外部存储器共享控制器输出的地址、数据和控制信号,每个外部设备可以通过一个唯一的片选信号加以区分。FSMC在任一时刻只访问一个外部设备。

FSMC和FMC区别
        F1 和 F407 使用的是FSMC(Flexible static memory controller)“静态存储器控制器” 是Cortex-M3内核的芯片专属的,STM32可以通过FSMC与静态SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。在Cortex-M4内核的F429和Cortex-M7内核的F7,H7系列中,变成了FMC(Flexible Memory Controller) 灵活存储控制器,支持了动态SDRAM 等设备。FMC是在FSMC(Flexible Static Memory Controller)的基础上扩展了SDRAM的总线控制器,使用 FMC 可以动态刷新 SDRAM

        FSMC只能接静态SRAM,FMC可以接动态DRAM,而控制动态DRAM要复杂得多。动态RAM需要不停地进行周期性的刷新,否则RAM中的数据就会丢失,这就产生了“管理”问题,存储器和STM32之间就只是进行数据读写就可以,如果用一个MCU来连接DRAM,二者之间交换的就不只是数据交换那么简单了,还包含有控制信息。跟周期性刷新DRAM内数据,这样,DRAM中除了存储数据的单元,还需要有寄存器还得有个对DRAM的“初始化”过程

        这么复杂,有同学就会问为什么还要用DRAM呢?用SRAM不就行了吗?

        如果您看了上面的DRAM跟SRAM区别就会知道,SRAM的容量是小于DRAM的,并且价格远大于DRAM,所以SRAM一般只用于CPU内部的存储,而像我们电脑上外接的那几个G的内存条,都是动态DRAM类型的。

  • 36
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值