He escrito un cargador de arranque para mi placa, pero genera una falla grave cuando salta al código de la aplicación.
Mi error es como esta pregunta:
El cargador de arranque salta al problema de la aplicación principal usando STM32 con Keil Uvision
Hice estos pasos: en el código de la aplicación :
luego escribí un código simple (parpadeo)
en el código del cargador de arranque : recibo el archivo .bin con USART y luego lo escribo en la dirección 0x8030000 de FLASH y el siguiente código:
USART_DeInit(USART1);
RCC_DeInit();
__set_CONTROL(ENABLE_PRIVILEGE_MODE);
NVIC->ICER[ 0 ] = 0xFFFFFFFF ;
NVIC->ICER[ 1 ] = 0xFFFFFFFF ;
NVIC->ICER[ 2 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 0 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 1 ] = 0xFFFFFFFF ;
NVIC->ICPR[ 2 ] = 0xFFFFFFFF ;
SysTick->CTRL = 0 ;
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk ;
SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk |
SCB_SHCSR_BUSFAULTENA_Msk |
SCB_SHCSR_MEMFAULTENA_Msk );
__disable_irq();
if( CONTROL_SPSEL_Msk & __get_CONTROL( ) )
{ /* MSP is not active */
__set_MSP( __get_PSP( ) ) ;
__set_CONTROL( __get_CONTROL( ) & ~CONTROL_SPSEL_Msk ) ;
}
JumpAddress=(FLASH_WRITE_ADDRESS+4);
JumpToApplication =(void(*)(void))(*((uint32_t*)JumpAddress));
__set_MSP(*(__IO uint32_t*)FLASH_WRITE_ADDRESS);
JumpToApplication();
Pero va a fallar. Así que ahora uso esta parte del código:
/* Jump to user application */
JumpAddress = *(volatile uint32_t*)(FLASH_WRITE_ADDRESS+4);
JumpToApplication = (pFunction) JumpAddress;
__set_MSP((*(volatile uint32_t*) FLASH_WRITE_ADDRESS));
now_pointer=__get_MSP();
JumpToApplication();
pero es lo mismo que antes. ¿Cual es el problema?
Este es un segundo antes de saltar al código de la aplicación:
Y este es el resultado de saltar al código de la aplicación:
okey.ahora, encuentro y resuelvo el problema: puse mi escritura en FLASH imagen de error:
Lo más probable es que utilice el código de inicio estándar del STM en la aplicación de usuario. Establece VTOR al comienzo de la memoria FLASH. Elimina esta línea y debería funcionar.
Encuentro mi error y lo soluciono. Ahora mi cargador de arranque funciona correctamente.
pero mi problema:
1- i contraté, cambie la línea de dirección del vector, después de principal en el archivo de la aplicación.
2- comenté estas líneas en el archivo del gestor de arranque:
__disable_irq();
__set_MSP((*(volatile uint32_t*) FLASH_WRITE_ADDRESS));
Aparte de eso, tuve un error al escribir en flash (no con respecto al pequeño indio)
y ahora mi código funciona correctamente
gracias de todos me ayudan a resolver este problema.
Como la corteza m0+ no tiene algunos de los sofisticados intermedios de 32 bits o incluso de 16 bits y como compilará hasta un límite de 1K, solo tiene que apuntar a la nueva tabla de vectores con un desplazamiento de 8 bits a la izquierda.
if ( firm1 > firm2) __asm("movs r0, #0x40"); // firmware at 0x4000
else __asm("movs r0, #0xa0"); // for firmware at 0xa000
__asm("lsls r0, r0, #8");
__asm("ldr r1, [r0]");
__asm("msr msp, r1"); // Set new MSP
__asm("msr psp, r1"); // PSP based on SP
__asm("ldr r1, [r0,#0x4]");
__asm("mov pc, r1"); // Jump by changing PC
chris stratton
hadisamani1996
eliot alderson
viejo contador de tiempo
viejo contador de tiempo
viejo contador de tiempo
viejo contador de tiempo
brahans
Jeroen3
hadisamani1996