Forum: Mikrocontroller und Digitale Elektronik STM32F4 Taster


von 12V DC (Gast)


Lesenswert?

Moin

Nachdem ich mir vor 6 wochen das Stm32f4-discoveryboard gekauft habe und 
dann nach 3 Wochen eine Anleitung für eine Toolchaininstallation 
gefunden habe stöhn habe ich nun folgendes Problem:

Ich versuche den blauen Taster auf dem Board auszulesen. Aber leider 
funktioniert der Quellcode, den ich nehme net. Die Blaue LED geht zwar 
an, aber sie geht nicht aus, wenn ich den Taster drücke.
1
#include "stm32f4xx_conf.h"
2
#include <stddef.h>
3
#include <stdlib.h>
4
#include "stm32f4xx.h"
5
6
 
7
void initApplication()
8
{
9
  SysTick_Config(SystemCoreClock/100);
10
  // weitere Initialisierungen durchführen
11
 
12
  // GPIOD Takt einschalten
13
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
14
  // GPIOA Takt einschalten
15
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
16
 
17
  GPIO_InitTypeDef  GPIO_InitStructure;
18
  GPIO_StructInit (&GPIO_InitStructure);
19
 
20
  // Konfiguriere PD15
21
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
22
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
23
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
24
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
25
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
26
  GPIO_Init(GPIOD, &GPIO_InitStructure);
27
 
28
  //  Konfiguriere PA0
29
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
30
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
31
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
32
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
33
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
34
  GPIO_Init(GPIOA, &GPIO_InitStructure);
35
 
36
}
37
 
38
int main(void)
39
{
40
  SystemInit();
41
  initApplication();
42
  do{
43
    if (GPIOA->IDR & 0x0001)
44
    {
45
      GPIO_ResetBits(GPIOD,GPIO_Pin_15);
46
    }
47
    else
48
    {
49
      GPIO_SetBits(GPIOD,GPIO_Pin_15);
50
    }
51
  } while (1);
52
  return 0;
53
}

Keine Vermutung ist, das irgendetwas mit GPIOA->IDR & 0x0001 falsch ist, 
aber auch das ersetzen durch  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 
== 1 bringt nichts.

Gruß 12V

PS:Mein Toolchain ist das hier beschriebene:
http://eliaselectronics.com/stm32f4-tutorials/setting-up-the-stm32f4-arm-development-toolchain/

von 12V DC (Gast)


Lesenswert?

Nachtrag: Der ursprüngliche Quellcode kommt von 
http://www.mystm32.de/doku.php?id=einfache_ein-_und_ausgaben_mit_dem_arm

von Lutz H. (luhe)


Lesenswert?

Bei  meinem Board wird der Taster erkannt,nur die Led nicht angesteuert.

Ist GPIO_Init(GPIOD,    pin 15 richtig?

von 12V DC (Gast)


Lesenswert?

ja das geht
auch die Demos funktionieren(Demonstration, IO_Toggle...)

von Stm32f4 (Gast)


Lesenswert?


von 12V DC (Gast)


Lesenswert?

Jetzt funktioniert es mit
1
GPIOA->IDR & 0x0001
aber der schwarze Taster wird ausgelesen. Das ist seltsam überall wird 
gesagt, dass der code den blauen ausliest!

von Alex (Gast)


Lesenswert?

bei meinem Board ist der schwarze Taster der Reset-Knopf. Aber schau mal 
auf den Bestückungsdruck auf der Platine. Dort steht, welcher der 
User-Button und welcher der Reset-Button ist.

von Lutz H. (luhe)


Angehängte Dateien:

Lesenswert?

Ich habe mal mein COOCOX Projekt angehängt. Es ist für das Board mit dem 
Bildschirm, das seit einem Monat vertrieben wird.
Es gibt von STMicroelectronics eine Art Betriebssystem oder Treiber für 
die
einzelnen Baugruppen. Ich finde es eine gute Idee gleich die LED zu 
initialisieren und anzusprechen, als jedes mal aus dem Datenblatt jedes 
Bit für die Ansteuerung rauszusuchen. Vielleicht bring das was.



   /* Initialize LEDs, User Button and LCD on STM32F429I-Disco 
---------------------*/
   STM_EVAL_LEDInit(LED3);
   STM_EVAL_LEDInit(LED4);


     if (GPIOA->IDR & 0x0001)
     {
       STM_EVAL_LEDOn(LED4);
     }
     else
     {
       STM_EVAL_LEDOff(LED4);
     }

von 12V DC (Gast)


Lesenswert?

@Alex:
Das ist ja das seltsame, dass das nboard den resetknopf als normalen 
taster anerkennt und ausliest. Reset geht mit dem Programm net.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo 12V DC,

ich habe Dein Programm an meine IDE angepasst & laufen lassen im 
Release-Modus.
Ergebnis:
  * Taster blau - USER & WAKE-UP - lässt die blaue LED bei Betätigung 
leuchten.

gem. Layout:
  * PA0  >> USER & WAKE-UP Button
  * NRST >> RESET-Button
  * PD15 >> LD6 Blue

mfg
Olaf

von 12V DC (Gast)


Lesenswert?

Um die Nebenfrage von vorhin zu behandeln: Wieso geht 
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) nicht, aber GPIOA->IDR & 
0x0001?
Aber das wie gesagt nur mit dem Schwarzen Taster.

PS: Ich schau mir mal den code von lutz h an, aber ich muss das ganze an 
Editor+gcc anpassen.
PPS: Ich würde Lösungen mit GPIO_… bevorzugen, da ich erst in der 
Einarbeitungsphase bin.

von 12V DC (Gast)


Lesenswert?

@obrecht
Bei mir läufts aber nich mit dem Code. Hast du auch wirklich keine 
Änderungen am Code vorgenommen??

von 12V DC (Gast)


Lesenswert?

@lutz h

ich versteh nicht ganz wei das mein Problem lösen soll. Das sind doch 
nur die Beispiele für ein ähnliches Board, oder seh ich das falsch?
Und der gepostete Code ist doch nur eine Zusammenfassung von dem 
meinigen.

von Lutz H. (luhe)


Lesenswert?

12V DC schrieb:
> Nachdem ich mir vor 6 wochen das Stm32f4-discoveryboard gekauft

Ich habe ein Discoveryboard  mit Bildschirm, gibt es noch eine Version 
ohne Bildschirm?
Und wird die hier verwendet?

: Bearbeitet durch User
von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo 12V DC,

hier Auszug aus Code:
1
  if (GPIOA->IDR & 0x0001)
2
    {
3
      debug_printf("PIN PD15 ON\n");
4
      GPIO_SetBits(GPIOD,GPIO_Pin_15);
5
    }
6
    else
7
    {
8
      debug_printf("PIN PD15 OFF\n");
9
      GPIO_ResetBits(GPIOD,GPIO_Pin_15);   
10
    }
11
  }

Initialisierung & sonstiger Code wie bei Dir.

Ausgabe Debug-Terminal:
1
PIN PD15 OFF
2
PIN PD15 ON
3
PIN PD15 ON
4
PIN PD15 ON
5
PIN PD15 ON
6
PIN PD15 OFF
7
PIN PD15 OFF
8
PIN PD15 OFF
9
PIN PD15 OFF

Ich habe hier das STM32 F4 Discovery-Board.

von 12V DC (Gast)


Lesenswert?


von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo Lutz,

ich rede von diesem Board hier:
  * Variante ohne LCD: 
[[http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF252419]]

es gibt auch diese Variante
  * 
