Rectificación del diseño fallido del oscilador de cristal MCU

Estoy trabajando en un proyecto de pasatiempo SMD (placa de 2 capas) donde uso una MCU STM32F405 que funciona a 3.3V, sincronizada desde un cristal externo de 25MHz. Siendo impaciente, rápidamente diseñé un tablero y lo ordené. Sin embargo, aparentemente me he perdido muchos puntos con respecto al diseño de PCB con respecto al cristal externo.

El resultado no funcionó tan bien como cabría esperar. Cuando cambio al oscilador externo, la CPU parece funcionar. Pero el reloj de la MCU es muy lento, y encender y apagar un GPIO en el bucle principal produce una onda cuadrada de aproximadamente 1 kHz (todavía no he tenido tiempo de verificar la frecuencia usando un pin de salida de reloj).

El cristal oscila a 25 Mhz, pero solo mido una onda sinusoidal con una amplitud ligeramente inferior a 500 mV pp (usando una sonda de osciloscopio x10). Esperaría que esto esté más cerca del voltaje de suministro de 3,3 V (no puedo encontrar mucha documentación que indique lo que se debe esperar). Tampoco entiendo cómo funciona la MCU, ya que definitivamente no se detiene en el ciclo. esperando que el oscilador comience. Pero no funciona al menos a la velocidad correcta. Así que cualquier pista sobre lo que está pasando sería apreciada.

Después de estudiar el tema del diseño de PCB de cristal MCU con más detalle, tengo una idea bastante buena de lo que hice bien y dónde fallé espectacularmente. Pero todavía estoy bastante confundido sobre cuál es la forma correcta definitiva de hacer esto.

Las cosas que tengo correctas:

  • Las huellas del cristal son cortas, a unos 6 mm de la MCU.
  • Las huellas son simétricas.

Lo que tengo muy mal es:

  • Usé un plano de tierra debajo del cristal y las pistas a la MCU, lo que probablemente causó una capacitancia parásita muy alta.

  • Entendí completamente mal el concepto de "anillo de guardia". Agregué una zona de relleno de la capa superior (alrededor del cristal), cosiéndola al plano del suelo en su lugar.

  • Usando un cristal de 25 MHz en lugar de uno de 8 Mhz. La configuración de PLL sugerida por STMCubeMx parece dividir la entrada a 1 Mhz, antes de multiplicarla hasta 168 Mhz. Entonces, supongo que un cristal de 8 MHz debería funcionar bien.

  • La línea de reinicio pasa justo debajo del cristal. Sin embargo, eso a su vez está conectado al JTAG y un botón, y por lo demás es pasivo.

Por lo tanto, sospecho que la capacitancia parásita del diseño explica el bajo Vp-p en el oscilador de 25 MHz. Entonces, como primer remedio, planeo cambiar a un cristal de 8MHz para que funcione. ¿Tiene sentido mi suposición aquí, y un cristal de 8 MHz tendría más posibilidades de funcionar en mi placa defectuosa? (Me gustaría que la placa actual funcione, incluso si el diseño no es óptimo o es realmente malo).

Por supuesto, el plan final es hacer una segunda placa de revisión donde se fije el diseño. Pero hay un par de cosas que todavía encuentro confusas en los documentos que he leído hasta ahora:

  • Algunos documentos recomiendan NO usar un plano de tierra debajo del cristal, sino colocar un anillo protector alrededor del circuito y conectarlo al pin de tierra de la MCU más cercano. Esto tiene sentido para mí, sin embargo:

  • Algunos otros documentos recomiendan colocar un plano de tierra separado debajo del cristal (además del anillo de la capa superior) y conectarlo a la tierra de MCU más cercana en un solo lugar. Sin embargo, no veo cómo esto sería mejor que la capacitancia de mi diseño actual, ya que el plano "separado" también estaría conectado al plano de tierra principal. Entiendo que el ruido de RF sería mucho mejor. Pero contradice mi suposición de que la capacitancia parásita es la razón por la que mi diseño actual produce una salida de oscilación tan débil.

Por lo tanto, cualquier explicación con respecto a esta aparente contradicción sería apreciada. Además, cualquier otro consejo para mí con respecto a la "mejor manera" de diseñar mi tablero Rev2 sería muy apreciado.

EDITAR: Las imágenes de la PCB se encuentran a continuación. C3 y C4 son los capacitores y R6 (que está entre los Caps) es Rext. (Perdón por el mal contraste).

Capa superior de PCB Capa inferior de PCB

