Conceptos de arranque de STM32F4 y reubicación de tablas vectoriales

8

Hay algunas cosas que no entiendo sobre el proceso de arranque del microcontrolador STM32F4.

Mi comprensión es la siguiente:

  1. Los arranques ARM Cortex-M4 esperan el valor de inicialización del puntero de pila y los vectores de interrupción en 0x00000000 + SCB->VTOR , mientras que SCB->VTOR se borra al reiniciar.
  2. No hay memoria en esa ubicación. La memoria flash comienza en 0x08000000 , SRAM en 0x20000000 .
  3. Para hacer posible el arranque, el µC puede asignar el rango de memoria flash o SRAM a 0x00000000 . El rango de memoria que se debe asignar está definido por el estado de los pines de arranque.

Mis preguntas:

  1. ¿Por qué el manual de referencia STM32F4 dice en página 69 que

      

    Cuando el dispositivo arranca desde SRAM, en el código de inicialización de la aplicación, debe   reubique la tabla vectorial en SRAM utilizando la tabla de excepciones de NVIC y el registro de compensación.

    ? Desde mi punto de vista, esto no es necesario, ya que la región de la memoria completa tiene un alias de todos modos. Curiosamente, esto no parece ser necesario cuando la región flash se vuelve a asignar a 0x0 space.

  2. El único uso para arrancar desde SRAM puedo pensar si es reducir los ciclos de escritura en el flash durante el desarrollo. Antes de liberar el µC del reinicio, escribe el programa en la SRAM utilizando el depurador y luego inicia desde allí. Sin embargo, como tiene acceso de depurador, no habría restricciones en cuanto a desde dónde arrancar. Entonces, ¿por qué tener esta característica?

    El hecho de que la posición de arranque se derive de los pines indica (al menos en mi opinión) que esta función no se utilizará durante el desarrollo sino en la operación final. Y en la operación final, SRAM es clara en el momento del arranque. Por lo tanto, no tiene sentido arrancar desde SRAM.

pregunta Multisync

1 respuesta

5

Pregunta 1:

Definitivamente no puedo responder tu primera pregunta. Pero en el manual de programación donde se describe el registro VTOR ( página 212 ) indica que el bit 29 se utiliza para determinar dónde se encuentra la tabla vectorial, ya sea en la región del código (0) o en la región SRAM (1).

Ahora no entiendo por qué se debe hacer esto por la misma razón que indica, la SRAM tiene un alias de 0x0, ¿por qué es necesario configurar este desplazamiento?

La única suposición que tengo se indica en la página 69 citada. Dicen:

  

el área de código comienza desde la dirección 0x0000 0000 (se accede   a través de los buses ICode / DCode)

     

el área de datos (SRAM) comienza desde la dirección   0x2000 0000 (accedido a través del bus del sistema)

     

El Cortex ® -M4 con CPU FPU siempre   recupera el vector de reinicio en el bus ICode

Tal vez en una interrupción se usa el bus ICode, que no puede acceder a la SRAM incluso cuando se vuelve a asignar (no sé si esto es cierto). Esto explicaría por qué este bit debe establecerse en consecuencia, indicando al núcleo que use el bus del sistema y acceda a la SRAM.

Pregunta 2:

Si bien puede ser cierto, que la SRAM está vacía en el primer inicio del dispositivo, no es necesariamente para un inicio posterior. Así que podría crear algo así como un dispositivo alimentado por batería que programe su SRAM durante la producción y luego se ejecuta hasta que la batería se agota, lo que eliminaría su SRAM. Supongo que esto haría que la ingeniería inversa del dispositivo sea un poco más difícil.

En un dispositivo alimentado por batería, es probable que use el modo de espera para ahorrar energía, y si deja ese modo, las patillas de arranque se muestrean nuevamente, por lo que deben tener la configuración correcta para volver a la SRAM.

También puede reiniciar el dispositivo de forma segura, ya que el contenido de la SRAM no se destruye si no hay una toma de corriente.

No es una aplicación muy convincente para rectificar todos los problemas para volver a asignar la SRAM.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas