Forum: Mikrocontroller und Digitale Elektronik STM32F10x hängt sich in IR bei Displayaufruf auf.


von abc (Gast)


Lesenswert?

Hallo Leute,

Will einfach im IR eine zahl am Display ausgeben:
1
void EXTI9_5_IRQHandler(void)
2
{
3
   if(EXTI_GetITStatus(EXTI_Line7) != RESET) //EXTI_Line 7 hat ausgeloest?
4
  {
5
   GPIO_ResetBits  (GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
6
  //  lcd_setcursor(12, 1 );
7
  LCD_Data("7");  
8
    EXTI_ClearITPendingBit(EXTI_Line7);
9
  }
10
}


Sobald man die Taste drückt, stoppt das System, Entfernt man die LCD 
funktion läuft wieder alles.
Sonst funktionieren die LCD funktionen überall. Und hab auch andere 
zeichen als 7 Probiert.

Hier die benutzte LCD funktion:
1
static void LCD_E(uint8_t val)             // E ... enable
2
{
3
  if(val){
4
    GPIO_SetBits  (GPIOC, GPIO_Pin_4);
5
    Delay(1);  //SET_TO 8-Bit (1/3)
6
      GPIO_ResetBits(GPIOC, GPIO_Pin_4);
7
  }
8
  else GPIO_ResetBits(GPIOC, GPIO_Pin_4);
9
}
10
11
void LCD_Data(uint8_t val)             
12
{
13
   GPIO_ResetBits (GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
14
  if(val)  GPIOA->ODR |= val;  //GPIOA->BSRR=val;
15
     LCD_E(1);
16
17
}

Hoffe dass jemand eine Idee hat.

von C3 (Gast)


Lesenswert?

Geil. Das wird wieder ein Zombie-Thread.

von abc (Gast)


Lesenswert?

Ist echt Strange ;).

von Bello (Gast)


Lesenswert?

abc schrieb:
> Will einfach im IR eine zahl am Display ausgeben:
Warum diese Verrenkungen? Das geht auch mit 'nem 8-Bitter.

von abc (Gast)


Lesenswert?

Bello schrieb:
> abc schrieb:
>> Will einfach im IR eine zahl am Display ausgeben:
> Warum diese Verrenkungen? Das geht auch mit 'nem 8-Bitter.

Was meinst genau?

von Bello (Gast)


Lesenswert?

abc schrieb:
> Was meinst genau?
Einen ATmega32 zum Bleistift?

von abc (Gast)


Lesenswert?

Ist ein größeres Projekt bei dem ich mich für diesen Prozessor 
entschieden habe, auch wenns mit Atmega auch umsetzbar gewesen sein 
sollte.

Dieses Projekt beinhaltet: SD-Card, I2C bus anbindungen, USART, RTC, 10 
IR fähige Taster, 10 LEDs, LCD usw ;).

von Bello (Gast)


Lesenswert?

Ok, das hattest du nicht geschrieben. Wenn ich soetwas machen wollte, 
würde ich das mit meinem neuen mikroelektronka Pascal-Compiler machen, 
so sie deinen bisher ungenannten µC unterstützen. Dieses C-Gescheibsel 
ist mir einfach zu unübersichtlich.

von zy (Gast)


Lesenswert?

Ja es geht jetzt nicht um entfehlungen oder sonstwas. Ich mache das mit 
dem Cortex STM32DiscoveryF3 board (STM32F10x Prozessor).

Und der Code ist für diesen Prozessor halt der CMSIS Standart, an dem 
man sich erst gewöhnen muss, aber dann auch schnell damit Programmieren 
kann.

Aber diese Diskussionen bringen bei der Lösung des Problems jetzt nichts 
;).

von ASCII-Zecke (Gast)


Lesenswert?

stack!

von Steel (Gast)


Lesenswert?

In Interruptroutinen macht man keine Ausgaben auf Displays, die hält man 
so kurz wie möglich.

Geh erstmal die Grundlagen lernen bevor du mit nem STM32 anfängst. Sonst 
lässt die ächste Frage nicht lange auf sich warten.

von Matthias K. (matthiask)


Lesenswert?

Es ist grundsätzlich keine gute Idee, wenn man LCD Ausgaben in einer 
Interruptroutine macht. Der bessere Weg ist, im Interrupt ein Flag zu 
setzen, was dem Hauptprogramm signalisiert, das was anzuzeigen ist. Die 
eigentliche LCD-Ausgabe erledigt dann das Hauptprogramm. Ich hoffe, Du 
machst nicht in beiden (Int. und Main) LCD-Ausgaben.

Und ein Delay() hat nichts in einer Interruptroutine zu  suchen.

von abc (Gast)


Lesenswert?

Ich Programmier mittlerweile schon 2 Jahre auf dem STM32 und ein teil 
meiner Abiturarbeit war über die Programmierung des Cortex M3, also ich 
weiß eigentlich schon was ich tu.

Es sollte ja nur ein Test sein, und ich seh keinen Grund warum man im 
Interrupt nicht etwas ausgeben kann zu testzwecken, Solange dauert die 
Ausgabe auch wieder nicht und die Interruptroutine muss trotzdem 
verlassen werden nach einer Gewissen Zeit x, dies Passiert nicht und 
gibt Konkreten Anlass zu dieser Frage.

Der Interrupt hier sollte durch das Delay max etwas mehr als 1ms 
aufgerufen und das system unterbrochen sein sein, aber warum hängt sich 
da das system dabei auf?

von Holm T. (Gast)


Lesenswert?

