Forzar el cortex-M3 / 4 desde el ensamblaje

0

Me gustaría forzar mi STM32F4 para que se reinicie en caso de fallo. Intenté copiar NVIC_SystemReset en el ensamblaje como:

    .section  .text.Default_Handler,"ax",%progbits
    Default_Handler:
        dsb
        ldr     r0, =0xE000ED0C
        ldr     r1, =0x05FA0007
        str     r1, [r0, #0]
        dsb
    Infinite_Loop:
        b  Infinite_Loop
    .size  Default_Handler, .-Default_Handler

Pero no se restablece, el programa simplemente se bloquea. ¿Es porque Default_Handler es una interrupción? ¿Me perdí lo obvio?

NVIC_SystemReset funciona bien en el espacio del usuario.

    
pregunta

2 respuestas

1

Está configurando el bit 2 (SYSRESETREQ) del registro de AIRCR para forzar un reinicio de todos los sistemas, excepto la lógica de depuración. Sin embargo, debe permitir la escritura en el registro, escribiendo 0x5FA en VECTKEY, de lo contrario se ignora la escritura. Pero tú estás haciendo eso. Hmmm

Intenta escribir 0X05FA0004

Desde el manual de ST:

Bit 1 VECTCLRACTIVE Reservado para uso de depuración. Este bit se lee como 0. Al escribir en el registro debe escribir 0 a este bit, de lo contrario el comportamiento es impredecible. Bit 0 VECTRESET Reservado para uso de depuración. Este bit se lee como 0. Al escribir en el registro debe escribir 0 a este bit, de lo contrario el comportamiento es impredecible.

    
respondido por el C. Towne Springer
0

No estoy seguro de si este es el problema, pero noté en el código c que en las implementaciones core_cm # .h de NVIC_SystemReset el firmware mantiene el estado de los BITS DE PRIGROUP:

SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */

(consulte enlace )

Escribir la palabra 0X05FA0004 a ciegas no lo hace y me ha causado problemas con mis propias implementaciones del restablecimiento de software en el pasado en el stm32f4.

La lectura en el estado anterior para mantener el estado de esos bits de PRIGROUP en su palabra de reinicio puede resolver el problema.

    
respondido por el gorgoth

Lea otras preguntas en las etiquetas