Stm32f descubrimiento reloj interno

2

He configurado el descubrimiento del STM32F4 para generar audio con el códec incorporado I2S y todo funciona bien cuando se utiliza la herramienta Excel de la herramienta de configuración de reloj de cristal de 8MHz externo y reloj ST de HSE.

La rareza ocurre cuando se cambia al reloj interno de HSI.

De acuerdo con la hoja de datos, el reloj interno se fija en 16MHz, lo que sugiere que el único cambio significativo en PLL y divisores es que el divisor PLL_M debe ser / 16 para HSI en lugar de / 8 cuando se usa cristal (HSE).

El resto de la configuración del reloj debe ser la misma.

Después de generar el código de inicio del sistema con la herramienta, la frecuencia de muestreo ahora es de 83 kHz, no de 48 kHz, como ocurre con el XTAL externo de 8 MHz.

¿Está el reloj interno stm32f4 a 16MHz como se indica en la hoja de datos o algún otro valor? La única forma en que puedo obtener la frecuencia de muestreo correcta es usar / 25 para PLL_M.

No puedo encontrar ninguna discusión sobre esto porque imagino que la mayoría de los usuarios siguen con la XTAL, pero quiero diseñar mi propia placa y quiero reducir la cantidad de piezas usando el reloj interno. ¿Alguien más intentó usar el reloj interno?

    
pregunta Bruce Duncan

1 respuesta

5

Está bien, lo he descubierto. Hay un error en el archivo del controlador periférico STM32F4xx_spi.c eso no permite el uso del valor HSI (reloj interno) necesario para calcular el divisor apropiado y los valores impares para el registro I2SPR. (ver la última línea) Lo cambié a:

  i2sclk = (uint32_t)(((HSI_VALUE / pllm) * plln) / pllr);

y ahora funciona. Horas desperdiciadas como siempre !! La herramienta de configuración del reloj también es incorrecta, ya que crea un mensaje en el archivo system_stm32F4xx.c que indica

*        To achieve the following I2S config:   |
*         - Master clock output (MCKO): ON      |
*         - Frame wide                : 16bit   |
*         - Audio sampling freq (KHz) : 48      |
*         - Error %                   : 0.0186  |
*         - Prescaler Odd factor (ODD): 0       |
*         - Linear prescaler (DIV)    : 2       |

que entra en conflicto con los programadores hacen referencia a que ODD = 1 y DIV = 3 para una frecuencia de muestreo de 48 kHz, lo cual es correcto.

/* Get the PLLI2SN value */
plln = (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6) & \
                  (RCC_PLLI2SCFGR_PLLI2SN >> 6));

/* Get the PLLI2SR value */
pllr = (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28) & \
                  (RCC_PLLI2SCFGR_PLLI2SR >> 28));

/* Get the PLLM value */
pllm = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM);      

/* Get the I2S source clock value */
i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr);
    
respondido por el Bruce Duncan

Lea otras preguntas en las etiquetas