Forum: Compiler & IDEs STM32 und CubeIDE Programm verweigert das Befehl


von Leon D. (leon_d169)


Angehängte Dateien:

Lesenswert?

Moin!
Ich bin ganz frisch in Programmieren und deshalb spiele ich noch mit 
STM32.

Taster ist auf Pin PC_13, als SW umbenannt, GPIO_Input
LED_1 auf PA5, GPIO_Output
LED_2 auf PA6, GPIO_Output
LED_3 auf PA7, GPIO_Output

Taster sitzt direkt auf der Platine und Ende ist auf GNR angeschlossen, 
kein extra Widerstand.

Programm,

/* USER CODE BEGIN WHILE */
  while (1)
  {


    /*  */

    if (!HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin))
    {

      while (HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin)==1)
      {

        HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, SET);

        HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin,RESET);

        HAL_GPIO_TogglePin(LED_3_GPIO_Port, LED_3_Pin);
                HAL_Delay(60);
      }

    }

    else
    {

          HAL_GPIO_WritePin(LED_3_GPIO_Port, LED_3_Pin,RESET);
          HAL_GPIO_TogglePin(LED_1_GPIO_Port, LED_1_Pin);
          HAL_Delay(100);
          HAL_GPIO_TogglePin(LED_2_GPIO_Port, LED_2_Pin);
          HAL_Delay(100);
    }


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Wenn ich nichts mache Blinken Led 1 und 2 vor sich hin.
Wenn Taster gedruckt wird, leuchtet Led 1 und Led 3 blinkt ziemlich 
furchteinflößend(nur mal zum testen).
Zweites mal Taster betätigen, soll sich Ausgangszustand wieder 
herstellen und Led 1 und 2 sollten vor sich hin blinken.
Damit ein Led nicht am leuchten Bleibt während ich da rum schalte, habe 
ich betroffene Leds "RESET´tet" in Code.

Ich vermute mal, dass mein Code ist zu "Grün" ist und obwohl ich den 
Taster Drucke, passiert teilweise die Umschaltung nicht, ich sehe das 
Board den Schaltvorhang mitbekommt, in dem das Blinken von LED´s 
Aufhört.

Mal funktioniert die Vorhabe, mal nicht, was habe ich falsch gemacht?
Lasst mich nicht doof sterben =)

By the Way, zu Verfügung steht mit die Seite
https://os.mbed.com/platforms/ST-Nucleo-F401RE/#board-pinout

Kann sein dass ich die PA_10,PA_2,PA_3 und so weiter nicht als 
Taster/Schalter anwenden kann, denn ich habe es auf GPIO_Input gestellt 
und habe nicht den erforderlichen Resultat erhalten, so wie bei PC_13...

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

Leon D. schrieb:
> Lasst mich nicht doof sterben

Dann vergrößere dein Wissen und Können in Elektronik, Schaltungstechnik, 
Programmierung - kurzum, lerne selbst dazu. Das ist das Einzige, was 
dir wirklich hilft.

W.S.

von pegel (Gast)


Lesenswert?

Leon D. schrieb:
> PA_2,PA_3

sind als UART zum ST-Link verdrahtet, also erst einmal nachsehen was das 
Board vorgibt.

von J. S. (jojos)


Angehängte Dateien:

Lesenswert?

Leon D. schrieb:
> By the Way, zu Verfügung steht mit die Seite
> https://os.mbed.com/platforms/ST-Nucleo-F401RE/#board-pinout

auf der Seite gibt es auch gleich ein geiles OS das die Entwicklung 
vereinfacht und direkt mit diesem Board genutzt werden kann :) Geht mit 
diesem Board sogar mit dem Online Compiler, es muss keine Software 
installiert werden.

Der Hinweis von Pegel war auch richtig, PA2/PA3 sind fest mit dem STLink 
verbunden. Bzw. über die Jumper die man öffnen könnte, würde ich aber 
nicht machen. Mit wenigen Zeilen Code kann man das printf() über USB 
aktivieren.
In der IDE kann man ein Projekt mit dem Board als Basis starten und die 
verdrahtete Peripherie initialisieren lassen.

Für das eigentliche Problem solltest du eine Flankenerkennung bauen und 
dann mit jeder steigenden oder fallenden eine Modus Variable umschalten.

von Jens R. (tmaniac)


