Red de conocimiento informático - Problemas con los teléfonos móviles - confusión de aprendizaje stm32

confusión de aprendizaje stm32

Porque la dirección de inicio de Flash diseñada por STM32 comienza en 0x0800 0000. Todo el código solo se puede almacenar desde aquí. Consulte la página 54 del manual de referencia de STM32 para obtener más detalles.

Dado que el código se puede almacenar desde aquí, la dirección Flash debe configurarse en 0x0800 0000 en el MDK. La siguiente es la página de configuración del MDK. Debería haber visto esto:

. Esto seguirá funcionando. Hay un problema. En teoría, CM3 estipula que la CPU comienza la ejecución desde la dirección 0 después del encendido, pero la tabla de vectores de interrupción aquí está programada en la dirección 0x0800 0000. Esto se debe a que el Flash de STM32 solo se inicia. desde 0x0800 0000. Sin embargo, SMT32 no puede romper las "reglas" establecidas por ARM, por lo que realiza un proceso de mapeo de arranque, que está relacionado con BOOT0 y BOOT1 que siempre se puede ver en el chip. Cuando se selecciona el modo de arranque Flash principal, el chip arranca. , la dirección 0x0800 0000 de Flash se asigna a la dirección 0, lo que no afecta la lectura del núcleo CM3. Por lo tanto, en este momento, CM3 puede acceder a la tabla de vectores de interrupción en la dirección 0 y a la tabla de vectores de interrupción en la dirección 0. Dirección 0x0800 0000 El código todavía está almacenado en la dirección 0x0800 0000. Esto es lo más difícil de entender. De hecho, este es el método de mapeo de inicio utilizado por básicamente todos los chips ARM. ARM7 y ARM9 sin Flash interno suelen hacer esto. Este proceso proviene del manual de referencia de STM32, que se explica:

Tenga en cuenta también que esta tabla de vectores de interrupción se puede asignar nuevamente en el programa. Lo que lo controla es el registro NVIC SCB->VTOR que ha sido especificado por CM3. En el código de inicio proporcionado en la biblioteca STM32, en el archivo startup_stm32f10x_hd.s, la línea 146 lee la ubicación de la interrupción de reinicio en la tabla de vectores de interrupción después del encendido y ejecuta el código de procesamiento de interrupción de reinicio. El código es el siguiente:

; Restablecer controlador

¿Reset_Handler? PROC

¿EXPORTAR? SystemInit

LDR R0, =SystemInit

BLX R0

LDR R0, =__principal

BX? p> ENDP Tenga en cuenta que lo primero que se ejecutará después del reinicio es el código SystemInit. Este código está en el archivo system_stm32f10x.c en el directorio de la biblioteca. Inicializa una serie de operaciones como el reloj y NVIC. el código relacionado con el vector de interrupción:

void SystemInit (void)

{

......

#ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; / * Reubicación de tabla de vectores en SRAM interna */

#else SCB->VTOR = FLASH_BASE |

#endif

}

Se puede ver que la reasignación del vector de interrupción es una compilación selectiva. Por lo general, la definición de macro VECT_TAB_SRAM no está definida, por lo que después de la ejecución. aquí, SCB->VTOR es FLASH_BASE y el valor es 0x0800 0000. En el futuro, cuando CM3 tome el vector de interrupción, tomará el vector de aquí y lo ejecutará de acuerdo con la configuración de SCB->VTOR.

Desde entonces, el vector de interrupción finalmente se volvió positivo.

Tenga en cuenta que la función __main aún no se ha ingresado en este momento. Parece que la posición de reasignación del vector de interrupción aún es lo suficientemente temprana.