Forum: Mikrocontroller und Digitale Elektronik ch32v003 externe Interrupts nutzen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel S. (daniel_s102)


Lesenswert?

Moin,

ich bin gerade ein wenig dabei mit dem ch32v003 baremetal rumzuspielen 
mithilfe des Reference Manuals, hab aber Probleme die Externen 
Interrupts zum laufen zu bekommen und weiß nicht so recht woran es 
liegen könnte. Vielleicht weiß hier jemand warum das bei mir nicht ganz 
so will.

Meine main.cpp:
https://pastebin.com/jJgft3gz

Die gpio.h funktioniert soweit einwandfrei, kann auf GPIO 
schreiben/lesen.
Mit dem Debugger hab ich in folgenden Registern folgende Werte:
1
EXTI_ENR = 8
2
EXTI_RTENR = 8
3
EXTI_FTENR = 8
4
EXTI_INTFR = 0 # das sollte ja eigentlich nach einem Flankenwechsel auch 8 sein.
5
AFIO_EXTICR = 12288

Mein Linking Script:
https://pastebin.com/nQiFKhLq

Makefile:
https://pastebin.com/5Tg2V21D

Startup.s:
https://pastebin.com/mM11mErE

Wahrscheinlich ists einfach nur ein "Dummer" Fehler, aber wirklich 
dahinter kommen tue ich nicht. Ich könnte natürlich einfach die SDK von 
WCH selbst verwenden oder ch32fun, aber da werde ich nicht verstehen was 
ich beim Konfigurieren Falsch gemacht habe, daher bin ich etwas Barebone 
unterwegs

von Thomas Z. (usbman)


Lesenswert?

nun ich sehe keine irgendwie geartete Interrupt Funktion.

von Daniel S. (daniel_s102)


Lesenswert?

Hm das könnte es natürlich sein. Ich hätte da Stundenlang hin und er 
probiert. Zuerst auch mit einer Vektor Tabelle für die Interrupts. Aber 
ggf war da auch ein Fehler drin.

Ich werde das morgen/die Tage nochmal neu aufrollen und die 
Vektortabelle hartkodieren.

Es würde ja reichen, wenn ich in assembly eine Funktion referenziere die 
nichts tut oder? Das Interrupt flag müsste dann ja dauerhaft aktiv sein, 
bis es zurückgesetzt wurde.

von Daniel S. (daniel_s102)


Lesenswert?

Sooo, hab mich mal rangesetzt und folgendes gemacht:
1
.global EXTI7_0_IRQHandler
2
.set MIE, 1<<3
3
.set MODE1, 1<<1
4
.set MODE0, 1<<0
5
6
7
.section .text.boot
8
    j _start
9
.skip    4*(20 - 1)
10
.word    EXTI7_0_IRQHandler
11
12
13
_start:
14
    // load stackpointer
15
    la sp, _stack_top   
16
17
    li t0, MODE1 | MODE0
18
    csrw mtvec, t0
19
20
    li t0, MIE
21
    csrw mstatus, t0

Sowie in meine main.cpp folgendes hinzugefügt
1
extern "C" void EXTI7_0_IRQHandler() __attribute__((interrupt));
2
3
extern "C" void EXTI7_0_IRQHandler() {}
Der Handler ist extra leer um das einfach zu halten. Das Interrupt 
sollte ja so oder so dann funktionieren mMn, das Flag würde dann halt 
nur nicht wieder zurückgesetzt werden.

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.