intermediate1

2021-07-28 10:18:25 星期三

启动文件、RCC系统时钟、中断、系统定时器、通信、串口通信、USART、DMA直接存储区访问、常用存储器介绍、

一、启动文件讲解

1、启动文件的作用

  1. 初始化堆栈指针SP
  2. 初始化PC指针,指向复位程序
  3. 初始化中断向量表
  4. 配置系统时钟
  5. 调用C库函数_main,进入C的世界

2、栈

用于局部变量、函数调用、函数形参的开销

EQU:宏定义的伪指令,类似于C中的define
AREA:告诉汇编器汇编一个新的代码段或数据段
SPACE:用于分配一定大小的内存空间,单位为字节
标号_initial_sp紧挨着SPACE语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。
ALIGN=3:按照2的3次方,即8字节对齐。

3、堆

用于动态内存的分配,malloc函数

PRESERVE8:指定当前文件的堆栈按照8字节对齐
THUMB:表示后面指令为THUMB指令,THUMB是arm以前的指令集,16bit,现在Cortex-M系列都使用THUMB-2指令集,THUMB-2是32位的,兼容16位和32位的指令,是THUMB的超级。
EXPORT:声明一个标号具有全局属性,可被外部的文件使用。
DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。在向量表中,DCD分配了一堆内存,并且以ESR的入口地址初始化它们。

4、向量表

  • 向量表实际上是一个32位的整型数组,一个元素对应一个异常(ESR),数组元素存的就是ESR的入口地址。
  • 向量表在复位后从FLASH的0地址开始。
  • 向量表中存放的都是中断服务函数的函数名,可我们知道C语言中的函数名就是一个地址。
    异常是针对内核的,中断针对外设,但这里可理解为异常=中断

问:FLASH地址是从0x0800 0000开始,向量表又是从0地址开始存放,这是否矛盾?
给存储器分配地址叫做存储器映射,再分配一个地址叫做重映射,这里的0地址便是重映射。

5、复位程序

  • 复位程序是上电后单片机执行的第一个程序
  • 调用SystemInit函数配置系统时钟;调用C库函数_main,并最终进入C的世界

WEAK:表示弱定义,如果外部文件优先定义了该标号则首先引用该标号,如果外部文件没有声明也不会报错,这里表示复位子程序可以由用户在其他文件重新实现,这里并不是唯一的。
IMPORT:表示该标号来自外部文件,跟C语言中的EXTERN关键字类似。这里表示SystemInit和_main这两个函数均来自外部的文件。

6、中断服务程序

  • 启动文件为我们写好了全部的中断服务程序,函数的名称必须与中断向量表里面初始化的名称一样。
  • 这些程序都是空的,需要我们在C文件中重新实现。如果写的中断服务程序的函数名称写错了,程序也不会报错,而是会进入一个死循环。

7、用户堆栈初始化

由标准的C库函数_main来完成
IF,ELSE,ENDIF:汇编的条件分支语句,跟C语言的if,else类似。
END:文件结束
ALIGN:对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示4字节对齐。

8、启动文件里面涉及到的arm指令


二、RCC

1、时钟树主系统时钟

1.1、HSE时钟

高速的外部时钟,来源于有源晶振(1-50M)或无源晶振(4-26M),板子上用的是25M的无源晶振。
可通过RCC_CR时钟控制寄存器的位16:HSEON控制。

1.2、HSI是时钟

高速的内部时钟,来源于芯片内部,大小为16M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动成功。
可通过上述寄存器的位0:HSION控制

1.3、锁相环时钟PLLCLK

来源于HSI、HSE。由PLLSRC位配置
HSE或者HSI先经过一个分频因子M进行分频,然后经过一个倍频因子N,然后再经过一个分频因子P,最后成为锁相环时钟
PLLCLK=(HSE/M)N/P=25/25360/2=180M
PLL48CK是给USB_FS、RANG、SDIO提供时钟的

1.4、系统时钟SYSCLK

最高为180M,F407最高为168M。
来源于HSI、HSE、PLLCLK
由RCC_CFGR时钟配置寄存器的SW位

1.5、HCLK时钟

AHB高速总线时钟,最高为180M。为AHB总线的外设提供时钟,为Cortex系统定时器提供时钟(SysTick)、为内核提供时钟(FCLK)。
来源于系统时钟分频得到。

1.6、PCLK1时钟

APB低速总线时钟,最高为45M。为APB1总线的外设提供时钟。2倍频之后则为APB1总线的定时器提供时钟,最大为90M。
来源由HCLK分频得到。

1.7、PCLK2时钟

APB高速总线时钟,最高为90M,为APB2总线的外设提供时钟。2倍频后则为APB2总线的定时器提供时钟,最大为180M。
来源由HCLK分频得到。

2、时钟树其他时钟

2.1、RTC时钟

为芯片内部的RTC提供时钟
由HSE_RTC(最高为1M,由HSE分频得到)、LSE(外部32.768KHZ的晶体提供)、LSI(内部,32KHZ)
独立看门狗时钟:IWDGCLK,由LSI提供

2.2、MCO时钟输出


三、中断

1、中断类型

  1. 系统异常,体现在内核水平
  2. 外部中断,体现在外设水平

2、NVIC

嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。

3、中断优先级的定义

4、中断编程的顺序

  1. 使能中断请求
    与NVIC无关,与相对应的外设相关。
  2. 配置中断优先级分组
  3. 配置NVIC寄存器,初始化NVIC_InitTypeDef
  4. 编写中断服务函数

5、外部中断事件控制器

EXTI:External interrupt/event controller 外部 中断/事件 控制器
当I/O产生电平变化时,EXTI将电平变化的信号产生中断或者事件,中断会传给NVIC,让内核响应中断。事件要在内核中体现出来,会生成一个脉冲,给DAC或者TIM来触发启动。

  1. 初始化要连接到EXTI的GPIO
  2. 初始化EXTI用于产生中断/事件
  3. 初始化NVIC,用于处理中断
  4. 编写中断服务函数

四、系统定时器

SysTick,系统的定时器时属于CM4内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于180M
当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环反复。
因为SysTick是属于内核的外设,所以所有基于CM4内核的单片机都具有这个系统定时器,使得软件在CM4单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳

五、通信

在计算机设备与设备之间或集成电路之间常常需要进行数据传输。

1、串行与并行通信

不过由于并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能, 现在随着技术的发展,越来越多的应用场合采用高速率的串行差分传输。

2、全双工、半双工和单工通信

根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯,它们主要以信道的方向来区分

以公路来类比,全双工的通讯就是一个双向车道,两个方向上的车流互不相干;半双工则像乡间小道那样, 同一时刻只能让一辆小车通过,另一方向的来车只能等待道路空出来时才能经过;而单工则像单行道,另一方向的车辆完全禁止通行。

3、同步通信与异步通信

根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。

在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。 通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包, 以数据帧的格式传输数据,某种异步通讯 ,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。

在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高, 但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。

4、通信速率

衡量通讯性能的一个非常重要的参数就是通讯速率,通常以比特率(Bitrate)来表示,即每秒钟传输的二进制位数, 单位为比特每秒(bit/s)。

容易与比特率混淆的概念是“波特率”(Baudrate),它表示每秒钟传输了多少个码元。 而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

很多常见的通讯中一个码元都是表示两种状态,人们常常直接以波特率来表示比特率

六、串口通信

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。 对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性, 确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

1、物理层

  1. RS232标准
  2. USB转串口
  3. 原生的串口到串口

使用RS-232标准的串口设备间常见的通讯结构

两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。 由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通讯。

电平标准:


因为控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-232电平的信号进行互相转换。

2、协议层

串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中,规定了数据包的内容, 它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据

七、USART

STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写, 即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。
而UART外设是在USART的基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器, 可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;
还支持局域互连网络LIN、 智能卡协议与lrDA(红外线数据协会) SIR ENDEC规范。
USART支持使用DMA,可实现高速数据通信。