¿Puedes publicar una foto de tu antiguo diseño? Todo y acercado al oscilador sería útil :)
Para obtener la frecuencia real, puede usar un temporizador y alternar un GPIO en desbordamiento / subdesbordamiento. Además, verifique que la salida tenga una sincronización constante (si salta un poco, la amplitud del oscilador definitivamente sería sospechosa).
Creo que está sacando conclusiones precipitadas cuando sospecha que la amplitud del oscilador es demasiado baja. Es muy posible que los pines X1 y X2 en la MCU funcionen de esa manera. De todos modos, verifique la frecuencia de esta señal (preferiblemente el pin X2) y vea si está cerca de la frecuencia correcta.
También podría tener un problema con la programación de los registros de selección de reloj y configuración de PLL. A menos que tenga una comparación directa 1::1 con alguna placa de referencia de trabajo conocida, la programación es un detalle que debe verificar una y otra vez.
Parece que tiene muchos problemas, con respecto al plano de tierra no deseado, puede cortar secciones con un bisturí / cuchillo afilado y su soldador para separar el cobre de la fibra de vidrio. No se verá bonito, pero funcionará. También asegúrese de que los valores de los condensadores utilizados para el cristal sean correctos y que generalmente se sugiere un diseño de pista en la hoja de datos del cristal.
Olvidé mencionar que el seno que mido en el pin osc_out tiene la frecuencia correcta de 25 MHz. Publicaré fotos del diseño tan pronto como sea posible. Soy un completo principiante en el diseño de PCB, y esto es mucho "aprender haciendo" para mí. También es por eso que solicito su opinión experta, ya que la documentación disponible (en la que he pasado muchas horas leyendo ahora) todavía me confunde y parece contradictoria y desprovista de detalles útiles (como Vp-p esperado y qué sucede si obtiene está mal).
Felicitaciones por el funcionamiento del oscilador. La razón para tener una pequeña región de TIERRA debajo del cristal y sus trazas, con esa lámina CONECTADA A TIERRA que no se usa para nada más, es para evitar inyectar picos rápidos en el circuito que causen alteraciones en la forma de onda y cruce por cero. -errores de temporización. Esto se llama jitter (o ruido de fase no aleatorio).

Respuestas (3)

Si el cristal oscila a 25 MHz, entonces su problema aparente está en otra parte, tal vez la configuración del divisor de reloj, PLL o lo que sea que incorpore ese chip en particular. Asegúrese de que su medida no afecte la oscilación.

Ninguno de los elementos que menciona son probablemente asesinos de negocios. Es bastante normal que los voltajes en el cristal sean pequeños en relación con el voltaje de suministro, incluso cuando se miden correctamente con una sonda FET.

A veces, incluso se usa una resistencia en serie para reducir la unidad a fin de evitar dañar el cristal con una potencia de unidad excesiva, especialmente para cristales SMT pequeños que están limitados a 100 uW o menos.

Gracias por tu contribución. Para el código de prueba, utilicé un ejemplo basado en la biblioteca libopemcm3 para configurar el reloj (ya que esta biblioteca es muy fácil de usar). Pero intentaré generar código desde STMCubeMX y ejecutar esto en su lugar, solo para verificar si obtengo el mismo resultado. La lib utilizada, por supuesto, puede estar rota. Como se mencionó, también intentaré habilitar el pin de salida MCO1, lo que debería darme una forma de medir el reloj real utilizado por la MCU.

Como se señaló en las respuestas anteriores y en varios comentarios, resulta que el problema fue causado por una configuración incorrecta de PLL. El problema parece estar en "libopencm3", que utilicé por su simplicidad para configurar el reloj. Lo he usado con éxito en varias placas de desarrollo, pero parece tener algunos problemas con la configuración de cristal de 25 MHz para STM32F405 al menos. (Notificaré a los desarrolladores).

Creé una configuración muy básica usando STM32CubeMX, y la placa ahora ronronea como un gatito. También habilité el MCO1 para HSE, y me da una salida estable de 24.9998Mhz en PA8.

Muchas gracias a todos los que contribuyeron en esta publicación, por tomarse su tiempo para orientarme en la dirección correcta. Probablemente habría pasado muchas más horas y probablemente habría diezmado mi tablero por completo sin su ayuda. Además, ahora tengo información muy valiosa sobre los cambios de diseño para mi próxima revisión, y he aprendido muchas cosas muy útiles :-)