Lesenswert?

Leon D. schrieb:
> Wenn ich nichts mache Blinken Led 1 und 2 vor sich hin.
> Wenn Taster gedruckt wird, leuchtet Led 1 und Led 3 blinkt ziemlich
> furchteinflößend(nur mal zum testen).

Das ist genau das was du programmiert hast 😉

Mal kurz zum Nachdenken, weil ich denke du erwartest was anderes.
Dein Programm sieht so aus:
1
Mache für immer
2
{
3
  Wenn Taste gedrückt
4
  {
5
    LED1 an
6
    LED2 aus
7
    Warte 60ms
8
    Wechsle zwischen LED3 an und aus, bzw zwischen aus und an
9
  }
10
  Sonst
11
  {
12
    LED3 aus
13
    Wechsle LED1
14
    Warte 100ms
15
    Wechsle LED2
16
    Warte 100ms
17
  }
18
} (gehe zum Anfang)

Die Blinke Zeit ohne Taster gedrückt ist also 3.5mal so lange wie die 
mit gedrückten Taster

von Leon D. (leon_d169)


Lesenswert?

Erst mal vielen lieben Dank für viele Tipps. Ich setze mich tatsächlich 
noch auseinander mit User Manual. Ist aber alles auf "Ingenieurisch", da 
habe ich noch einige Semester vor mir =D

Jap Jens, genau so wollte ich es, ich weiß das es kaum Sinn ergibt, aber 
ich wollte mal testen, ob ich es überhaupt hin kriege.
Ein mal Taster drucken, los lassen, ist eine Relais Selbshaltung mit 
While Schleife gelöst.

Wenn SW Taste angezogen ist:
if (!HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin))

Dann Led 1 brennt dauerhaft, Led 2 ausmachen(falls vorher an gewesen),
Led 3 blinkt 60ms.
Nochmal Tate drucken, dann ist die While Bedienung von while 
(HAL_GPIO_ReadPin(SW_GPIO_Port, SW_Pin)==1) erfühlt und es kann weiter 
gehen.

Sonst dauerhaft Led 3 aus, Led 1 und Led 2 blinken(jeweils 100ms).

Mein Problem ist, das es nur sporadisch funktioniert, vielleicht halte 
ich die Taste zu lange gedruckt? Gibt es vielleicht eine Option noch in 
.IO File es zu korrigieren?

Was J.S. meint, das habe ich leider aus der Seite nicht 
gefunden...klingt alles sehr hilfreich, ich lese mich da durch =)
"In der IDE kann man ein Projekt mit dem Board als Basis starten und die
verdrahtete Peripherie initialisieren lassen."- finde ich irgendwie 
nicht =(

von Jens R. (tmaniac)


Lesenswert?

Leon D. schrieb:
> Nochmal Tate drucken, dann ist die While Bedienung von while

Lese noch einmal was ich geschrieben habe, und denke noch einmal nach.

Dein if sagt mache das eine so lange die Taste gedrückt ist, und mache 
das andere so lange keine Taste gedrückt ist.
Nicht wechsle bei Tastendruck und wieder los lassen.


Weil es wahrscheinlich als nächstes kommt: dein Taster wird beim 
Betätigen mit hoher Wahrscheinlich auch nicht nur einen Wechsel 
erzeugen. Jeder normale Schalter "prellt" (google mal "Taster 
entprellen")

Desweiteren schau dir ruhig mal ein paar Tutorials (vielleicht auch als 
Video) an.

von J. S. (jojos)


Angehängte Dateien:

Lesenswert?

Leon D. schrieb:
> "In der IDE kann man ein Projekt mit dem Board als Basis starten und die
> verdrahtete Peripherie initialisieren lassen."- finde ich irgendwie
> nicht =(

Es gibt mehrere Möglichkeiten ein Projekt zu starten, aus der IDE 'New 
STM32  Project' und es startet der Target Selektor.
Da kann man wählen ob man mit der nackten CPU startet oder bei Board 
eben mit einem Nucleo/Disco Board. Wenn man das wählt, dann werden die 
fest verdrahteten Sachen schon vorkonfiguriert.

von Leon D. (leon_d169)


Lesenswert?

ich habe erst jetzt verstanden, dass ich HAL_GPIO_WritePin anwenden 
sollte. als Taster Befehl,

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.