¿Cuáles son los posibles modos de arranque en el S32K146 (MCU de la serie NXP S32K)?

He estado investigando los modos de arranque de MCU S32K146 y las posibles opciones de selección de modo.

Me interesa saber los posibles modos de arranque y cómo se puede configurar. De la hoja de datos (Página -92): Se puede ver que el arranque puede ocurrir desde la memoria flash. Después de buscar en Google y algunas investigaciones: me di cuenta de que el arranque también es posible desde la RAM usando VTOR programable (Registro de compensación de tabla vectorial).

¿Cuáles son los posibles modos de arranque en S32K146 y cómo se pueden seleccionar estos modos?

Respuestas (1)

Depende de lo que quieras decir con "arranque". En el nivel más bajo, el proceso de arranque es lo que hace la MCU cuando se enciende por primera vez, antes de que comience a ejecutar el código de usuario. En un nivel superior, "arrancar" puede referirse a lo que usted, como desarrollador, le indica al dispositivo que haga antes de iniciar el programa de aplicación real.

Antes de que la MCU pueda ejecutar cualquier instrucción, debe saber dónde encontrar esas instrucciones. En piezas ARM, el procesador espera leer primero la tabla de vectores. Esta es una lista de al menos cuatro punteros:

  • El puntero de pila inicial
  • La ubicación de la rutina de reinicio
  • La ubicación de NMI ISR
  • La ubicación de ISR de falla dura
  • Ubicaciones ISR adicionales, para cualquier interrupción que implemente el dispositivo (técnicamente, estas son opcionales)

Esta información se proporciona en la documentación de ARM.

La tabla de vectores generalmente estará al comienzo de su binario ejecutable, por lo que el procesador cargará la dirección de pila inicial en su puntero de pila y luego saltará a la ubicación de la rutina de reinicio (el vector de reinicio).

Normalmente, el procesador espera encontrar la tabla de vectores al principio de la memoria flash. Algunas MCU tienen una memoria de configuración dedicada que se puede usar para indicarle a la MCU que busque la tabla de vectores en una ubicación diferente. Algunas de estas partes tienen cargadores de arranque incorporados en ROM dedicada, separados del flash normal, y se pueden configurar para ejecutar estos cargadores de arranque antes de iniciar la aplicación para permitir la actualización del firmware sin usar una sonda de depuración. Sin embargo, no parece que el S32K146 tenga estas opciones, a simple vista. Esto significa que la MCU siempre buscará la tabla de vectores al comienzo del flash siempre que se encienda o se reinicie. Tendría que profundizar en la documentación, en particular el Manual de referencia, para verificar esto. Para ver un ejemplo de un procesador que tiene esta función, puede consultar la serie STM32F4 de ST.

En un nivel superior, puede escribir su propio código de inicio, que se ejecuta cuando el dispositivo se inicia por primera vez y luego "arranca" en la aplicación. Esta es una arquitectura de cargador de arranque convencional, en la que coloca su cargador de arranque al comienzo de flash, y cuando esté listo para ejecutar la aplicación real, el cargador de arranque puede hacerlo de la siguiente manera:

  • Actualizar el registro de compensación de la tabla de vectores a la dirección de la nueva tabla de vectores (generalmente al comienzo de su aplicación, donde sea que esté almacenada)
  • Actualizar el puntero de pila al primer valor en la nueva tabla de vectores
  • Saltando al vector de reinicio

En ese momento, el procesador comenzará a ejecutar su aplicación, casi como si hubiera arrancado desde esa ubicación en primer lugar. Digo casi porque es importante darse cuenta de que este tipo de proceso de arranque NO restablecerá el estado de la MCU (en particular, el estado de los periféricos) a sus valores de encendido. Esta es una de las razones por las que un programador defensivo será muy minucioso en sus rutinas de inicialización.

Una cosa adicional a tener en cuenta, en plataformas como ARM, es posible ejecutar código almacenado en casi cualquier lugar. Entonces, es posible, por ejemplo, tener un gestor de arranque que cargue una aplicación desde una memoria externa en la RAM de la MCU y luego ejecute la aplicación desde la RAM. Esta capacidad a veces es explotada por herramientas de depuración, que pueden escribir una pequeña aplicación en la RAM para hacer cosas como cargar datos en una memoria flash externa.