EDITAR: Resulta que el problema raíz no fue causado por mi código original ni por LibOpenCm3. El problema fue causado por el sistema de compilación Meson, y es la primera vez que intento usarlo en un proyecto STM32. De forma predeterminada, inyecta el indicador del compilador gcc "-fPIC", que a su vez resultó en que se pasara un puntero NULL a la función de configuración del reloj libopencm3 (no estoy seguro de por qué, pero puede ser un error de GCC).

Entonces, la función de configuración del reloj terminó configurando el PLL a partir de los datos ubicados en la dirección de memoria 0x00000000. Estoy bastante sorprendido de que esto haya dado como resultado una salida PLL de 2,44 Mhz y no haya fallado.

Es bastante simple desactivar este indicador pasando las siguientes opciones predeterminadas de mesón al definir el proyecto en el archivo raíz meson.build: 'b_staticpic=false', 'b_pie=false'

Luego eliminé y regeneré el script de compilación ninja, y todo estaba en orden. Mi código de prueba original ahora se ejecuta a la frecuencia de reloj deseada de 168 MHz :-)

Para su diseño de pcb:

  • Usé un plano de tierra debajo del cristal y las pistas a la MCU, lo que probablemente causó una capacitancia parásita muy alta.

Probablemente no sea un gran problema y es poco probable que sea su problema

  • Entendí completamente mal el concepto de "anillo de guardia". Agregué una zona de relleno de capa superior (alrededor del cristal), cosiéndola al plano de tierra en su lugar.

Tampoco es crítico y probablemente no sea su problema.

  • Usando un cristal de 25 MHz en lugar de uno de 8 Mhz. La configuración de PLL sugerida por STMCubeMx parece dividir la entrada a 1 Mhz, antes de multiplicarla hasta 168 Mhz. Entonces, supongo que un cristal de 8 MHz debería funcionar bien.

Esto debe verificarlo con la hoja de datos de su microcontrolador, generalmente puede configurar los PLL para que se ajusten a su cristal, pero seguro que esto puede ser un problema. Las frecuencias deben permanecer dentro de un rango en cada paso del PLL (divisor, multiplicador).

  • La línea de reinicio pasa justo debajo del cristal. Sin embargo, eso a su vez está conectado al JTAG y un botón, y por lo demás es pasivo.

Es poco probable que sea el problema, y ​​​​parece que no tiene un "reinicio".


En una placa de nuevo diseño, el cristal suele ser una molestia, no solo el diseño sino también la configuración correcta del chip, porque es difícil de depurar y es más un proceso de prueba y error hasta que funciona.

A nivel de hardware, primero debe verificar su capacitor de carga, es probable que tenga un problema allí (especialmente si cambió el cristal). Algunos cristales con algunos MCU también necesitan una resistencia en serie, pero nunca he visto "reglas" para definir cuándo debe usarse o los valores, parece más un proceso de prueba y error.

Intente cambiar el límite de carga del cristal con diferentes valores, deben ser alrededor del doble del valor de la hoja de datos porque están efectivamente en serie. Aquí hay más detalles al respecto.

También es muy probable que deba verificar la configuración y el código para el cambio de reloj.

Dejé de usar cristal cuando pude y en su lugar uso reloj externo, por lo general es menos doloroso.

Muchas gracias por tu aporte. De hecho, ya he intentado cambiar los Load Caps. Utilicé algunos que eran demasiado pequeños inicialmente y los reemplacé con 33pF onces. Esto aumentó el Vpp ligeramente por debajo de 500 mV como mencioné en mi publicación (era alrededor de 300 mV antes de hacer esto). El CL del cristal se establece en 20pF. Después de buscar más en Google ahora, puede parecer que el pin STM32 Xin requiere al menos 1.2Vpp para funcionar, pero aún no he encontrado esto en ningún documento oficial de STM :-/
@JohnnyEgeland: verifique cuidadosamente el requisito de 1.2Vpp. Es muy probable que esto se aplique al uso de un reloj externo conectado al pin Xin.
@MichaelKaras - Tienes toda la razón. Supuse que este también era el caso cuando usaba un cristal externo, por lo que deduje que mi oscilación medida era demasiado débil para que funcionara el HSE. Realmente esperaba que la MCU estuviera usando algún mecanismo alternativo (una vez más, algo que leí en un documento no oficial), pero no pude confirmar esto en los documentos de STM. Resulta que el oscilador estuvo funcionando todo el tiempo, incluso con límites de carga muy incorrectos (que ya he corregido). El problema resultó ser la configuración de PLL creada por libopencm3 :-/