Interrupts bei Keil ARM? (KL25Z)

#3871982
Lesenswert?

Hallo,

ich hab mir vor kurzem das FRDM KL25Z geholt mit dem MKL25Z128VLK4 als 
MCU geholt. Als IDE verwende ich Keil µVision. Mein Code ist folgender 
(ich möchte einfach ein bisschen experimentieren, da es so gut wie gar 
keine Tutorials gibt) :
1
#include <MKL25Z4.h>
2
#include "RegisterBitNames.h"
3

4
void set_timer();
5

6
void TPM0_IRQHandler() {
7
    TPM0->SC = (1UL << TOF);
8
    FPTB->PTOR = (1UL << 19);
9
}
10

11
int main() {
12
  SystemCoreClockUpdate();
13
  
14
  SIM->SCGC5 |= (1UL << CLKB); //Schalte Clock auf PORTB
15
  
16
  PORTB->PCR[19] = (1UL << GPIOe); //Schalte PB19 auf GPIO
17
  //PORTB->PCR[18] = (1UL << 8) | (1UL << 9);
18
  set_timer();
19
  FPTB->PDOR = (1UL << 19);// | (1UL << 18);
20
  FPTB->PDDR = (1UL << 19);// | (1UL << 18); //Schalte PB19 auf Output
21
  FPTB->PCOR = (1UL << 19);
22
  
23
  while(1);
24
}
25

26
void set_timer() {
27
  MCG->C1 = (1UL << IRCLKEN) | (1UL << IREFS);
28
  MCG->C2 = (1UL << IRCS);
29
  SIM->SCGC6 = (1UL << TPM0e);
30
  SIM->SOPT2 = (1UL << TPMSRC1x) | (1UL << TPMSRCx1);
31
  
32
  TPM0->SC = (1UL << TOIE) | (1UL << CMODx1) | (1UL << PS1xx) | (1UL << PSx1x) | (1UL << PSxx1); //TOIE an,  CMOD: Zähle bei jedem LPTPM counter clock
33
  TPM0->CNT = 0; //Initialisiere Counter, Reset
34
  
35
  TPM0->MOD = 16383;
36
}

In der Datei RegisterBitNames habe ich mit selber #defines angelegt, 
welche einfach nur dem Stellenwert der Einstellungsbits entsprechen.
Nun möchte ich gerne, dass wenn der Timer TPM0 einen Interrupt auslöst, 
der Pin PB18 togglet (Ist eine LED dran). Leider wird der IRQ_Handler 
gar nicht aufgerufen, was ich nachvollziehen kann, weil er wohl falsch 
implementiert ist.
Weiß jemand, wie man eine IRQ_Handler hier implementiert? Ich hänge mal 
die von der IDE vorgegebenen Dateien mit den Definitionen der IRQs an 
(werden beim beim Linken mitgelinkt). In der .S Datei werden die 
Interrupts in Assembler definiert.

Ich hoffe, es sind alle nötigen Dateien angehängt. Weiß jemand 
vielleicht auch nur einen Tipp?

Das vielleicht nötige MCU-Manual ist hier: 
http://cache.freescale.com/files/32bit/doc/ref_manual/KL25P80M48SF0RM.pdf 
Aber dort finde ich dazu auch nichts.

Gruß,
Christian
Angehängte Dateien:
#3872014
Lesenswert?

Vielen Dank, klappt nun, die Funktion war in core_cm0plus.h versteckt, 
hätte ich wohl ewig gesucht.  Die LED togglet zwar nicht wirklich nun 
(schaltet sich nach der im Timer eingestellten Zeit aus, aber nicht 
wieder an), aber da suche ich gerade nach dem Fehler. Nochmals danke!

Gruß,
Christian

Edit: War tatsächlich nur ein ODER was ich vergessen habe und 
ausversehen das TPM0_SC Register somit überschrieben habe. Geht nun 
alles perfekt!
#3872062
Lesenswert?

Vielen Dank für den Tipp. Ich hab jetzt nicht nochmal ins Handbuch 
geschaut (weil ich gleich wieder früh aufstehen muss), also weiß ich 
jetzt nicht genau, wieso das bei mir nicht so schlimm ist, dass es 
fehlt. Es geht zumindest, aber dann weiß ich Bescheid, dass man die 
Interrupts am Ende des Handler quitttieren muss. Also ohne nachgeguckt 
zu haben, damit wird wohl ein Status bit gelöscht, welches anzeigt, dass 
der Handler gerade ausgeführt wird? Weil dass der Interrupt aufgetreten 
ist, wird ja mit dem TOF Bit wieder zurückgesetzt.
Ich schau mir das morgen nochmal genau an, was bei NVIC_ClearPendingIRQ 
passiert.

Gruß,
Christian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren