¿Reloj de salida del LPC1768?

1

Estoy utilizando LPC1768 de NXP y encontré la User Manual para esta parte y la página 67/849 sección 4.10 describe la salida del reloj externo. No pude averiguar qué pin de los 40 pinouts en el tablero es este reloj sentado. Al buscar en Google, encontré este código que se supone que genera 10MHz:

/* clkout of 10mhz on 1.27 */
LPC_PINCON->PINSEL3 &=~(3<<22);
LPC_PINCON->PINSEL3 |= (1<<22);
LPC_SC->CLKOUTCFG = (1<<8)|(14<<4); //enable and divide by 12

Pero, una vez más, no estoy seguro de cuál de los pines de la placa sale este reloj. ¿O tengo que soldar una conexión a algún lugar del tablero?

ACTUALIZACIÓN He probado el código que Nils Pipenbrinck proporcionó. Funciona. Pero no estoy seguro de si hay limitaciones en la salida del reloj y su precisión. Aquí hay capturas de pantalla para frecuencias de 10MHz, 5MHz, 1MHz: - parece degradarse a medida que avanzamos. ¿Alguna entrada sobre cómo mejorar la forma y precisión de la señal?

    
pregunta KingsInnerSoul

2 respuestas

2

Inspirado por la respuesta de Zuofus, pensé que había publicado el código para configurar el timer2 para esta tarea. Lo uso para sincronizar un CPLD en varias frecuencias, y funciona como un encanto.

// flexible frequency synthesizer for the LPC1768 mbed board.
// this uses the TIM2 timer in countdown mode, toggling
// the MAT2.0 pin on each event (DIP-8 in the prototype board)

// the frequency will always be a bit off for high clock-rates because
// only integer divisions of the main clock are possible. 

void StartFreqSynth (uint32_t freqHz)
/////////////////////////////////////
{
  // ------------------------
  // Enable Power for Timer2:
  // ------------------------
  LPC_SC->PCONP |= (1<<22);

  // -----------------------------------
  // Disable counter and hold in reset:
  // -----------------------------------
  LPC_TIM2->TCR = 2;       // rest counter

  // -------------------------------------------
  // Set Clock source for Timer2 (bit 12 and 13)
  // we pick full system clock, divider 2,4,8
  // are also available
  // -------------------------------------------
  LPC_SC->PCLKSEL1 = (LPC_SC->PCLKSEL1 & ~(3<<12)) | (1<<12);

  // ----------------------------------
  // Use normal Timer mode, no capture
  // ---------------------------------- 
  LPC_TIM2->CTCR = 0;

  // -----------------------------------------------
  // Match on MR0 = TC. Reset counter, no interrupts
  // -----------------------------------------------
  LPC_TIM2->MCR = 2;     

  // ------------------------------------------------
  // set pin function for pin DIP_8 (P0.6) to MAT2.0
  // ------------------------------------------------
  LPC_PINCON->PINSEL0 |= 3<<12;

  // ----------------------------------
  // toggle pin MAT2.0 (DIP_8) on match
  // ----------------------------------
  LPC_TIM2->EMR  = 1 | (3<<4);

  // -----------------------------------
  // Set clock divider and match value
  // this determines the final frequency
  // -----------------------------------  
  LPC_TIM2->PR   = 0; // set prescaler to full speed.

  // since we toggle the pin, the generated frequency is half
  // as fast as a cycle, so we have to run the timer twice as
  // fast to compensate:
  LPC_TIM2->MR0  = CORE_FREQ / (freqHz*2);  // match value

  // start counter
  LPC_TIM2->TCR  = 1;       
}



void StopFreqSynth()
////////////////////
{
  // check if timer2 is powered:
  if (LPC_SC->PCONP & (1<<22))
  {
    // never generate interrupts:
    LPC_TIM2->MCR = 0;

    // put timer2 in reset, stop timer.
    LPC_TIM2->TCR = 2; 

    // disable peripheral power
    LPC_SC->PCONP &= ~(1<<22);
  }
}
    
respondido por el Nils Pipenbrinck
3

De acuerdo con este esquema , el pin que está utilizando para CLKOUT es P1. 27, que se utiliza para habilitar el reloj Ethernet (ETH_OSC_EN). Este es el pin 43 en el chip LPC1768 y va al pin de habilitación en el oscilador Ethernet (ASE-50-C-T). No parece estar roto en ninguna otra parte del tablero, por lo que tendrá que soldar un cable en uno de esos dos puntos del tablero.

Si necesita generar un reloj externo sin usar CLKOUT y sin perder ciclos de CPU, puede usar una de las salidas coincidentes. Establezca el registro de coincidencias en un valor pequeño (que será su divisor de reloj de su PCLK) y habilite el registro correspondiente del contador / coincidencia. Configúrelo para restablecer el contador y alternar la salida en un evento de coincidencia de temporizador.

    
respondido por el Zuofu

Lea otras preguntas en las etiquetas