Modo de inicio de chip XIP y BootRom

XIP: ejecutar en el lugar, es decir, ejecutar en el chip, lo que significa que el programa de aplicación puede obtener instrucciones directamente en la memoria flash y luego decodificarlas y ejecutarlas sin leer el código en la RAM del sistema. significa que Nor flash no necesita inicializarse, y el código se puede ejecutar directamente en el flash, pero a menudo solo se ejecuta una parte del código, como para inicializar la RAM. La llamada ejecución en chip no significa que el programa se ejecute en la memoria.Las funciones básicas de la CPU son buscar, decodificar y ejecutar. Nor Flash se puede ejecutar en el chip, lo que significa que la CPU puede obtener instrucciones directamente de Nor flash para que las usen los decodificadores y ejecutores posteriores.

NOR Flash y Nand Flash

Intel desarrolló por primera vez la tecnología NOR Flash en 1988, que cambió por completo la EPROM original (Memoria de solo lectura programable eléctricamente) y la EEPROM (Memoria de solo lectura programable borrable eléctricamente) La situación de dominar el mundo. Luego, en 1989, Toshiba lanzó la estructura NAND Flash, enfatizando la reducción del costo por bit, mayor rendimiento y fácil actualización a través de la interfaz como un disco. NOR Flash se caracteriza por la ejecución en chip (XIP, eXecute In Place), de modo que las aplicaciones pueden ejecutarse directamente en la memoria Flash sin tener que leer el código en la RAM del sistema. La eficiencia de transmisión de NOR es muy alta y es muy rentable en la pequeña capacidad de 1 ~ 4 MB, pero la muy baja velocidad de escritura y borrado afecta en gran medida su rendimiento. La estructura de NAND puede proporcionar una densidad celular extremadamente alta, puede lograr una alta densidad de almacenamiento y la velocidad de escritura y borrado también es muy rápida. La dificultad de aplicar NAND radica en la gestión de Flash y la necesidad de interfaces de sistema especiales. Por lo general, la velocidad de lectura de NOR es ligeramente más rápida que la de NAND, y la velocidad de escritura de NAND es mucho más rápida que la de NOR.

Inicio de XIP e inicio de BootRom

El código de ejecución de la CPU se refiere al proceso de ejecutar instrucciones de código almacenadas en su memoria. La CPU obtiene instrucciones del caché de instrucciones de alta velocidad, las decodifica y realiza las operaciones especificadas por las instrucciones. La CPU lee las instrucciones una por una, realiza la operación especificada por la instrucción y luego continúa ejecutando la siguiente instrucción hasta el final del programa. Entonces, ¿qué tiene esto que ver con el método de arranque? Diferentes métodos de inicio determinan de dónde provienen las instrucciones en el caché de instrucciones de alta velocidad.

Lanzamiento de XIP eXecute In Place

La tecnología XIP requiere el soporte de CPU y flash al mismo tiempo. Para realizar XIP, Flash debe estar conectado a AMBA con una interfaz de bus paralelo. Este bus paralelo debe tener líneas de dirección y líneas de datos independientes, y el ancho de las líneas de dirección corresponde al tamaño de Flash, similar al bus DDR o SRAM. Entonces, ¿por qué SPI NorFlash puede realizar XIP? La respuesta es el periférico FlexSPI, es decir, la CPU debe tener un control SPI especial y el controlador realiza la conversión del bus serial flash al bus paralelo. Para mejorar el rendimiento, se puede integrar un búfer similar a la función de caché dentro del controlador. La siguiente figura muestra la topología lógica del controlador SPI que admite XIP para una determinada CPU.

inserte la descripción de la imagen aquí
Modo de inicio XIP: copie las instrucciones directamente desde NorFlash a la memoria caché de instrucciones de alta velocidad del chip;

Desde el punto de vista del software, XIP ejecuta el código directamente en la memoria flash externa, al igual que el chip se ejecuta directamente en la dirección 0x0800 0000 de la memoria flash interna, lo que se denomina "ejecución in situ".
Realización de tecnología de software

El código de la aplicación del usuario debe estar vinculado a la dirección de la memoria de ejecución de destino (QSPI externo o flash FMC-NOR)

