ch32v003 externe Interrupts nutzen

#7844638
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

#7844744
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.

#7845352
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.

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