Kann es sein, das Du durch Deine LCD Ausgabe einen erneuten Interrupt 
auslöst und sich das Ding inneinander zu Tode verschachtelt?
Ich kenne mich mit den Cortexen nicht wirklich aus, aber ich würde am 
Anfang Deiner ISR mal probehalber alle Anderen Interrupts sperren und 
erst am Ende der ISR wieder freigeben..

Gruß,

Holm

von abc (Gast)


Lesenswert?

Beim Display laufen sonst keine Interrupts, der Einzige Interrupt der 
noch läuft ist der Interrupt des RTCs welcher allerdings in einer 
Höheren Interruptklasse läuft, diesen Unterbricht und dann dieser 
Fortsetzen würde.

Wie auch immer werd jetz ne Variable im IR setzen und im Hauptprogramm 
ausgeben wie es auch geplant war. Ist nur merkwürdig warum das anders 
net geht.

von Matthias K. (matthiask)


Lesenswert?

Wie ist der EXTI initialisiert? Richtiger Interrupthandler?

von abc (Gast)


Lesenswert?

Joa passt alles, da ohne die LCD ausgabe auch alles funzt.
1
  /* EXTI DER TASTER */
2
 
3
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);              
4
  EXTI_InitStruct.EXTI_Line    = EXTI_Line7;      
5
  EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Interrupt;  
6
  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;  
7
  EXTI_InitStruct.EXTI_LineCmd = ENABLE;  
8
  EXTI_Init(&EXTI_InitStruct); 
9
10
   /* NVIC DER TASTER */
11
  NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;  //Kanal NVIC -> Vektortabelle
12
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //Hauptprioritaet
13
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;  //Subprioritaet
14
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;    //Aktivieren
15
  NVIC_Init(&NVIC_InitStruct);  //Initialisierung des NVIC-Controllers

von (prx) A. K. (prx)


Lesenswert?

Dass Taster prellen ist bekannt?

von abc (Gast)


Lesenswert?

Mit der Ausgabe im Hauptzyklus funktioniert es aufjedenfall ;).

Jap dass Tasterprellen hab ich mittels Kondensatoren gelöst, und wenn 
das nicht reicht entprell ich den Rest softwaremäßig, hat aber mit dem 
Problem nix zu tun.

Hat eigentlich jemand Ahnung mit dem Remappen des PB3 Tasters?

Hier das Datenblatt:

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/CD00267113.pdf

Auf Seite 16 steht PB3 Main funkion JTDO und PB4 auch etwas, PB4 
funktioniert aber ganz normal als I/O nur auf PB3 kann ich nicht 
zugreifen.

Ich schätze dass diese Pins für die JTAG funktion sind.

Laut schaltungen zb. S19 steht das Als Programmierleitungen TCK/SWCLK 
und TMS/SWDIO verwendet werden. Und weiter oben dass JTAG nicht 
verwendet wird bei dem Board.

Also da ich ausgehe dass PB3 auf JTAG Konfiguriert ist, denke ich dass 
man JTAG einfach deaktivieren müsste? Oder besteht da eine Gefahr dass 
ich dann kein Zugriff mehr habe.

Mögliche Konfigurationen:
1
#define GPIO_Remap_SWJ_NoJTRST      ((uint32_t)0x00300100)  /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */
2
#define GPIO_Remap_SWJ_JTAGDisable  ((uint32_t)0x00300200)  /*!< JTAG-DP Disabled and SW-DP Enabled */
3
#define GPIO_Remap_SWJ_Disable      ((uint32_t)0x00300400)  /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */

Eigentliche müsste es ja mit #define GPIO_Remap_SWJ_JTAGDisable  gehn. 
Nur ich hab öfters gelesen dass PA13/14 auch deaktiviert werden, diese 
sind aber die Programmierleitungen.

Ich frag lieber bevor ich dann kein Zugriff mehr habe, aber ich denke 
dass  hier die chance gering ist jemanden zu finden der sich damit 
auskennt ;).

von abc (Gast)


Lesenswert?

Okay habs probiert und hat Problemlos funktioniert.


Also für alle die PB3/PB4/PA15 mal nützen wollen einfach:

GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE);

von Gnubbel (Gast)


Lesenswert?

Das ist das Datenblatt:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00251732.pdf

Dann brauchst du noch das:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/CD00246267.pdf

Passen diese Einstellungen zusammen?:
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
EXTI_InitStruct.EXTI_Line    = EXTI_Line7;

Bei mir sieht das so aus:
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;

von abc (Gast)


Lesenswert?

Keine Ahnung was du gerade meinst.

Passen diese Einstellungen zusammen?:
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
EXTI_InitStruct.EXTI_Line    = EXTI_Line7;

Bei mir sieht das so aus:
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
EXTI_InitStructure.EXTI_Line = EXTI_Line4;

Diese Einstellungen passen aufjedenfall zusammen. da es keinen eigenen 
Interrupthändler für Line 7 gibt, aber eine EXTI_Line7 welche in den 
Interrupthändler EXTI9_5 fällt.

Es funktioniert auch alles ;).

von huegene (Gast)


Lesenswert?

git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
für alle die noch nicht wissen dass die kommende Version von openocd 
(0.6) beide versionen des ST-Link unterstützt.

von abc (Gast)


Lesenswert?

Der Exti hat 19 Ausgangsleitungen, wovon 11 zum NVIC führen.

EXTI0-EXTI4 direkt verbunden mit NVIC

EXTI5-9 sind nach dem Exti "kurzgeschlossen" und mit einer Leitung zum 
NVIC geführt.

EXTI10-15 genauso

Dann führen noch EXTI16-EXTI19 direkt zum NVIC.

von abc (Gast)


Lesenswert?

*20 Leitungen meinte ich.

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.