¿Cuál es el valor presente en la primera dirección de la memoria flash de stm32 para cada firmware?

Cada firmware de los microcontroladores Stm32, el primer valor comienza con 0x2XXXXXXX, mientras trabajaba con cargadores de arranque personalizados, descubrí que esta es una dirección en SRAM,

ingrese la descripción de la imagen aquí

1) ¿Qué hay realmente presente en esta dirección de SRAM?

2) En cargadores de arranque personalizados ¿Cuál es la importancia de configurar el MSP en esta dirección en SRAM, antes de llamar al controlador de reinicio de la aplicación de usuario?

uint32_t msp_value = *((volatile uint32_t *)FLASH_SECTOR2_BASE_ADDRESS);
__set_MSP(msp_value);
app_reset_handler();

Respuestas (1)

Cada firmware de los microcontroladores Stm32, el primer valor comienza con 0x2XXXXXXX, mientras trabajaba con cargadores de arranque personalizados, descubrí que esta es una dirección en SRAM

Como se documenta en el Manual de referencia técnica para cualquiera de los núcleos ARM Cortex M-cualesquiera que sean, esta es la dirección inicial del puntero de la pila.

Cuando el chip realiza un reinicio real , esta dirección se carga en el puntero de la pila mediante la lógica de reinicio.

Tradicionalmente, esto está en la parte superior de la RAM, o tal vez un poco más abajo si elige reservar cualquier dirección allí para pasar indicadores a través de reinicios suaves o similares. En una cadena de herramientas de estilo gcc, generalmente se designa en el script del enlazador y el enlazador lo inserta en lugar de los símbolos dejados en el código por etapas anteriores de compilación.

1) ¿Qué hay realmente presente en esta dirección de SRAM?

Esperemos que nada que le importe a nadie. El contenido de la dirección inicial y un área sustancial (¡y no del todo determinante!) a continuación pronto se sobrescribirá con las operaciones ordinarias de la pila.

2) En cargadores de arranque personalizados ¿Cuál es la importancia de configurar el MSP en esta dirección en SRAM, antes de llamar al controlador de reinicio de la aplicación de usuario?

Esencialmente, el cargador de arranque estaría simulando lo que haría el hardware si arrancara directamente usando ese bloque de vectores como el bloque de vectores real. Si bien técnicamente nada en el hardware miraría el valor del puntero de pila inicial en un bloque vectorial que no está en efecto en el reinicio, leer esto con software y actuar como el hardware le daría al firmware de destino mucha de la flexibilidad que tendría si hubiera sido arrancado directamente, siempre que, por supuesto, no se haya vinculado a la región del cargador de arranque y no sobrescriba ninguna RAM (o registros RTC) que el cargador de arranque podría estar usando como indicadores para un reinicio suave para ingresar el firmware de destino en un nuevo caso reiniciado con el estado del periférico no corrompido por el uso del gestor de arranque.