Hallo miteinander, Ich verwende einen AtSAM4N8B und habe ein Problem mit den Interrupts. Und zwar weis ich nicht wie das Schlüsselwort für die Interrupt Rutine lautet, also wo ich meine Interruptrutine hinschreiben muss. Ich suche also eigentlich das, was bei den AVRs "ISR(irgend_ein_vector)" ist. Das ASF möchte ich eigentlich nicht benutzen. Hat vielleicht jemand ein kurzes Beispielprogramm oder etwas in der Richtung? Freundliche Grüsse Christian
Für die Cortex-M muss der Handler den richtigen von CMSIS/IDE definierten Namen haben. Anders als bei AVRs sind das normale C-Funktionen ohne besondere Kennzeichnung.
Gast
#3932354
Christian M. schrieb:
> Das ASF möchte ich eigentlich nicht benutzen.
Wenn du dich dann noch ans Linker Script ran traust kannst du dir aus
dem CMSIS die Rosinen rauspicken und den Rest recyclen. Dann sind deine
ISRs tatsächlich ganz normale C-Funktionen ohne spezielle Namen oder
Schlüsselworte. Die einzige Besonderheit: sie müssen in der
Vektortabelle an der richtigen Stelle eingetragen werden.
Die Vektortabelle kann auch eine normale C-Datei sein, man muss nur
dafür sorgen, dass sie an die physikalische Adresse 0 gelinkt wird (ja,
es geht auch flexibler, aber für den Anfang...). Meine sieht z.B. so
aus:1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
Sogar die "gefürchtete" crt0 kann eine ganz normale C-Funktion sein. Mit "top_of_stack" initialisiert die Hardware als erstes den Stackpointer und mehr ist für die ersten Befehle nicht nötig. An dieser Stelle sind die Cortex-M einfacher als die AVR, jedenfalls, wenn man auf CMSIS, StdPeriLib, IDE usw. verzichtet.
Danke für eure Antworten. Ich denke ich werde zumindest vorerst noch CMSIS verwenden. Das kann ich dann immer noch rausoptimieren sobald ich mich im Umgang mit dem Controller etwas sicherer fühle. Noch eine Frage: Die Tabelle mit den Interrupt Handlern habe ich gefunden. Muss ich die Interrupts noch global aktivieren? In der CMSIS doku steht etwas von __enable_irq() nur scheint es so als würde die IDE-Autovervollständigung diese Funktion nicht kennen. Compilerfehler habe ich aber keine. __enable_fault_irq(); wird hingegen erkannt. weiter steht da das diese Funktionen nur im "privileged mode" ausgeführt werden können. Wie ist das nun zu verstehen und wie komme ich in diesen Modus? danke für eure Hilfe, Christian
Gast
#3932466
>weiter steht da das diese Funktionen nur im "privileged mode" ausgeführt >werden können. Das ist im Cortex M Ref Manual erklärt. Wenn der Core einen Interrupt erkennt, wechselt er automatisch in den "priviledged" aka "handler" mode. >Wie ist das nun zu verstehen und wie komme ich in diesen >Modus? Indem Du einen freigegebenen Interrupt auslöst.
Gast
#3932514
Christian M. schrieb:
> Muss ich die Interrupts noch global aktivieren?
Jein, global sind sie vom Start weg eingeschaltet. Aber du musst sie
einmal im Control Register des I/O-Moduls und zweitens im NVIC
einschalten, z.B. für den uart1 Empfänger:1 | |
2 | |
> In der CMSIS doku steht etwas von __enable_irq() nur scheint es so als > würde die IDE-Autovervollständigung diese Funktion nicht kennen. Das ist nicht die einzige Fehlstelle :( > weiter steht da das diese Funktionen nur im "privileged mode" ausgeführt > werden können. Wie ist das nun zu verstehen und wie komme ich in diesen > Modus? Wenn du nichts besonderes machst, bist du immer privileged. Diese Umschaltung (und die auf den 2. Stackpointer) passiert im Spezialregister CONTROL. Das brauchst du eigentlich nur, wenn du ein eigenes Betriebssystem schreiben willst. Dann gibt es noch den Unterschied "Handler Mode" vs. "Thread Mode". Diese Umschaltung passiert automatisch, eine ISR läuft im Handler Mode. Das ist ohne weitere Einstellungen aber auch ziemlich egal.
Schaulus Tiger schrieb: > NVIC->ISER [USART1_IRQn / 32] = 1 << (USART1_IRQn % 32); Das schreibt man so:
1 | |
Raus kommt zwar identischer Code, aber es ist IMO wesentlich einfacher zu lesen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.