1、USART功能框图

1.1、功能引脚

TX: 发送数据输出引脚。

RX: 接收数据输入引脚。

SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。、、

SCLK:发送器时钟输出引脚。 这个引脚仅适用于同步模式。

1.2、数据寄存器

USART数据寄存器(USART_DR)只有低9位有效,并且第9位数据是否有效要取决于USART控制寄存器1(USART_CR1)的M位设置, 当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8位数据字长。

USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器,一个专门用于发送的可写TDR, 一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提取RDR数据。

TDR和RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR内容转移到发送移位寄存器, 然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。

1.3、控制器

USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。 使用USART之前需要向USART_CR1寄存器的UE位置1使能USART。发送或者接收数据字长可选8位或9位,由USART_CR1的M位控制。

  • 发送器
    当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,如果是同步模式SCLK也输出时钟信号。
    当发送使能位TE置1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。
    在写入最后一个数据后,需要等待USART状态寄存器(USART_SR)的TC位为1,表示数据传输完成,如果USART_CR1寄存器的TCIE位置1,将产生中断。

  • 接收器
    如果将USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。在确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内。
    接收完成后就把接收移位寄存器数据移到RDR内,并把USART_SR寄存器的RXNE位置1,同时如果USART_CR2寄存器的RXNEIE置1的话可以产生中断。

过采样
为得到一个信号真实情况,需要用一个比这个信号频率高的采样信号去检测,称为过采样, 这个采样信号的频率大小决定最后得到源信号准确度,一般频率越高得到的准确度越高,但为了得到越高频率采样信号越也困难, 运算和功耗等等也会增加,所以一般选择合适就好。

1.4、小数波特率生成


fPLCK为USART时钟;OVER8为USART_CR1寄存器的OVER8位对应的值, USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分, DIV_Fraction[3:0]位定义USARTDIV的小数部分,DIV_Fraction[3]位只有在OVER8位为0时有效,否则必须清零。

例如,如果OVER8=0,DIV_Mantissa=24且DIV_Fraction=10,此时USART_BRR值为0x18A; 那么USARTDIV的小数位10/16=0.625;整数位24,最终USARTDIV的值为24.625。

如果OVER8=0并且知道USARTDIV值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11, 所以DIV_Fraction[3:0]为0xB;DIV_Mantissa=整数(27.68)=27,即位0x1B。

如果OVER8=1情况类似,只是把计算用到的权值由16改为8。

1.5、中断控制


八、DMA——直接存储区访问

DMA为实现数据高速在外设寄存器与存储器之间或者存储器与存储器之间传输提供了高效的方法。之所以称为高效,是因为DMA传输实现高速数据移动过程无需任何CPU操作控制。从硬件层次上来说,DMA控制器是独立于Cortex-M4的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。
这里的外设一般指外设的数据寄存器,比如ADC、SPI、IIC、DCMI等外设的数据寄存器。存储器一般是指片内SRAM、外部存储器,片内FLASH等

外设到存储器传输就是把外设数据寄存器内容转移到指定的内存空间,比如进行ADC采集时我们可以利用DAM传输把AD转换数据转移到我们定义的存储区中,这样对于多通道采集,采样频率高,连续输出数据的AD采集时非常高效的处理方法。

存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器,这种多用于外设的发送通信。

存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于C语言内存拷贝函数memcpy,利用DMA传输可以达到更高的传输效率,特别是DMA传输是不占用CPU的,可以节省很多CPU资源。

1、DMA功能框图

1.1、外设通道选择

有两个DMA控制器,每个DMA控制器有8个数据流,每个数据流对应8个外设请求,在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7,对应8个DMA数据流)的CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。

外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。

每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。比如SPI3_RX请求,即SPI3数据发送请求,占用DMA1的数据流0的通道0, 因此当我们使用该请求时,我们需要在把DMA_S0CR寄存器的CHSEL[2:0]设置为“000”,此时相同数据流的其他通道不被选择,处于不可用状态, 比如此时不能使用数据流0的通道1即I2C1_RX请求等等。