Cuando se compila el código de la aplicación del usuario, la dirección del enlace debe cambiarse a la dirección de la memoria flash externa. Por ejemplo, la dirección asignada por el sistema STM32 H7 al flash QSPI en el bus del sistema es 0x9000 0000, luego la dirección de el código debe cambiarse a 0x9000 0000.

Rutina: este código es el código de inicio del sistema integrado que se ejecuta en el sistema operativo RT-Thread. Este código es responsable de inicializar el sistema, incluido el pin LED0, la memoria flash y el caché del sistema.

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_common.h>
#include "w25qxx.h"

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/* defined the LED0 pin: PB1 */
#define LED0_PIN    GET_PIN(I, 8)

#define VECT_TAB_OFFSET      0x00000000UL
#define APPLICATION_ADDRESS  (uint32_t)0x90000000

typedef void (*pFunction)(void);
pFunction JumpToApplication;

int main(void)
{
    
    
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);  
    //首先使用该rt_pin_mode功能将 LED0 引脚设置为输出模式。
    
    /* initialize the flash memory */
    W25QXX_Init();
   //使用该函数初始化闪存W25QXX_Init。

    /* enable the flash memory to be memory-mapped 内存映射 */
    W25Q_Memory_Mapped_Enable();

    /* disable instruction cache 禁止指令缓存*/
    SCB_DisableICache();

    /* disable data cache 禁止数据缓存 */
    SCB_DisableDCache();
    
    //使用 SCB_DisableICache 和 SCB_DisableDCache 函数禁用指令和数据缓存。 这样做是因为应用程序代码直接从内存映射的闪存中执行,而不是先复制到系统 RAM 中。

    /* disable the SysTick timer */
    SysTick->CTRL = 0;
    //通过将寄存器设置为 0 来禁用 SysTick 计时器。SysTick->CTRL这样做是为了防止计时器在系统启动时生成中断请求。
    

    /* set the jump-to-application function to the address of the application's reset handler */
    JumpToApplication = (pFunction)(*(__IO uint32_t *)(APPLICATION_ADDRESS + 4));
    //然后将 JumpToApplication 函数设置为应用程序重置处理程序的地址,该地址存储在 APPLICATION_ADDRESS + 4。
    
    
    /* set the main stack pointer (MSP) to the address of the application's initial stack pointer */
    __set_MSP(*(__IO uint32_t *)APPLICATION_ADDRESS);
    //使用 __set_MSP 函数将主堆栈指针 (MSP) 设置为应用程序初始堆栈指针的地址。
    

    /* jump to the application */
    JumpToApplication();
    //最后,系统使用 JumpToApplication 函数跳转到应用程序代码。 main函数末尾的return RT_EOK语句用于表示main函数已成功完成并返回RT_EOK错误代码。 在这种情况下,它没有被使用,因为系统已经跳转到应用程序代码并且不再执行启动代码。

    return RT_EOK;
}

En general, este código de inicio proporciona la configuración básica para un sistema integrado que se ejecuta en el sistema operativo RT-Thread. Inicializa el sistema, configura la memoria flash, desactiva el caché, desactiva el temporizador SysTick y salta al código de la aplicación. El código utiliza los archivos de encabezado rtthread.h, rtdevice.h y rtdbg.h para acceder a funciones y macros en la biblioteca RT-Thread, y el encabezado board.h, drv_common.h y w25qxx.h específico del dispositivo y la placa. Definiciones de controladores de archivos.

Iniciar BootRom

Arrancar desde la ROM: este es un método tradicional en el que las instrucciones del programa se almacenan en un chip de memoria de solo lectura (ROM) y luego se copian en la RAM para su ejecución. Este método requiere ROM y RAM, pero tiene la ventaja de actualizar el firmware simplemente reemplazando el chip ROM.

Arranque desde la tarjeta SD: este método almacena el firmware en la tarjeta SD, que luego se copia en la RAM para su ejecución. Este método se usa a menudo en sistemas que requieren una gran cantidad de almacenamiento de firmware y tiene la ventaja de actualizar el firmware simplemente reemplazando la tarjeta SD.

