Forum: Mikrocontroller und Digitale Elektronik LPC1768 Problem mit Timer0


von Lukas W. (lukas_we)


Angehängte Dateien:

Lesenswert?

Hi,

Ich versuche derzeit einen Pin mit Timer0 im 1us Takt zu toggeln wobei 
ich das Problem habe das wenn ich den Timer0 konfiguriert habe und das 
ganze teste wird der Pin dann aber nur im 50us Takt getoggelt (wie auf 
Bild 1 zu sehen. Die PLL Konfiguration, CPU clock divider und Peripherie 
clock Konfiguration habe ich mir eigentlich schon angesehen und konnte 
keinen Fehler finden. Ich hoffe hier kann mir jemand helfen.

Entwicklungsumgebung: MCUXpresso V11.3.0

Debugger: ULINK2

Entwicklungsboard: Waveshare Open1768

Quarz: 12MHz

PLL/CPU Clock Konfiguration
1
#define CLOCK_SETUP           1
2
#define SCS_Val               0x00000020
3
#define CLKSRCSEL_Val         0x00000001
4
#define PLL0_SETUP            1
5
#define PLL0CFG_Val           0x00050063
6
#define PLL1_SETUP            1
7
#define PLL1CFG_Val           0x00000023
8
#define CCLKCFG_Val           0x00000003
9
#define USBCLKCFG_Val         0x00000000
10
#define PCLKSEL0_Val          0x00000000
11
#define PCLKSEL1_Val          0x00000000
12
#define PCONP_Val             0x042887DE
13
#define CLKOUTCFG_Val         0x00000000

Timer0
1
void initTimer(void)
2
{
3
      LPC_SC->PCONP |= 1 << 1;      // Power up Timer 0
4
      LPC_SC->PCLKSEL0 |= 1 << 2;   // Clock for timer = CCLK
5
      LPC_TIM0->PR = 99;        //100MHz
6
      LPC_TIM0->MR0 = 1;          //1MHz
7
      LPC_TIM0->MCR |= 0x03;      // Interrupt on Match0 compare      // Reset timer on Match 0.
8
      LPC_TIM0->TCR |= 1 << 1;      // Reset Timer0
9
      LPC_TIM0->TCR &= ~(1 << 1);   // stop resetting the timer.
10
      NVIC_EnableIRQ(TIMER0_IRQn);  // Enable timer interrupt
11
      LPC_TIM0->TCR |= 1 << 0;      // Start timer
12
}
13
14
15
void TIMER0_IRQHandler(void)
16
{
17
  LPC_GPIO2->FIOPIN ^= (1<<0);
18
19
  LPC_TIM0->IR = 0x01;   /* Clear MAT0 interrupt flag */
20
}

Main
1
int main(void) {
2
  configureGpio(PORT_2, 0, GPIO_OUTPUT);
3
    initTimer();
4
    while(1) {
5
    }
6
    return 0 ;
7
}

von S. Landolt (Gast)


Lesenswert?

Ich habe nicht die geringste Ahnung vom LPC1768, darf ich trotzdem dumm 
fragen: mit welchem Takt läuft die CPU? 12 MHz oder 100, oder etwas 
anderes?

von Lukas W. (lukas_we)


Lesenswert?

Aus den 12MHz die mit dem Quarz generiert werden macht man mit der PLL 
(Phase-locked Loop) 400MHz welche im nachhinein über den CPU Clock 
Divider wieder durch 4 auf auf 100MHz runtergeteilt werden was dann die 
Taktrate für die CPU ergibt. Den CPU Clock Divider kann man von 1 bis 
255 wählen. Die CPU Taktrate wir dann nochmal durch den Peripherie Clock 
Divider geteilt und somit hat mann dann auch seinen Peripherie Clock. 
Und mit dem Peripherie Clock braucht man z.B. für den Timer0.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Dann muss ich passen.
(ein Versuch war's wert)

von Jim M. (turboj)


Lesenswert?

Lies mal die Errata zu LPC1768 Chip.

Das fiese hier ist, das PCLKSel nicht mehr korrekt funktioniert wenn die 
PLL an ist IIRC.

Ich sehe in dem gpostetehn Code auch nicht wo die PLL oder der Quarz 
initialisiert wird - dann würde der Chip auf den internen 4 MHz laufen.

Ansonsten konfiguriere mal den CLKOUT und schau Dir mal die Taktung mit 
'nem Oszi an.

: Bearbeitet durch User
von Lukas W. (lukas_we)


Lesenswert?

Danke für die Hilfe, ich habe das Problem lösen können. Anscheinend 
hatte ich beim Erstellen des Projekts einen Fehler gemacht und CMSIS 
wurde nicht richtig in das Projekt mit eingebunden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.