Forum: Mikrocontroller und Digitale Elektronik STM32: wie Struktur übergeben


von Holger (Gast)


Lesenswert?

Hallo,

ich habe ein STM32 und möchte in einer Funktion den aktuellen Pegel des 
Portpins auf dem Display ausgeben. Die Funktion wird an vielen Stellen 
aufgerufen und soll den Quellcode an den Stellen übersichtlicher machen 
(jeweils nur 1 Quellcodezeile).

Mit der Funktionsdeklaration habe ich gewisse Probleme. Es funktioniert 
zwar, aber der Compiler meckert, wenn ich die Datei über *.h einbinde.

1
void pinpegel_ausgeben(GPIO_TypeDef* Port, uint16_t uiPin, unsigned int uiX, unsigned int uiY)
2
  {
3
  uint8_t currentRtcIntState;
4
  
5
  currentRtcIntState = HAL_GPIO_ReadPin(Port, uiPin);
6
  if(currentRtcIntState == 0)
7
    displaybefehl_text_ausgeben_TFT(uiX, uiY, "0");
8
  else
9
    displaybefehl_text_ausgeben_TFT(uiX, uiY, "1");
10
11
  return;

Der Aufruf der Funktion ist wie folgt:
1
pinpegel_ausgeben(MB1_RST_GPIO_Port, MB1_RST_Pin, KT0T+KT91H, KT91I+0*KT91J);



Wie muß die Funktionsdeklaration aussehen? Wäre nett, wenn mir jemand 
weiter helfen könnte.

Grüße Holger

von Holger (Gast)


Lesenswert?

Nachtrag:

Das "GPIO_TypeDef* Port" in der Funktionsdeklaration ist das Problem.

von Stefan F. (Gast)


Lesenswert?

Du hast vergessen, die Fehlermeldung zu zitieren.

Bei solchen Sachen solltest du auch immer mit angeben, welchen Compiler 
und welche Libraries (incl. Versionsnummern) du verwendet hast.

von Ungebildeter (Gast)


Lesenswert?

Holger schrieb:
> Mit der Funktionsdeklaration habe ich gewisse Probleme. Es funktioniert
> zwar, aber der Compiler meckert, wenn ich die Datei über *.h einbinde.

Falls du Funktionen über *.h Dateien einbindest ist das
grundsätzlich der falsche Weg.

Funktionen werden in *.c Dateien geschrieben und deren Prototypen
in *.h Dateien für andere bekannt gemacht.

von Holger (Gast)


Lesenswert?

Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:
unknown type name 'GPIO_TypeDef' in diagnose.h

Gebe ich nichts in diagnose.h an, so kommt in der *.c die folgende 
Warnung:
implicit declaration of function 'pinpegel_ausgeben'; did you mean 
'statsbilder_neu_ausgeben'? [-Wimplicit-function-declaration]

Ich verwende Segger V4.16

von Stefan F. (Gast)


Lesenswert?

Holger schrieb:
> Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:
> unknown type name 'GPIO_TypeDef' in diagnose.h

Du musst in der Datei diagnose.h die *.h Datei inkludieren, in der die 
Register definiert sind.

von Holger (Gast)


Lesenswert?

Ungebildeter schrieb:
> Falls du Funktionen über *.h Dateien einbindest ist das
> grundsätzlich der falsche Weg.
>
> Funktionen werden in *.c Dateien geschrieben und deren Prototypen
> in *.h Dateien für andere bekannt gemacht.

In diagnose.c ist diese mit Funktion mit "void 
pinpegel_ausgeben(GPIO_TypeDef* Port, uint16_t uiPin, unsigned int uiX, 
unsigned int uiY)" definiert.

In diagnose.h das selbe, nur mit Strichpunkt hinten dran. Wie erwähnt, 
geht das Ganze nicht, wenn ich die Bekanntmachung in diagnose.h mache.

von Ungebildeter (Gast)


Lesenswert?

Holger schrieb:
> Wenn ich die Funktion in diagnose.h deklariere, kommt folgende Meldung:
> unknown type name 'GPIO_TypeDef' in diagnose.h

Du brauchst dann noch die Bezüge aus gpio.h.

Also alle *.c Dateien die diagnose.h inkludieren sollten vorher
noch z.B. stm32f4xx_gpio.h (kommt drauf an welchen STM du
verwendest) inkludieren.

von Holger (Gast)


Lesenswert?

ich habe nun auch in diagnose.h
#include "stm32f7xx_hal.h" ergänzt. Nun kommt die Meldung nicht mehr.
1
#ifndef DIAGNOSE_H
2
#define DIAGNOSE_H
3
4
#include "stm32f7xx_hal.h"
5
6
void pinpegel_ausgeben(GPIO_TypeDef* Port, uint16_t uiPin, unsigned int uiX, unsigned int uiY);
7
8
#endif

von Holger (Gast)


Lesenswert?

... nun geht es! Aber ob es sinnvoll ist, in einer *.h-Datei eine andere 
*.h anzugeben? Bisher habe ich dies immer in *.c gemacht.

von Stefan F. (Gast)


Lesenswert?

Holger schrieb:
> Aber ob es sinnvoll ist, in einer *.h-Datei eine andere
> *.h anzugeben?

Wenn du da Zweifel hast, dann werfe doch einfach mal einen Blick in die 
*.h Dateien von Profis. Du hast ja reichlich davon vorliegen.

von Ungebildeter (Gast)


Lesenswert?

Holger schrieb:
> Bisher habe ich dies immer in *.c gemacht.

Und das ist auch richtig.
Sekundär-Includes sind zu vermeiden.

Also so:

Ungebildeter schrieb:
> Also alle *.c Dateien die diagnose.h inkludieren sollten vorher
> noch z.B. stm32f4xx_gpio.h (kommt drauf an welchen STM du
> verwendest) inkludieren.

Die Betonung liegt auf vor

von Holger (Gast)


Lesenswert?

Ungebildeter schrieb:
> Die Betonung liegt auf vor

Danke für den Hinweis, hatte ich übersehen. Nun geht es auch ohne die 
Nennung der Datei in *.h.

Vielen Dank!

Gruß Holger

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.