¿STM32F042 falló al reiniciar el hardware?

2

Fondo

Estoy trabajando en un proyecto escolar donde he diseñado un prototipo de PCB cuyo núcleo es un microcontrolador STM32F042K6T6. Estoy usando el ST-Link de una tarjeta Nucleo STM32F401RE para programarlo.

Problema

Al programar el dispositivo con un código simple para encender un LED, el LED no se encenderá . Durante la solución de problemas, accidentalmente me di cuenta de que el LED se encendería después de un nuevo "encendido" (sin cambiar el código ni reprogramar la MCU), simplemente tirando de la fuente de alimentación y luego reconectándola.

Esto me llevó a creer que algo estaba mal con el reinicio del dispositivo después de la programación. Para probar esto, comencé desde un LED brillante después del encendido, y luego presioné el botón de reinicio para reiniciar el hardware. Como se sospechaba, el LED se apagaría y luego no volvería a encenderse. Luego, cuando desconecto la alimentación y la vuelvo a conectar, se enciende.

Otras observaciones que considero que podrían ser preguntadas.

  • Los niveles de voltaje del dispositivo parecen buenos, el desacoplamiento se coloca de acuerdo con la hoja de datos.
  • El restablecimiento se implementa con un levantamiento externo con una resistencia de 10k a 3.3V y luego un botón para poner en cortocircuito a tierra en el restablecimiento y una tapa paralela de 100 nF hasta el suelo. (Esto está conectado al pin NRST en la MCU, así como al pin NRST en el conector de programación).
  • El LED es un LED SMD simple con una resistencia de la serie de 180 ohmios colocada en GPIO PB5. (De hecho, tiene 3 LED de estado diferentes en la pizarra y puede iniciarlos todos en código

He sondeado la señal "analógica" del pin de reinicio, y para mí la señal parece estar bien, bajando cuando hago clic / sostengo el botón de reinicio. Y cuando el LED se apaga al hacer clic en el botón de reinicio, creo que comienza a reiniciar el programa. Sin embargo, no parece reinicializar completamente y comenzar a ejecutar código desde el inicio de 'main ()'? Cuando el código realmente funciona para encender el LED después de un reinicio de encendido. Por lo tanto, parece que las instrucciones correctas se han cargado en la memoria del programa, pero los reinicios (tanto durante la programación como al hacer clic en el botón de reinicio) no logran reinicializar el archivo.

Cualquier ayuda sería muy apreciada.

    
pregunta Mattias Wallin

1 respuesta

3

Mi apuesta está en boot0; Comprueba que lo hayas bajado.

El pin boot0 selecciona dónde iniciará MCU la ejecución del código desde el inicio, es decir. sale de reinicio. Si boot0 es bajo, ejecutará su código desde flash, pero si es alto, ejecutará el gestor de arranque interno desde la memoria del sistema.

Mi conjetura es que has dejado boot0 flotando, y cuando estás haciendo un arranque en frío (es decir, desconectando y volviendo a conectar la alimentación), estará cerca de cero, por lo que la MCU iniciará tu código desde el flash, pero cuando realice un arranque en caliente con la señal de restablecimiento, el pin habrá flotado a un valor más alto, se leerá como alto y la MCU iniciará el cargador de arranque interno desde la memoria del sistema en lugar de su código.

Esta explicación asume que no ha tocado los bytes de opción relacionados con el arranque, lo que cambiaría el comportamiento. Además, en caso de que esté trabajando con diferentes MCU STM32 en algún momento, tenga en cuenta que pueden tener un comportamiento ligeramente diferente. Algunos tienen diferentes bytes de opción relacionados con el arranque. Todo lo que he visto hasta ahora ha tenido un pin boot0 que se comporta de manera idéntica, pero algunos también tienen un pin boot1 (que podría compartirse con un gpio pin) que quizás también deba configurar correctamente. Sin embargo, en las MCU que recuerdo haber visto, boot1 solo es relevante si quieres poder arrancar desde la memoria del sistema o la SRAM.

    
respondido por el Aleksi Torhamo

Lea otras preguntas en las etiquetas