SPI3_RX请求不仅仅在数据流0的通道0, 同时数据流2的通道0也是SPI3_RX请求,实际上其他外设基本上都有两个对应数据流通道, 这两个数据流通道都是可选的,这样设计是尽可能提供多个数据流同时使用情况选择。

1.2、仲裁器

一个DMA控制器对应8个数据流,数据流包含要传输数据的源地址、目标地址、数据等等信息。如果我们需要同时使用同一个DMA控制器(DMA1或DMA2)多个外设请求时, 那必然需要同时使用多个数据流,那究竟哪一个数据流具有优先传输的权利呢?这就需要仲裁器来管理判断了。

仲裁器管理数据流方法分为两个阶段。
第一阶段属于软件阶段,我们在配置数据流时可以通过寄存器设定它的优先级别。
第二阶段属于硬件阶段,如果两个或以上数据流软件设置优先级一样, 则他们优先级取决于数据流编号,编号越低越具有优先权,比如数据流2优先级高于数据流3。

1.3、FIFO

每个数据流都独立拥有四级32位FIFO(先进先出存储器缓冲区)。DMA传输具有FIFO模式和直接模式。

直接模式在每个外设请求都立即启动对存储器传输。在直接模式下,如果DMA配置为存储器到外设传输那DMA会见一个数据存放在FIFO内, 如果外设启动DMA传输请求就可以马上将数据传输过去。

FIFO用于在源数据传输到目标地址之前临时存放这些数据。可以通过DMA数据流xFIFO控制寄存器DMA_SxFCR的FTH[1:0]位来控制FIFO的阈值, 分别为1/4、1/2、3/4和满。如果数据存储量达到阈值级别时,FIFO内容将传输到目标中。

FIFO对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据, 即在实现数据传输时同时把原来4个8位字节的数据拼凑成一个32位字数据。此时使用FIFO功能先把数据缓存起来,分别根据需要输出数据。

FIFO另外一个作用使用于突发(burst)传输。

1.4、存储器端口、外设端口

DMA控制器实现双AHB主接口,更好利用总线矩阵和并行传输。DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输, 关系见图 两个DMA控制器系统实现 。DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。

DMA2(DMA控制器2)的存储器端口和外设端口都是连接到AHB总线矩阵,可以使用AHB总线矩阵功能。DMA2存储器和外设端口可以访问相关的内存地址, 包括有内部Flash、内部SRAM、AHB1外设、AHB2外设、APB2外设和外部存储器空间。

DMA1的存储区端口相比DMA2的要减少AHB2外设的访问权,同时DMA1外设端口是没有连接至总线矩阵的,只有连接到APB1外设,所以DMA1不能实现存储器到存储器传输。

1.5、编程端口

AHB从器件编程端口是连接至AHB2外设的。AHB2外设在使用DMA传输时需要相关控制信号。

九、常用存储器

1、存储器的种类


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

2、RAM存储器

Random Access Memory,随机存储器,指的是当存储器中的消息被读取或写入时, 所需要的时间与这段信息所在的位置无关。

  • DRAM
    动态随机存储器DRAM的存储单元以电容的电荷来表示数据,有电荷代表1,无电荷代表0。时间一长,代表1的电容会放电,代表0的电容会吸收电荷,因此它需要定期刷新操作,这就是“动态(Dynamic)”一词所形容的特性。
    根据DRAM的通讯方式,又分为同步和异步两种,这两种方式根据通讯时是否需要使用时钟信号来区分。 图中是一种利用时钟进行同步的通讯时序,它在时钟的上升沿表示有效数据。

    由于使用时钟同步的通讯速度更快,所以同步DRAM使用更为广泛,这种DRAM被称为SDRAM(Synchronous DRAM)
    为了进一步提高SDRAM的通讯速度,人们设计了DDR SDRAM存储器(Double Data Rate SDRAM)。它的存储特性与SDRAM没有区别, 但SDRAM只在上升沿表示有效数据,在1个时钟周期内,只能表示1个有数据;而DDRSDRAM在时钟的上升沿及下降沿各表示一个数据, 也就是说在1个时钟周期内可以表示2位数据,在时钟频率同样的情况下,提高了一倍的速度。至于DDRII和DDRIII, 它们的通讯方式并没有区别,主要是通讯同步时钟的频率提高了。
    当前个人计算机常用的内存条是DDRIII SDRAM存储器,在一个内存条上包含多个DDRIII SDRAM芯片。
  • SRAM
    静态随机存储器SRAM的存储单元以锁存器来存储数据。这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为“静态(Static)”RAM。
    同样地,SRAM根据其通讯方式也分为同步(SSRAM)和异步SRAM,相对来说,异步SDRAM用得比较多。

DRAM与SRAM
对比DRAM与SRAM的结构,可知DRAM的结构简单得多,所以生产相同容量的存储器,DRAM的成本要更低,且集成度更高。 而DRAM中的电容结构则决定了它的存取速度不如SRAM。

所以在实际应用场合中,SRAM一般只用于CPU内部的高速缓存(Cache),而外部扩展的内存一般使用DRAM。

3、非易失性存储器

非易失性存储器种类非常多,半导体类的有ROM和FLASH,而其它的则包括光盘、软盘及机械硬盘。

3.1、ROM

Read Only Memory,只读存储器。

  • MASK ROM——存储在它内部的数据是在出厂时使用特殊工艺固化的,生产后就不可修改
  • OTPROM——(One Time Programable ROM)是一次可编程存储器。这种存储器出厂时内部并没有资料, 用户可以使用专用的编程器将自己的资料写入,但只能写入一次,被写入过后,它的内容也不可再修改。
  • EPROM(Erasable Programmable ROM)是可重复擦写的存储器, 它解决了PROM芯片只能写入一次的问题。这种存储器使用紫外线照射芯片内部擦除数据, 擦除和写入都要专用的设备。
  • EEPROM(Electrically Erasable Programmable ROM)是电可擦除存储器。 EEPROM可以重复擦写,它的擦除和写入都是直接使用电路控制, 不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。

3.2、FLASH存储器

FLASH存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把FLASH存储器称为FLASH ROM,但它的容量一般比EEPROM大得多, 且在擦除时,一般以多个字节为单位。如有的FLASH存储器以4096个字节为扇区,最小的擦除单位为一个扇区。根据存储单元电路的不同, FLASH存储器又分为NOR FLASH和NAND FLASH

NOR与NAND的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以“扇区/块”为单位的。 而NOR与NAND特性的差别,主要是由于其内部“地址/数据线”是否分开导致的。

由于NOR的地址线和数据线分开,它可以按“字节”读写数据,符合CPU的指令译码执行要求,所以假如NOR上存储了代码指令, CPU给NOR一个地址,NOR就能向CPU返回一个数据让CPU执行,中间不需要额外的处理操作。

而由于NAND的数据和地址线共用,只能按“块”来读写数据,假如NAND上存储了代码指令,CPU给NAND地址后, 它无法直接返回该地址的数据,所以不符合指令译码要求。“是否支持XIP”描述的就是这种立即执行的特性(eXecute In Place)。

若代码存储在NAND上,可以把它先加载到RAM存储器上,再由CPU执行。所以在功能上可以认为NOR是一种断电后数据不丢失的RAM, 但它的擦除单位与RAM有区别,且读写速度比RAM要慢得多。

由于两种FLASH存储器特性的差异,NOR FLASH一般应用在代码存储的场合,如嵌入式控制器内部的程序存储空间。 而NAND FLASH一般应用在大数据量存储的场合,包括SD卡、U盘以及固态硬盘等,都是NAND FLASH类型的。

posted @ 2025-04-23 14:21  cswft  Views(9)  Comments(0)    收藏  举报