Forum: Mikrocontroller und Digitale Elektronik Simples Programm endet im FaultISR (ARM Cortex M3)


von Robert S. (razer) Benutzerseite


Lesenswert?

Hallo an alle,

Ich beginne gerade die ersten Schritte mit den Arm Cortex M3, genauer 
gesagt mir dem LM3S6950 von Luminary. Als Debugger verwende ich den 
J-Link von Segger in Kombination mit der Keil MDK 3.7 
Entwicklungsumgebung (µVision 4 Beta 3). Debugausgaben im Programm gebe 
ich mittels ITM und SWD direkt im Keil aus.

So nun zu meinem Problem. Ich möchte einen Inkrementaldrehgeber 
auswerten. Dazu verwendet ich das Hardware-Interface des 
Mikrocontrollers. Für die Konfiguration verwendete ich die Driverlib von 
Luminary.

Hier folgendes Programm:
1
void setInput(unsigned long port, unsigned long pins)
2
{
3
    GPIOPinTypeGPIOInput(port, pins); //input
4
    GPIOPadConfigSet(port, pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); //pullup
5
}
6
7
void init_io(void)
8
{
9
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
10
  setInput(GPIO_PORTD_BASE, ENC_PHA);
11
12
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
13
  setInput(GPIO_PORTD_BASE, ENC_PHB);
14
15
  DEBUG("IO Init Complete\n");
16
17
  SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
18
  SysCtlPeripheralReset(SYSCTL_PERIPH_QEI);
19
  QEIConfigure(QEI_BASE, QEI_CONFIG_CAPTURE_A | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_SWAP, 0xFFFFFFFF);
20
  GPIOPinTypeQEI(GPIO_PORTD_BASE, GPIO_PIN_1); //PHA
21
  GPIOPinTypeQEI(GPIO_PORTF_BASE, GPIO_PIN_0); //PHB  --> Hier kommt es zur unerwarteten FaultISR
22
  QEIPositionSet(QEI_BASE, 0);
23
  QEIEnable(QEI_BASE);
24
}
25
26
int main(void)
27
{
28
  DEBUG("Starte Init\n");
29
  init_io();
30
31
  while(1)
32
  {
33
    DEBUG("Test\n");
34
  }
35
}

Ich habe absolut keine Ahnung warum es während der Konfiguration zu 
einem solchen Interrupt kommt. Die Interrupts werden ja generell 
nirgends eingeschaltet.

Ein weiteres Phänomen ist, dass es im Simulator einwandfrei läuft. Nur 
auf der Hardware kommt es zu diesem Fehler.

Ich hoffe es kann mir wer helfen.

Danke im Voraus
lg Robert

von M3 (Gast)


Lesenswert?

Du initialisiert zweimal
1
SYSCTL_PERIPH_GPIOD
aber nicht
1
SYSCTL_PERIPH_GPIOF

Dann machst Du
1
GPIOPinTypeQEI(GPIO_PORTF_BASE, GPIO_PIN_0);

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.