Frecuencia de muestreo / frecuencia de reloj extrañas de ADC en la placa STM32F401

0

Utilizo un temporizador para activar el muestreo de ADC en STM32F401, y la rutina de servicio de interrupción de ADC alternará un pin GPIO para que pueda medir la frecuencia de muestreo de ADC utilizando un osciloscopio (que debe ser igual a la frecuencia del temporizador). Sin embargo, los resultados que obtengo de dos escenarios, uno en un tablero Discovery y el otro en mi propio tablero, son diferentes. Me pregunto si tiene algo que ver con la conexión de cristal.

En ambos casos, la frecuencia de la CPU se establece en 84 MHz y la frecuencia del temporizador se reduce a 16 kHz. También se utiliza un cristal externo de 8MHz.

Primero hago pruebas en placa de descubrimiento STM32F401 que utiliza STM32F401VCT6. El pin GPIO alterna con una frecuencia de 16 kHz. Así que creo que el código está funcionando.

Después de eso hago mi propia placa con el MCU siendo STM32F401RBT6. Puedo programar y depurar el código a través de SWD sin problema, pero el pin GPIO alterna con una frecuencia de ~ 5.1kHz. El código es prácticamente igual, la única diferencia es que uso un pin ADC diferente (por lo tanto, el cambio correspondiente en el firmware), lo cual no debería importar.

La parte STM32F401 del esquema de mi propio diseño se muestra a continuación:

Lapartedeldiseñorelacionadoconlaconexióndecristalenmiplacaestáaquí:

El cristal de 8MHz en mi placa es ABLS-8.000MHz-B2-T que necesita un condensador de carga de 18pF. Yo uso dos condensadores 5% 18pF. He probado el pin del oscilador con un osciloscopio (a pesar de la capacidad de la sonda puede jugar un papel). Puedo ver señales de voltaje de onda sinusoidal de 8 MHz, pero la amplitud no es de riel a riel.

La parte cristalina del esquema del tablero de descubrimiento STM32F401 es:

Puede ver que tiene una resistencia de la serie de 220 ohmios en el pin PH1-OSC_OUT, que no tengo en mi tablero.

¿Alguien podría por favor avisarme de lo que hice mal?

    
pregunta shva

1 respuesta

0

La causa fue una mala configuración de PLL como lo sugirió Krunal después de revisar la función SystemInit (). Ahora el reloj funciona correctamente.

    
respondido por el shva

Lea otras preguntas en las etiquetas