[[http://dangerousprototypes.com/2013/09/14/new-stm32f4-discovery-board-features-tft-lcd/]]

Ich denke, das das Deine ist.

mfg
Olaf

von 12V DC (Gast)


Lesenswert?

Jo ich hab auc die ohne LCD

von 12V DC (Gast)


Lesenswert?

@obrecht

Ne, dein code geht auch nicht und is sowieso derselbe wie bei mir(außer 
dem debug_printf, der nicht geht - Weißt du wie das mit arm-none-eabi 
geht?) Aber bei der Demo geht der Taster(das der nich geht kann also net 
sein).

Muss ich vielleicht irgendwelche Jumper öffnen?

von Lutz H. (luhe)


Lesenswert?

#define LEDn                             2

#define LED3_PIN                         GPIO_Pin_13
#define LED3_GPIO_PORT                   GPIOG
#define LED3_GPIO_CLK                    RCC_AHB1Periph_GPIOG

#define LED4_PIN                         GPIO_Pin_14
#define LED4_GPIO_PORT                   GPIOG
#define LED4_GPIO_CLK                    RCC_AHB1Periph_GPIOG
/**

@12VDC  Ich habe einen Unterschied gefunden, wird der richtige GPIO Port 
verwendet? bei mir ist es der Port  GPIOG nicht GPIOD Ich suche jetzt 
nach einer anderen   stm32f429i_discovery.h .  Mal schauen,ob die LED an 
verschiedenen Pins angeschlossen sind.

von 12V DC (Gast)


Lesenswert?

@lutz h

Die LED's gehen ja bei mir istdas Problem der Taster un der hängt an 
GPIOD(laut diversen tutorials)
Die LED's sind nur an einen Pin angeschlossen(hätte auch keinen Sinn 
wenns anders wär, oder?)
Aber wenn das ganze bei anderen klappt dann probiere ich es natürlich 
aus. Ich habe nur das Problem, dass bei mir nur ein Editor und ein 
Compiler arbeitet, und nicht irgendeine IDE die werweißwieviel 
verändert(Toolchain link oben). Bin nun mal überzeugter Linux-User ;)

von Lutz H. (luhe)


Angehängte Dateien:

Lesenswert?

Ja ich habe im Schaltplan nachgeschaut, die LED sind auch an einem 
anderen Port.

von 12V DC (Gast)


Lesenswert?

Pardon für den Verschreiber oben...
Ich meinte der Taster is garantiert an GPIOA und die LED's sind meines 
Wissens nur an GPIOD aber du hast ja ein einwenig anderes Board.

von Lutz H. (luhe)


Angehängte Dateien:

Lesenswert?

Hier ist die Schaltung von dem Butten,
was ist SB20.

von 12V DC (Gast)


Lesenswert?

ich glaube sb20 ist nur ein 0ohm wiederstand(Drahtbrücke SMD) aber genau 
weiß ichs nicht.

Aber wie kriege ich jetzt das Projekt zum Laufen??
Hat jemand Erfahrung mit arm-none-eabi und dem stm?

von 12V DC (Gast)


Lesenswert?

Laut dem hier müsste sb20 aber der Taster sein 
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf

(einfach mit strg+f suchen)

von Lutz H. (luhe)


Angehängte Dateien:

Lesenswert?

es könnte eine Lötbrücke auf der Unterseite sein?

von 12V DC (Gast)


Lesenswert?

Jaaa, siet gut aus ich glaub es is sowas, aber wie gesagt:

12V DC schrieb:
> Laut dem hier müsste sb20 aber der Taster sein
> 
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf
>
> (einfach mit strg+f suchen)

von Lutz H. (luhe)


Lesenswert?

Ich bin neugierig.
ON B1 pushbutton is connected to PA0.

Ist die Brücke drin?

von 12V DC (Gast)


Lesenswert?

Wo drin?

von X2 (Gast)


Lesenswert?

Der schwarze Button resettet den µC, deswegen geht auch die LED aus. 
Hängt laut 
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf 
auf NRST. Kann also garnicht von deiner SW ausgewertet werden.

SB20 ist die Lötbrücke auf der Unterseite die wenn geschlossen den 
Button B1 mit PA0 verbindet, wenn geöffnet ist PA0 offen, der Taster 
macht nix. Müsste wenn du nix dran rumgelötet hast geschlossen sein, 
also PA0 mit B1 verbunden.

von 12V DC (Gast)


Lesenswert?

Das seltsame ist nur, dass der Resetbutton genauso ragiert hat wie der 
blaue button sollte. D.h. die LED ging solange aus, bis der Taster 
losgelassen wurde. Das doch ist für gewöhnlich nicht ein Reset??

von X2 (Gast)


Lesenswert?

Doch, die LEDs hängen alle auf Masse, wenn du Reset drückst, liegt keine 
Spannung an PD15 und somit geht die LED aus.

Wie wäre es wenn du einfach mal schaust ob deine LED richtig angesteuert 
wird indem du sie blinken lässt? Ausserdem würde vielleicht debuggen 
helfen falls das bei dir funktioniert.

von Lutz H. (luhe)


Lesenswert?

Ich  habe diese Zeile noch im verdacht:
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

In diesem Beitrag ist die Einstellung auf meinem Board:
Autor: lutz h. (luhe)
Datum: 20.11.2013 18:14

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo 12V DC,

hier Initialisierung Struktur GPIO, die bei mir die gewünschten 
Resultate liefert:
1
// Konfiguration GPIOD Pin 12-15 >> LEDs
2
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
3
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
4
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
5
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
7
 
8
  // die ausgewählten PINS mit der Struktur initialisieren
9
  GPIO_Init(GPIOD, &GPIO_InitStructure);
10
11
  // Konfiguration GPIOA Pin 0 >> USER & WAKE-UP-Button
12
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
13
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
14
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
15
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
16
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
17
 
18
  // die ausgewählten PINs mit der Struktur initialisieren
19
  GPIO_Init(GPIOA, &GPIO_InitStructure);

Ich habe auch noch einmal die Belegung der PINs & SBs kontrolliert, sind 
alle so wie in Schaltplan eingezeichnet oder von X2 erklärt. SB20 ist 
SMD 0R, kann es aber nicht genauer erkennen, da trotz Lupenbrille nicht 
erkennbar.

Struktur oder Programm aber bei mir in Verbindung mit CMSIS.

Werde noch meinen LA anschliessen & Screenshot ziehen, kann aber ein 
bißchen dauern, da ich gerade ein anderes Projekt am LA hängen habe. 
;-))

mfg
Olaf

von Pete K. (pete77)


Lesenswert?

Müssen es 100Mhz sein? 50Mhz sollten auch für so einen dödeligen Taster 
und LED reichen.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo Pete,

es geht auch
1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;

mfg
Olaf

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo,

hier eine Site mit allerlei Infos:
[[http://eliaselectronics.com/stm32f4-tutorials/stm32f4-gpio-tutorial/]]

Einstellungen von dieser Site:
1
  /* Here the GPIOA module is initialized.
2
   * We want to use PA0 as an input because
3
   * the USER button on the board is connected
4
   * between this pin and VCC.
5
   */
6
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;      // we want to configure PA0
7
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;     // we want it to be an input
8
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//this sets the GPIO modules clock speed
9
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   // this sets the pin type to push / pull (as opposed to open drain)
10
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;   // this enables the pulldown resistor --> we want to detect a high level
11
  GPIO_Init(GPIOA, &GPIO_InitStruct);        // this passes the configuration to the Init function which takes care of the low level stuff

vor alllem interessant:
1
 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;   // this enables the pulldown resistor --> we want to detect a high level

mfg
Olaf

von 12V DC (Gast)


Lesenswert?

Ich kann eure Tipps im Moment nicht ausprobieren, aber von dem was ich 
so im Moment im Kopf habe, geht doch nach druck auf den Resetknopf die 
led kurz auf und es dauert einige Sekunden bis die led wieder leuchtet.
Deshlb meine Verwunderung.

PS: Ich versuchs heute nachmittqag nochmal.

von 12V DC (Gast)


Lesenswert?

Sooo

Ich habe gerade alles noch einmal ausprobiert mit dem Ergebnis: NICHTS!!
Langsam werd ich verrückt...

Naja also kann mir noch jemand mal den kompletten Quellcode für dieses 
Projekt schicken.

von Olaf B. (Firma: OBUP) (obrecht)


Angehängte Dateien:

Lesenswert?

Hallo 12V DC,

Dir den ganzen Quellcode zu schicken bringt m.E überhaupt nichts.
Jede IDE & jede Toolchain hat im Hintergrund andere Einstellungen die 
zusammen die ELF- und/oder HEX-Datei ergeben.

Als Beispiel: ich verwende hier gerade als Test-Umgebung Rowley's Cross 
Studio unter Win7.

Du verwendest
  + BS Linux
  + Compiler: gcc-arm-none-eabi-linux
  + IDE: ???

Wie sehen Deine Compiler- & Linker-Einstellungen aus?

Kannst Du eine HEX-Datei in Dein Board laden?

mfg
Olaf

von Lutz H. (luhe)


Lesenswert?

Ich würde ganz langsam anfangen.



Das läuf bei mir und schaltet eine LED an beim anderen Port GPIOD nutzen
ich glaube 3 mal ändern

Ein Programm schreiben   LED an.
  /* Initialize LEDs, User Button and LCD on STM32F429I-Disco 
---------------------*/
  // GPIOD Takt einschalten
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
   // GPIOA Takt einschalten
  // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

   GPIO_InitTypeDef  GPIO_InitStructure;
   GPIO_StructInit (&GPIO_InitStructure);

   // Konfiguriere PD15
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOG, &GPIO_InitStructure);
 //  GPIO_ResetBits(GPIOD,GPIO_Pin_14);
   GPIO_SetBits(GPIOG,GPIO_Pin_14);

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo Lutz,

ich würde auch ganz langsam anfangen. Es ist noch kein Programmierer vom 
Himmel gefallen, ich habe Jahre gebraucht & lerne immer noch.

Wir sollten aber vielleicht erst einmal einen gemeinsamen Nenner finden, 
ab dem wir dann die Programmierung & Fehleranalyse machen können.

Diese Cortexe haben es in sich. Überraschen mich immer wieder, vor allem 
auf HW-Seite.

mfg
Olaf

von 12V DC (Gast)


Lesenswert?

@obrecht
1.)Ich verwende gar keine IDE, sondern nur st-util und 
arm-none-eabi(-gdb)  um die verbindung aufzubauen und um Programme aufs 
Board zu laden.
2.)Ja, ich kann eine .hex aufs Board laden
3.)Ich will ja nur euren Quellcode und nicht die Compilierten elfs, 
binarys und hexes

@lutz h
Durch das LED anschalten bin ich schon durch LED+Taster ist mein zweiter 
Schritt.

@obrecht
Ich hab ja auch nicht gesagt, dass ich schon ausgelernt habe. Mit µC +C 
habe so gut wie keine Erfahrung(n paar basics) und mit Arduino bin ich 
sehr gut klargekommen. Sonstige C-Kentnisse: gut; Assembler: 
garnich(wobei ich es lernen möchte)

von Lutz H. (luhe)


Lesenswert?

12V DC schrieb:
> Durch das LED anschalten bin ich schon durch LED+Taster ist mein zweiter
> Schritt.

ich würde vorschlagen als zweiten schritt die LED  wieder Auszuschalten,
ohne einen Taster abzufragen.

Beispiel:
   GPIO_SetBits(GPIOD,GPIO_Pin_14);
;
  GPIO_ResetBits(GPIOD,GPIO_Pin_14);

Ich weis ist logisch, aber damit Testen wir trotzdem die Funktion.

 Als nächstes binde ich den Taster ein, der liegt glaube ich auf dem 
gleiche PIN bei beiden Ports

von Lutz H. (luhe)


Lesenswert?

Komisch ohne die Zeilen die ich mit ////? markiert habe wird bei mir der 
Taster nicht erkannt. Ist die Abfrage zu schnell?Vom Compiler optimiert?



   //  Konfiguriere PA0
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
////////////////////////////////////////////////////////


.
.
.
.
.





  do{
////?
////?    int hhh=(GPIOA->IDR & 0x0001);
  ////?  char Line[25];
//// ?   sprintf(Line,"%d",hhh);
////?     LCD_DisplayStringLine(LCD_LINE_1,(uint8_t*)Line);

    if (!(GPIOA->IDR & 0x0001))
    {
      GPIO_ResetBits(GPIOG,GPIO_Pin_14);
    }
    else
    {
      GPIO_SetBits(GPIOG,GPIO_Pin_14);
    }
  } while (1);

von 12V DC (Gast)


Lesenswert?

@lutz h
Durch das an und ausschalten bin ich auch schon durch. Geht auch.
Liegt das bei deinem Quellcode vielleicht an dem !-Operator in der 
Bedingung?

von Lutz H. (luhe)


Lesenswert?

Ja der ist von der Fehlersuche.
An der Stelle war bei komisches Verhalten,
  do{
    if (GPIOA->IDR & 0x0001)
    {
      GPIO_ResetBits(GPIOG,GPIO_Pin_14);
    }
    else
    {
      GPIO_SetBits(GPIOG,GPIO_Pin_14);
    }
  } while (1);
war der Code. dann habe ich zum Debuggen einzelne Zeilen verändert,um 
den Fehler zu finden (LED schaltet nicht um).
Das Ausrufezeichen hat nichts geändert, die LED wurde trotz Tastendruck 
nicht umgeschaltet.
Dann habe ich zum Debuggen den Taster am Bildschirm anzeigen lassen.
Plötzlich reagierte auch  die LED auf den Tastendruck. Jetzt habe ich
wieder der originalen Code, und die LED reagiert.
Fehlerheilung durch Handauflegen?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Nicht alles zugleich, sondern Schritt für Schritt:
- LED ein/aus
- LED blinken
- UART senden Zeichen
- UART senden Text
- UART senden Zahl
- ganzen Port einlesen und über UART anzeigen (Hex-Zahl)
- gewünschtes Bit maskieren und anzeigen
- und nun kann man das Bit nehmen und damit die LED steuern.

von Peter D. (peda)


Lesenswert?

lutz h. schrieb:
> Jetzt habe ich
> wieder der originalen Code, und die LED reagiert.
> Fehlerheilung durch Handauflegen?

Nö, der Fehler ist einfach nur müde geworden und schläft gerade.
Aber er kommt wieder, solange Du ihn nicht gefunden hast, versprochen.

Vielleicht den Pullup vergessen?

von Lutz H. (luhe)


Angehängte Dateien:

Lesenswert?

Peter Dannegger schrieb:
> Vielleicht den Pullup vergessen?

Die Widerstände sind laut Schaltplan am Taster.

: Bearbeitet durch User
von 12V DC (Gast)


Lesenswert?

Seid ihr sicher, dass es pullunder sin muss und nicht pulldown oder up?
Ich probier es gleich noch mal. Und wie gesagt Text senden kann ich noch 
nicht, ohne IDE gestaltet sich das schwieriger.

von 12V DC (Gast)


Lesenswert?

Also bei mir geht es mit 50hz und PuPu_UP garnicht.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo 12V DC,

hier mein - funktionierender - Code-Auszug:
1
/* Includes */
2
#include "stm32f4xx.h"
3
#include "stm32f4xx_conf.h"
4
#include "stm32f4xx_gpio.h"
5
#include "stm32f4xx_rcc.h"
6
7
void delay(void);
8
9
int main(void)
10
{
11
  // GPIOA Takt einschalten
12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
13
14
  // GPIOD Takt einschalten
15
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
16
17
  GPIO_InitTypeDef GPIO_InitStructure;
18
19
  // Konfiguration GPIOD Pin 12-15 >> LEDs
20
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
21
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
22
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
23
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
24
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
25
 
26
  // die ausgewählten PINS mit der Struktur initialisieren
27
  GPIO_Init(GPIOD, &GPIO_InitStructure);
28
29
  // Konfiguration GPIOA Pin 0 >> USER & WAKE-UP-Button
30
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
31
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;
32
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
33
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
34
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
35
 
36
  // die ausgewählten PINs mit der Struktur initialisieren
37
  GPIO_Init(GPIOA, &GPIO_InitStructure);
38
39
  debug_printf("Test ARM STM32 Cortex-M4 - CMSIS -\n");
40
41
  bool leaveLoop = false;
42
43
  GPIO_SetBits(GPIOD,GPIO_Pin_15);
44
45
  long loopCounter = 0;
46
47
  GPIO_ResetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15);
