Diferencia entre revisiones de «C10 - Finite State Machine»

De Proyectos
Ir a la navegación Ir a la búsqueda
Línea 60: Línea 60:
**Los bits de <b>OSCSRC2</b> se hacen clear para seleccionar el main oscillator como oscillator clock source
**Los bits de <b>OSCSRC2</b> se hacen clear para seleccionar el main oscillator como oscillator clock source
<br>
<br>
void PLL_Init(void){
  // 0) Use RCC2
  SYSCTL_RCC2_R |=  0x80000000;  // USERCC2
  // 1) bypass PLL while initializing
  SYSCTL_RCC2_R |=  0x00000800;  // BYPASS2, PLL bypass
  // 2) select the crystal value and oscillator source
  SYSCTL_RCC_R = (SYSCTL_RCC_R &~0x000007C0)  // clear XTAL field, bits 10-6
                  + 0x00000540;  // 10101, configure for 16 MHz crystal
  SYSCTL_RCC2_R &= ~0x00000070;  // configure for main oscillator source
  // 3) activate PLL by clearing PWRDN
  SYSCTL_RCC2_R &= ~0x00002000;
  // 4) set the desired system divider
  SYSCTL_RCC2_R |= 0x40000000;  // use 400 MHz PLL
  SYSCTL_RCC2_R = (SYSCTL_RCC2_R&~ 0x1FC00000)  // clear system clock divider
                  + (4<<22);      // configure for 80 MHz clock
  // 5) wait for the PLL to lock by polling PLLLRIS
  while((SYSCTL_RIS_R&0x00000040)==0){};  // wait for PLLRIS bit
  // 6) enable use of PLL by clearing BYPASS
  SYSCTL_RCC2_R &= ~0x00000800;
}

Revisión del 11:05 18 mar 2015

Introducción


El microcontrolador cuenta de dos fuentes para el oscilador:

  • Interna
    • El oscilador interno del uC TM4C va a 16Mhz con una presicón de ±1% ⇒ poco preciso
    • Consume poca corriente
  • Externa
    • Se puede configurar el cristal a diferentes velocidades según las necesidades
    • Son mucho mas preciso que el interno
    • Consumen más corriente y espacio en el PCB


Phase-Lock-Loop (PLL)

Que és? Cómo funciona?


  • Permite seleccionar un cristal externo
  • Permite seleccionar la velocidad del cristal y por tanto del procesador
  • Permite seleccionar la velocidad del bus del sistema
  • Para poder llevar a cabo estas dos operaciones necesitamos manipular dos registros
    • SYSCTL_RCC_R
    • SYSCTL_RCC2_R


En la siguiente imagen se ven los registros que van asociados al PLL


Los datos que nos interesan:

  • En el registro SYSCTL_RCC_R el campo XTAL
    • Este se compone de 5 bits - del bit 10 al bit 6
    • El campo XTAL configura la velocidad del cristal. En la tabla de abajo se ven la codificacion de la velocidad en hexadecimal
  • En el registro SYSCTL_RCC2_R el campo SYSDIV2
    • Este campo se compone de 7 bits - del bit 28 al bit 22
    • Configura la velocidad del bus del sistema
    • La fórmula para calcular es:


velocidad=400n+1⇒n=SYSDIV2
Ej.
velocidad=400n+1=4004+1=80Mhz⇒ En el campo SYSDIV2 pondremos el valor 4
(Hay que tener en cuenta que a ↑ el número n ⇒ ↓ velocidad del reloj)

Codificación velocidad cristal en hexadecimal:


Notas:

  • No se si está bien explicada la función del PLL de ajustar la velocidad del reloj/bus. En las prácticas se ve como ponen a 80Mhz "algo". Yo creia que era el cristal, pero viendo la tabla de arriba el cristal como máximo puede ir a 25Mhz.
  • El campo SYSDIV2 parece ser el encargado de configurar la velocidad del bus y vemos que lo puedes poner a 80Mhz, por lo tanto lo que creo que cambian en las prácticas es la velocidad de bus, no la cristal en si.

Usar PLL


Hay dos formas de activar PLL:

  • A través de una libreria
    • La mejor solucion porque es mas estable
    • El código se puede portar más fácil a otro micro
  • Accediendo directamente a los registros


Accediendo manualmente

  • Paso 0: Usar RCC2 porque provee más opciones
  • Paso 1: Poner bit 11 de BYPASS2 a 1
    • PLL esta bypassed y no hay system clock divider
  • Paso 2: Seleccionar la velocidad del cristal a través del campo XTAL
    • Los bits de OSCSRC2 se hacen clear para seleccionar el main oscillator como oscillator clock source


void PLL_Init(void){
  // 0) Use RCC2
  SYSCTL_RCC2_R |=  0x80000000;  // USERCC2
  // 1) bypass PLL while initializing
  SYSCTL_RCC2_R |=  0x00000800;  // BYPASS2, PLL bypass
  // 2) select the crystal value and oscillator source
  SYSCTL_RCC_R = (SYSCTL_RCC_R &~0x000007C0)   // clear XTAL field, bits 10-6
                 + 0x00000540;   // 10101, configure for 16 MHz crystal
  SYSCTL_RCC2_R &= ~0x00000070;  // configure for main oscillator source
  // 3) activate PLL by clearing PWRDN
  SYSCTL_RCC2_R &= ~0x00002000;
  // 4) set the desired system divider
  SYSCTL_RCC2_R |= 0x40000000;   // use 400 MHz PLL
  SYSCTL_RCC2_R = (SYSCTL_RCC2_R&~ 0x1FC00000)  // clear system clock divider
                 + (4<<22);      // configure for 80 MHz clock
  // 5) wait for the PLL to lock by polling PLLLRIS
  while((SYSCTL_RIS_R&0x00000040)==0){};  // wait for PLLRIS bit
  // 6) enable use of PLL by clearing BYPASS
  SYSCTL_RCC2_R &= ~0x00000800;
}