Estoy usando la placa de desarrollo LPC1768 de NXP y encontré el Manual del usuario para esta parte y la sección 4.10 de la página 67/849 trata sobre la salida del reloj externo. No pude averiguar en qué pin de los 40 pines en el tablero está sentado este reloj. Al buscar en Google, encontré este código que se supone que emite 10 MHz:
/* 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, de nuevo, no estoy seguro de cuál de los pines de la placa sale este reloj. ¿O tengo que soldar una conexión en algún lugar de la placa?
ACTUALIZAR He probado el código que Nils Pipenbrinck
proporcionó. Funciona. Pero no estoy seguro de si existen limitaciones en la salida de ese reloj y su precisión. Aquí hay capturas de pantalla para frecuencias de 10 MHz, 5 MHz, 1 MHz: - parece degradarse a medida que subimos. ¿Algún aporte sobre cómo mejorar la forma y la precisión de la señal?
Inspirado por la respuesta de Zuofus, pensé en publicar el código para configurar timer2 para esta tarea. Lo uso para registrar un CPLD en varias frecuencias, y funciona de maravilla.
// 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);
}
}
De acuerdo con este esquema , el pin que está usando para CLKOUT es P1.27, que se usa 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-CT). No parece estar roto en ningún otro lugar de la placa, por lo que tendrá que soldarle un cable en uno de esos dos puntos de la placa.
Si necesita generar un reloj externo sin usar CLKOUT y sin desperdiciar ciclos de CPU, puede usar una de las salidas de coincidencia. Establezca el registro de coincidencia en un valor pequeño (que será su divisor de reloj de su PCLK) y habilite el registro de contador/coincidencia correspondiente. Configúrelo para restablecer el contador y alternar la salida en un evento de coincidencia de temporizador.
ReyesInteriorAlma
Nils Pipenbrinck
ReyesInteriorAlma
Nils Pipenbrinck
ReyesInteriorAlma
Nils Pipenbrinck
ReyesInteriorAlma
Nils Pipenbrinck
ReyesInteriorAlma