jueves, 6 de abril de 2017

Señal de reloj -ARM Cortex-M4-


La señal SYSCLK, que es el reloj del sistema, puede ser generada de tres maneras diferentes (ver siguiente figura):
- Desde un oscilador interno de 16 MHz (HSI).

- Desde un oscilador externo (HSE).
- Mediante un PLL (PLLCLK), el cual puede modificar la señal creada por HSI o por HSE.

Los periféricos del microcontrolador (salidas digitales, temporizadores, USART, etc.) utilizan frecuencias de reloj iguales o más bajas que SYSCLK, dependiendo de los valores configurados para los prescalers (AHB, APBx) y dependiendo también de qué prescaler esté asociado el periférico.


La fuente de señal de reloj que se emplea en los ejemplos de este blog es PLLCLK. En concreto, lo que se hace es modificar la señal de reloj procedente del cristal X2 de la tarjeta Discovery (HSE), que es de 8 MHz y es externo al microcontrolador.


Las frecuencias de reloj configuradas para los programas de este blog están detalladas en la siguiente figura. La configuración se realiza teniendo en cuenta que la frecuencia máxima para esta familia de microcontroladores es de 100 MHz (ver la señal SYSCLK en la figura anterior). También se consideran las frecuencias máximas a la salida de los prescalers (divisores de frecuencia), según lo indicado en el apartado 6.2 del documento RM0383 Reference Manual: AHB: 100 MHz, APB2: 100 MHz y APB1: 50 MHz.



La configuración de la señal de reloj se lleva a cabo gracias a los siguientes archivos (ver este enlace) y considerando el circuito de la figura anterior:
- startup_stm32f4xx.s
- system_stm32f4xx.c
- stm32f4xx.h

Hay que tener en cuenta lo siguiente:
- Existen versiones más recientes de los anteriores archivos que las empleadas aquí.
- Los valores de frecuencia y los factores de división y de multiplicación, indicados en la figura anterior, pueden ser otros, dependiendo de la frecuencia de reloj deseada y de cómo se obtenga ésta matemáticamente. Aunque siempre se han de tener en cuenta las frecuencias máximas de funcionamiento.

Mediante el código de startup_stm32f4xx.s se llama a la función SystemInit (ver siguiente figura), que está definida en system_stm32f4xx.c.



Para obtener las frecuencias indicadas en el esquema de más arriba es necesario realizar las siguientes modificaciones en el código del archivo system_stm32f4xx.c:
  • uint32_t SystemCoreClock = 100000000: 100 MHz es la frecuencia máxima del sistema.
  • PLL_M = 8: divide entre 8 la frecuencia del cristal externo de 8 MHz, con lo que se obtiene 1 MHz a la entrada del VCO.
  • PLL_N = 192: multiplica la frecuencia de 1 MHz por 192, de manera que la frecuencia de salida del VCO será de 192 MHz.
  • PLL_P = 2: divide entre 2 los 192 MHz del VCO, obteniendo una señal PLLCLK de 96 MHz, por tanto, una señal SYSCLK también de 96 MHz.
  • PLL_Q = 4: divide entre 4 los 192 MHz para obtener 48 MHz. Para configurar PLL_M, PLL_N, PLL_P y PLL_Q el código del archivo system_stm32f4xx.c ha de efectuar modificaciones en el registro RCC_PLLCFGR.
  • RCC->CFGR |= RCC_CFGR_HPRE_DIV1: accede al registro RCC_CFGR para que el prescaler AHB divida la frecuencia de SYSCLK por 1. La constante utilizada en esta instrucción y las usadas en las dos siguientes están definidas en el archivo stm32fxx.h.
  • RCC->CFGR |= RCC_CFGR_PPRE2_DIV1: accede al registro RCC_CFGR para que el prescaler APB2 divida la frecuencia de salida de AHB por 1.
  • RCC->CFGR |= RCC_CFGR_PPRE1_DIV2: accede al registro RCC_CFGR para que el prescaler APB1 divida la frecuencia de salida de AHB por 2.
También hay que indicar, en el código del archivo stm32f4xx.h, la frecuencia del cristal externo, que en este caso es de 8 Mz. Por tanto, se ha de cambiar ‘25000000’ por ‘8000000’.

 
El siguiente texto es un resumen del cometido del código contenido en el archivo system_stm32f4xx.c.


 

No hay comentarios: