STM32L031 no se ejecuta después de detener la depuración

Estoy usando un STM32L031 con Eclipse para mi aplicación. Cuando está en modo de depuración, todo funciona bien. Pero cuando detengo el modo de depuración o apago y vuelvo a encender, el STM32L031 deja de funcionar.

Esperaba que después de descargar el código en el chip, debería funcionar siempre que lo encienda.

Y como no estoy usando una placa de evaluación, no hay un botón de reinicio, así que no puedo reiniciarlo.

¿Cómo resolver este problema? ¿O hay alguna manera de restablecer el chip sin requerir el hardware del botón Restablecer?

¿Qué está haciendo cuando 'detienes el modo de depuración'? Supongo que todavía hay algunos puntos de interrupción en el código que no se limpiaron antes de reiniciar.
¿Ha cableado el pin NRST de una manera que podría impedir el arranque normal? ¿Utiliza algún tipo de alojamiento parcial que podría impedir el funcionamiento normal (debido a los puntos de interrupción codificados)? ¿El depurador sigue conectado cuando realiza el ciclo de encendido?
Si probablemente tiene una resistencia SMT en la línea NRST, a la que puede soldar un cable pequeño para tirar hacia abajo para un reinicio de prueba. O (al menos si su suministro tiene un límite de corriente) puede simplemente tocar algo conectado a tierra (o mediante una resistencia de bajo valor).
Debería poder volver a conectar el depurador a un objetivo en ejecución; esto ayudará a investigar dónde está atascado.
Supongamos que TIENE una resistencia pull-up en la línea NRST que corta NRST a tierra. Si no lo hace, agregue uno de 10kOhm. Además, ¿cómo está cableado tu BOOT0?
"Esperaba que después de descargar el código en el chip, debería funcionar siempre que lo encienda": esto solo es cierto si carga el código en flash y programa su MCU para que arranque desde allí.

Respuestas (2)

Una cosa que puede hacer que deje de ejecutarse es si está utilizando semi-hospedaje. En las propiedades de su proyecto, intente eliminar los siguientes dos símbolos:

ingrese la descripción de la imagen aquí

Tengo varios proyectos, y solo algunos de ellos requieren la eliminación del semi-hospedaje. Todavía no he averiguado por qué es necesario para unos y para otros no...

Ah, y si apagar y encender la placa no funciona, tampoco lo haría un botón de reinicio.

Semihosting entra en juego si está usando funciones que usan E/S estándar, como printf(). Si no llama a esas funciones, su aplicación no es diferente con y sin semialojamiento.
@duskwuff No tengo experiencia con este controlador en particular, pero AFAIK "aplicación alojada" en C significa que su código comienza con main, a diferencia de las aplicaciones "no alojadas" que comienzan con algo como __program_start. Por cierto, si ejecuta sin hospedaje, debe inicializar STDOUT usted mismo antes de poder usar printf, pero puede que no sea la única diferencia.
@DmitryGrigoryev Cierto, pero el semihosting es algo completamente distinto. Habilitar/deshabilitar el semihospedaje no afecta la forma en que se inician las aplicaciones.

Al usar el depurador, el procesador se ve obligado a ejecutarse desde una determinada región.
En el reinicio de encendido, el cargador de arranque determina dónde debe comenzar. Algunos pines o ubicaciones flash proporcionan instrucciones al gestor de arranque.

stm32l031 opciones de arranque