Winbond también tiene SD Nand, lo que hace que la tarjeta SD esté integrada, y el rendimiento de la transmisión es mejor. Si la MPU maneja el rendimiento de audio y video, puede liberarse; por supuesto, el precio es más caro que Nand con la misma capacidad. Arranque desde la memoria flash NAND/NOR:
este método One almacena las instrucciones del programa en un chip de memoria flash NAND o NOR y las copia en la RAM para su ejecución. Este método es similar al arranque desde la ROM, pero tiene la ventaja de poder actualizar el firmware dentro del sistema sin reemplazar el chip.

Rutina de inicio de Nand Flash:

#include "stm32f4xx_hal.h"

#define NAND_FLASH_ADDRESS 0x70000000

void NAND_Start(void)
{
    
    
  /* Disable I cache and D cache */
  SCB_DisableICache();
  SCB_DisableDCache();
  
  /* Initialize NAND flash */
  HAL_NAND_Init();

  /* Get the address of the boot loader from NAND flash */
  pFunction JumpToApplication = (pFunction)(*(__IO uint32_t *)(NAND_FLASH_ADDRESS + 4));

  /* Set the main stack pointer to the address in the vector table of the application */
  __set_MSP(*(__IO uint32_t *)NAND_FLASH_ADDRESS);

  /* Jump to the application */
  JumpToApplication();
}

Aquí hay una breve explicación del código:

Primero deshabilite I cache y D cache para asegurarse de que los datos flash NAND se lean correctamente.

HAL_NAND_Init, use funciones en STM32Cube HAL para inicializar la memoria flash NAND.

A continuación, la dirección del gestor de arranque se toma de la dirección de NAND flash en NAND_FLASH_ADDRESS + 4. Esta dirección debe ser la primera palabra de la tabla de vectores del gestor de arranque, que contiene el puntero de pila inicial (MSP) y la dirección del controlador de reinicio.

Luego, el puntero de pila principal (MSP) se establece en la dirección de la tabla de vectores de la aplicación.

Finalmente, el microcontrolador salta a la aplicación llamando a la función JumpToApplication.

¿Por qué deshabilitar I-Cache y D-Cache?

I-Cache y D-Cache están deshabilitados para garantizar que el procesador pueda leer datos e instrucciones directamente desde la memoria flash NAND. Cuando la memoria caché está habilitada, el procesador intentará leer los datos de la memoria caché antes de acceder a la memoria flash NAND, lo que puede provocar una operación incorrecta o corrupción de datos. La desactivación de la memoria caché garantiza que el procesador tenga acceso directo a la memoria flash NAND y ayuda a evitar posibles problemas causados ​​por el acceso a datos almacenados en la memoria caché que pueden estar obsoletos o ser incompatibles con los datos reales almacenados en la memoria flash NAND.

Explicar __set_MSP

La macro __set_MSP es una función de biblioteca C estándar proporcionada por la familia de procesadores ARM Cortex-M, incluidos los microcontroladores de la serie STM32. Se utiliza para establecer el valor del puntero de la pila principal (MSP), que es la dirección superior de la pila principal en la memoria. La pila principal es donde el procesador almacena datos temporales, como parámetros de llamadas a funciones, direcciones de retorno y variables locales durante la ejecución del programa.

El MSP es una parte importante de la arquitectura del procesador Cortex-M porque determina dónde comienza el procesador a asignar memoria para un nuevo marco de pila cuando se llama a una función y dónde busca una dirección de retorno cuando regresa una función.

En este código, la función __set_MSP se usa para inicializar el MSP con la dirección de inicio de la tabla de vectores de la aplicación almacenada en APPLICATION_ADDRESS en flash. El propósito de esto es garantizar que el procesador utilice la pila y la tabla de vectores correctas al ejecutar el código de la aplicación, que se almacena en APPLICATION_ADDRESS en la memoria flash.

¿Cuál es la diferencia entre NorFlash y Nand Flash en la compatibilidad con XIP?

NorFlash es una memoria no volátil que admite acceso aleatorio y ejecuta instrucciones directamente desde la memoria flash. Esto lo hace adecuado para el modo XIP donde las instrucciones se ejecutan directamente desde la memoria flash.

