Estoy intentando implementar un salto al cargador de arranque STM32F091 USART1 desde mi aplicación.
Estoy usando la siguiente función (basada en enlace ):
void SB_SystemBootloaderJump()
{
typedef void (*pFunction)(void);
pFunction JumpToApplication;
HAL_RCC_DeInit();
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/**
* Step: Disable all interrupts
*/
__disable_irq();
/* ARM Cortex-M Programming Guide to Memory Barrier Instructions.*/
__DSB();
// __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH()
// ;
// /* Remap is bot visible at once. Execute some unrelated command! */
// __DSB();
// __ISB();
JumpToApplication = (void (*)(void)) (*((uint32_t *) ((0x1FFFD800 + 4))));
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) 0x1FFFD800);
JumpToApplication();
}
De la nota AN2606 de la APLICACIÓN: Dirección de memoria del sistema como en la imagen: enlace
De la Utilidad SWD, el contenido de la memoria en la Memoria del sistema: enlace
De Debugger, SP y Reset handler como imagen: enlace
La ejecución del programa hasta el punto de interrupción en la dirección del Bootloader: enlace
Considerando: A - Al usar un puente para VCC en el pin BOOT0, puedo acceder exitosamente al cargador de arranque del sistema a través de la demostración del cargador Flash STM32. Lo mismo no es cierto si salto al cargador de arranque desde mi aplicación. B - Estoy usando un puente USBxSerial FTDI FT230x.
Preguntas:
1 - Ya que estoy usando la dirección de memoria absoluta del sistema, no es necesario usar __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH()
. Correcto?
2: ¿Me estoy perdiendo algo en esta función?
3: ¿hay un tiempo de espera entre el inicio del cargador de arranque y la recepción del byte "0x7F" en USART1?
4 - ¿La apertura / cierre del puerto serie afectará al cargador de arranque? ¿Debo restablecer la MCU si cierro el puerto serie y lo abro de nuevo?