while programacion infinito for ciclos ciclo arm embedded stm32

arm - infinito - ciclos en programacion pdf



NVIC_SystemReset() atascado en el ciclo while(STM32F302VB) (1)

Actualmente estoy desarrollando un STM32F302VB y necesito realizar un reinicio del software. En todos mis proyectos anteriores (con STM32F427 y STM32F030C8), siempre utilicé la función NVIC_SystemReset () con éxito. Pero por alguna razón, no funcionará con este chip. La implementación se encuentra en CMSIS core_cm4.h y es la siguiente:

__STATIC_INLINE void NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ while(1); /* wait until reset */ }

Se llama a la función y se ejecutan todas las instrucciones, pero se queda atascada en el ciclo while y nunca se restablece. Luego tengo que restablecerlo a través de JTAG para sacarlo de ese estado.

Revisé el manual de programación y la implementación parece estar bien (no es sorprendente, ya que funciona perfectamente en F4 y F0).

Realmente no sé cuál podría ser el problema, ¿alguien tiene una idea de lo que está pasando?

Editar: La función todavía no funciona pero, como solución alternativa, después de que la función se atasque, tiro hacia abajo el pin nRST y luego hacia arriba. Es feo, pero funciona por ahora. Sin embargo, preferiría hacerlo todo en software.


Tony K estaba en lo cierto en su comentario, el pin nRST en realidad se estaba tirando alto externamente, debido a un error de enrutamiento.

Y al contrario de lo que pensaba, el pin nRST se tiene en cuenta incluso en un restablecimiento de software: el manual de referencia dice: "Las fuentes [Reset] actúan en el pin NRST y siempre se mantienen bajas durante la fase de retardo", así que debería ¡han conocido!

¡Eliminar el pull-up hizo el truco, la función NVIC_SystemReset () ahora funciona como se esperaba!

¡Muchas gracias!