Bien, me doy cuenta de que esto suena como una pregunta tonta / noob, pero léelo antes de llamarme idiota. En esta etapa, lo tomaré con mucho gusto si puedes detectar dónde me he equivocado.
El escenario:
Tenemos un diseño de PCB operativo existente que utiliza un STM32F051K4, se han construido varias tarjetas & programado y todos han funcionado como se esperaba.
Al poblar una PCB nueva con solo el micro, sus tapas asociadas de suavizado / desacoplamiento y el encabezado BMP / SWD (depuración / ICP), la interrupción de SysTick no se activará y los puntos de interrupción establecidos en el depurador no se activarán (configuración break main
nunca se dispararía!).
He probado varios tableros nuevos, micros de dos lotes diferentes, logrando que un colega más capacitado pueda soldar el tablero ... ¡y ninguno de ellos funciona!
El entorno completo:
Las placas son un PCB bastante básico con microprocesador STM32F051K4U6 / K6U7 (paquete UFQFPN32) más un par de condensadores de 100n / 4u7 alrededor del riel 3v3.
En la configuración de prueba, la tarjeta se alimenta, programa y depura mediante una sonda Black Magic (BMP) a través de GDB.
El firmware se basa en el código generado desde STM32CubeMX usando bibliotecas de bajo nivel (LL), compilado en SW4STM32, inicializando solo el reloj / systick básico del sistema y configurando todos los pines GPIO en analógico (flotante / Alto Z).
El pseudocódigo de todo esto es el siguiente: inicio estándar puramente generado por CubeMX:
LL_Init();
SystemClockConfig(); // Include SysTick IRQ
LL_SYSTICK_EnableIT(); // Enable the SysTick interrupt
MX_GPIO_Init();
while(1)
{
count++;
//optionally toggle a pin here to prove it's running
}
El SysTick_Handler
simplemente incrementa una variable global ticks
.
Luego, el bucle principal simplemente incrementa el conteo mientras esperamos el SysTick que nunca llega.
El código se compila y, a través de GDB / BMP, se descarga y ejecuta: en la placa "buena" puedo establecer break main
y break SysTick_Handler
y ambos se activarán tan pronto como se ejecute la placa.
En los tableros "malos", los puntos de interrupción nunca se activan y la interrupción nunca se dispara (las marcas permanecen en 0) a pesar de que el bucle principal cuenta hacia arriba (y, si alterno un pin en main()
, puedo verlo). Sin embargo, el micro puede ser detenido y de un solo paso y GDB no informa de errores al establecer puntos de interrupción. programación, etc.
He comprobado los vectores de interrupción en el código de inicio y son los esperados.
Estoy realmente sorprendido por esto, mi mejor suposición es que hay un pin que se debe subir o bajar o algo así, o tal vez se necesite un alisado de riel eléctrico adicional en algún lugar que la placa completamente llena introduzca, pero NO espere que el micro / depurador sea tan sensible?
Revisé y volví a verificar el código, las placas, los componentes instalados, el trabajo de soldadura y mi cordura (TBC) en vano.
¡Cualquier idea recibida con gratitud en esta etapa!
Edite para abordar las preguntas en los comentarios (en orden y como pueda):
@ChrisStratton:
El binario es idéntico cada vez, desde la placa de trabajo en funcionamiento, estoy separando GDB, emitiendo BMP "desactivación de alimentación", intercambiando tarjetas, "habilitación de alimentación", escanear, volver a conectar, cargar el binario, ejecutar. No tocar el IDE en absoluto.
Es difícil estar 100% seguro de que la almohadilla de tierra está soldada ya que está debajo del chip en el UFQFPN32. Todos los pines de alimentación (2x VDD + VDDA) están conectados y tienen tapas de suavizado según la hoja de datos.
No he probado (aún) otras interrupciones, ya que tendría que escribir código nuevo para interrumpir desde un pin GPIO, por ejemplo.
No tengo una placa de descubrimiento con este micro, así que no puedo intentarlo.
Enlazador & Los arranques son generados por CubeMX para esta parte y obviamente están trabajando en la junta "buena" sin modificaciones.
@SamGibson:
La placa "pelada" tiene periféricos negativos, como MAX232, I2C EEPROM, regulador de voltaje externo, etc., solo tiene el micro, el encabezado de depuración y las tapas de la fuente de alimentación / pullups relevantes (BOOT0, NRST) instalados.
Actualmente no estoy en posición de publicar fotos / esquemas, lo haré si puedo.