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!