Ich verwende das LPC1768- Entwicklungsboard von NXP und bin auf das Benutzerhandbuch für diesen Teil gestoßen, und auf Seite 67/849, Abschnitt 4.10, wird der externe Taktausgang beschrieben. Ich konnte nicht herausfinden, auf welchem der 40 Pinbelegungen auf der Platine diese Uhr sitzt. Beim Googeln habe ich diesen Code gefunden, der 10MHz ausgeben soll:
/* 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
Aber noch einmal, ich bin mir nicht sicher, aus welchem der Pins der Platine diese Uhr kommt? Oder muss ich irgendwo auf der Platine eine Verbindung löten?
UPDATE Ich habe den bereitgestellten Code getestet Nils Pipenbrinck
. Es klappt. Aber ich bin mir nicht sicher, ob es Einschränkungen bei dieser Taktausgabe und ihrer Genauigkeit gibt. Hier sind Screenshots für die Frequenzen 10 MHz, 5 MHz, 1 MHz: - Es scheint sich zu verschlechtern, wenn Sie höher gehen. Irgendwelche Anregungen, wie man die Form und Genauigkeit des Signals verbessern kann?
Inspiriert von der Zuofus-Antwort, dachte ich nur, ich poste den Code, um timer2 für diese Aufgabe einzurichten. Ich benutze es, um ein CPLD mit verschiedenen Frequenzen zu takten, und es funktioniert wie ein Zauber.
// 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);
}
}
Gemäß diesem Schema ist der Pin, den Sie für CLKOUT verwenden, P1.27, der für die Ethernet-Taktfreigabe (ETH_OSC_EN) verwendet wird. Dies ist Pin 43 auf dem LPC1768-Chip und geht zum Aktivierungspin des Ethernet-Oszillators (ASE-50-CT). Es scheint nirgendwo anders auf der Platine ausgebrochen zu sein, also müssen Sie an einem dieser beiden Punkte auf der Platine einen Draht daran anlöten.
Wenn Sie einen externen Takt erzeugen müssen, ohne CLKOUT zu verwenden und ohne CPU-Zyklen zu verschwenden, können Sie einen der Match-Ausgänge verwenden. Stellen Sie das Übereinstimmungsregister auf einen kleinen Wert ein (der Ihr Taktteiler von Ihrem PCLK sein wird) und aktivieren Sie das entsprechende Zähler-/Übereinstimmungsregister. Stellen Sie es ein, um den Zähler zurückzusetzen und den Ausgang bei einem Timer-Übereinstimmungsereignis umzuschalten.
KingsInnerSoul
Nils Pipenbrink
KingsInnerSoul
Nils Pipenbrink
KingsInnerSoul
Nils Pipenbrink
KingsInnerSoul
Nils Pipenbrink
KingsInnerSoul