Forum: Mikrocontroller und Digitale Elektronik Interrupts bei Keil ARM? (KL25Z)


von Christian H. (christian_h)


Angehängte Dateien:

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

von Jim M. (turboj)


Lesenswert?

Den Interrupt einschalten im NVIC:
1
NVIC_EnableIRQ(TPM0_IRQn);

Die sind alle per default inaktiv.

von Christian H. (christian_h)


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!

von Lothar (Gast)


Lesenswert?

Christian H. schrieb:
> TPM0_IRQHandler()

Wundert mich dass es so geht denn eigentlich muss man im IRQ Handler den 
aufrufenden Interrupt am Ende quittieren:

NVIC_ClearPendingIRQ(TPM0_IRQn);

von Christian H. (christian_h)


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

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.