NAND flash, por otro lado, es un tipo de memoria optimizada para almacenamiento de alta densidad, generalmente para almacenar grandes cantidades de datos, pero no optimizada para la ejecución directa de instrucciones. En NAND flash, las instrucciones deben copiarse a la RAM antes de que puedan ejecutarse, lo que lo hace menos adecuado para el modo XIP.

XIP comienza a comunicarse con SPI

Usando el método de inicio XIP, ¿aún se debe mantener la comunicación SPI después de que se inicie el programa?

Sí, en el diseño del sistema, se recomienda utilizar un canal dedicado para el inicio de Flash y no se permite la multiplexación.

Esto se debe a que cuando la caché de instrucciones de alta velocidad (I-Cache) y la caché de datos de alta velocidad (D-Cache) no son lo suficientemente grandes, es posible que no sea posible almacenar todas las instrucciones y datos en el programa actual. Por lo tanto, el chip debe leer constantemente datos de NorFlash durante la ejecución del programa, lo que reducirá el rendimiento general del sistema. Sin embargo, este método ahorra espacio en la memoria y reduce el tiempo de inicio del sistema al eliminar la necesidad de copiar instrucciones y datos de NorFlash a la RAM.

Si el programa es muy pequeño, después de que el programa se ejecuta durante un ciclo, todas las instrucciones se copian en la memoria caché de la CPU y el programa ya no leerá las instrucciones ni los datos de Nor Flash cuando el programa se esté ejecutando, lo que libera la Ocupación de la interfaz SPI.

Dimensión de referencia de selección de modelo flash

¿Cómo elegir entre NorFlash y NandFlash en la evaluación de proyectos y qué dimensiones existen?

En primer lugar, es mejor tener un chip en la lista de soporte del fabricante de Soc y luego consultar los siguientes ángulos.

Ventajas de NorFlash:

Velocidad de lectura rápida: NorFlash tiene una velocidad de lectura aleatoria rápida, lo que lo hace adecuado para el modo de arranque XIP (ejecutar en el lugar), donde los programas se ejecutan directamente desde la memoria flash.

Facilidad de uso: NorFlash es fácil de interconectar con microcontroladores y tiene un conjunto de comandos simple, lo que facilita la integración en los sistemas.

Alta confiabilidad: NorFlash tiene alta confiabilidad y estabilidad, apto para uso en sistemas críticos.

Bajo consumo de energía: NorFlash consume muy poca energía, lo que lo hace adecuado para su uso en dispositivos que funcionan con baterías.

Desventajas de NorFlash:

Velocidad de escritura lenta: NorFlash escribe lentamente y no es adecuado para aplicaciones que requieren escrituras frecuentes.

Caro: en comparación con Nand Flash, NorFlash es más caro.

Ventajas de la memoria flash Nand:

Gran capacidad: Nand Flash tiene una gran capacidad de almacenamiento y es adecuado para almacenar grandes cantidades de datos.

Bajo costo: en comparación con NorFlash, Nand Flash es más económico y, por lo tanto, más rentable para aplicaciones donde la capacidad de almacenamiento es importante.

Velocidad de escritura rápida: Nand Flash tiene una velocidad de escritura rápida, adecuada para aplicaciones que requieren escritura frecuente.

Desventajas de Nand Flash:

Interfaz compleja: la interfaz Nand Flash y el conjunto de comandos son complejos, lo que dificulta la interfaz con los microcontroladores.

Confiabilidad limitada: la memoria flash Nand tiene niveles limitados de confiabilidad y estabilidad, lo que la hace inadecuada para su uso en sistemas críticos.

Se requieren componentes adicionales: Nand flash requiere componentes adicionales, como un controlador flash, para interactuar con el microcontrolador, lo que agrega costo y complejidad al sistema.

Velocidad de lectura lenta: la velocidad de lectura aleatoria de Nand Flash es lenta, no adecuada para el modo de arranque XIP.

Lo principal es ver cuál es más barato de usar si no hay conflicto de recursos y no afecta el rendimiento.

Supongo que te gusta

Origin blog.csdn.net/qq_41483419/article/details/130944593
Recomendado
Clasificación