STM32F091 Saltar al cargador de arranque desde la aplicación

2

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?

    
pregunta MarcelNubi

2 respuestas

3

El problema fue con el estado periférico USART1. Los valores del registro de configuración USART1 se llevaban a la ejecución del cargador de arranque, lo que posiblemente causaba problemas para el cargador de arranque propietario. La solución fue restablecer USART1 a través de RCC_APB2RSTR.

La función ahora es:

void SB_SystemBootloaderJump()
{
    typedef void (*pFunction)(void);
    pFunction JumpToApplication;

    __HAL_RCC_USART1_FORCE_RESET();
    HAL_Delay(5);
    __HAL_RCC_USART1_RELEASE_RESET();
    HAL_Delay(5);

    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();
}
    
respondido por el MarcelNubi
0
  

Ya que estoy usando la dirección de memoria absoluta del sistema, no es necesario usar __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH ().

... si su programa definitivamente no accede a la memoria "baja". No te olvides de volver a asignar la tabla de interrupciones.

  

¿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?

Si realmente está utilizando los pines USART (no la emulación USB en serie): Abrir / cerrar el puerto serie solo debería afectar a las líneas de control, no a las líneas de datos. En la mayoría de los casos, las líneas de control ni siquiera estarán conectadas a la CPU.

    
respondido por el Martin Rosenau

Lea otras preguntas en las etiquetas