48
49
  while (leaveLoop != true)
50
  {
51
    long timeElapsed = 0;
52
    long * debugTime = 0;
53
    timeElapsed = debug_time(debugTime);
54
55
    debug_printf("%06d Sek. seit Beginn Debug\n", timeElapsed);
56
57
    if (GPIOA->IDR & 0x0001)
58
    {
59
      debug_printf("PIN PD15 ON\n");
60
      GPIO_SetBits(GPIOD,GPIO_Pin_15);
61
    }
62
    else
63
    {
64
      debug_printf("PIN PD15 OFF\n");
65
      GPIO_ResetBits(GPIOD, GPIO_Pin_15);   
66
    }
67
  }
68
69
  GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15);
70
  debug_exit(0);
71
}

IDE: Rowley Cross Studio
STM32 Dicovery-Board F4 ohne LCD
Verwendung der STM32F4xx Standard Peripherals Library 
[[http://www.mikrocontroller.net/articles/STM32F10x_Standard_Peripherals_Library]]
Target Prozessor: STM32F407VG
Preprozessor Definition: USE_STDPERIPH_DRIVER,STM32F40_41xxx


Dieses Beispiel läuft in meiner IDE verbunden über ST-Link/V2 ohne 
Probleme.
LA zeigt auch schön, wenn Taster betätigt, das LED verzögert anspricht.

mfg
Olaf

von 12V DC (Gast)


Lesenswert?

Ja ich habe mein Problem jetzt auch gelöst: Das Problem war die Zeile
1
SysTick_Config(SystemCoreClock/100);
 Leider weiß ich nicht genau wieso. Ich würde mich freuen, wenn mir das 
jemand erklären könnte.

von X2 (Gast)


Lesenswert?

Wie sieht die Funktion SysTick_Handler() bei dir aus? Mit 
SysTick_Config(SystemCoreClock/100); wird diese Funktion alle 100µs 
aufgerufen.

Hab hier ein LPC17xx Projekt, bei dem ist in diesem Handler eine 
Endlosschleife. Dein Problem ist, das du den Handler nicht implementiert 
hast, und du dadurch nach 100µs in einer Endlosschleife hängst. Dein 
Code wird ab da nicht mehr ausgeführt.

Einfach in deiner main.c diese Funktion implementieren, ohne Code drin, 
dann müsste es gehn. (oder SysTick_Config auskommentieren da du den 
anscheinend eh nicht benutzt im Moment)
1
void SysTick_Handler(void)
2
{
3
}

Würdest du eine IDE benutzen, hättest du den Fehler innerhalb von 
Sekunden gefunden indem du einfach im Debugger auf Pause gedrückt 
hättest.

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.