Forum: Compiler & IDEs STM32 Port Datentyp?


von Johnny S. (sgt_johnny)


Lesenswert?

Ich habe es mitlerweilen geschafft STM32 auf C++ zu konvertieren und 
bereits erste Beispiele ausprobiert. Nun möchte ich einige verwendet 
Libraries aus einem Projekt konvertiren.

Da es so aussieht das STM32 für einen Pin-Change zwei Variablen 
benötigt, möchte ich diese gerne auf ein Objekt umbiegen wie z.b.


#define AO_Pin GPIO_PIN_1
#define AO_GPIO_Port GPIOB
uint8_t thePin[2] ={AO_Pin,AO_GPIO_Port}

So das den Funktionen "thePin" weitergeben wird, welche sie ebenfalls 
weiter an die Schreibfunktion übermittelt.
Das sähe dann so aus:


classname::init(uint8_t *pin){
writePin(pin);
}

classname:writePin(uint8_t *pin){
HAL_GPIO_TogglePin(pin[0],pin[1]);
}


Nur leider weiss ich nicht was denn GPIOB für ein Datentype ist?? Kann 
mir hier jemand weiterhelfen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist doch eine Adresse, oder? Also ist es ein Pointer. Wie groß ist 
das Register, auf das dieser Pointer zeigt? Ist das ein 8- oder 
16-Bit-Register?

Also ist das entweder ein Pointer auf uint8_t oder uint16_t.

von Hans-Georg L. (h-g-l)


Lesenswert?

Johnny S. schrieb:
> Ich habe es mitlerweilen geschafft STM32 auf C++ zu konvertieren und
> bereits erste Beispiele ausprobiert. Nun möchte ich einige verwendet
> Libraries aus einem Projekt konvertiren.
>

Aha ;-)

>
> #define AO_Pin GPIO_PIN_1
> #define AO_GPIO_Port GPIOB
>
> Nur leider weiss ich nicht was denn GPIOB für ein Datentype ist?? Kann
> mir hier jemand weiterhelfen?

GPIOB nennt sich üblicherweise PORTB und ist ein Zeiger auf das uin32_t 
Register mit dem Offset 0 = MODER (Mode Register);
Pin int eine Zahl (enum) 0...15;

> classname::init(uint8_t *pin){
> writePin(pin);
> }

Damit wirst du ohne weitere Parameter nicht weit kommen ...
Ein Stm32F port hat 10 32bit Register davon sind 4 zur Konfiguration der 
pins. Wenn du alternate Functions verwendest sind es noch 2 mehr.

von Rolf M. (rmagnus)


Lesenswert?

Johnny S. schrieb:
> Nur leider weiss ich nicht was denn GPIOB für ein Datentype ist?? Kann
> mir hier jemand weiterhelfen?

Einfach im Header nachsehen. GPIOB ist vom Typ Zeiger auf GPIO_TypeDef. 
Wie Hans-Georg schon schreibt, wirst du aber noch ein paar mehr Sachen 
brauchen. Und ein Array ist da nun ganz ungeeignet. Definiere dir eine 
Struct.

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


Lesenswert?

Johnny S. schrieb:
> Nun möchte ich einige verwendet
> Libraries aus einem Projekt konvertiren.
>
> Da es so aussieht das STM32 für einen Pin-Change zwei Variablen
> benötigt, möchte ich diese gerne auf ein Objekt umbiegen wie z.b.
>
> #define AO_Pin GPIO_PIN_1
> #define AO_GPIO_Port GPIOB
> uint8_t thePin[2] ={AO_Pin,AO_GPIO_Port}

Dein Ansinnen ist falsch. Ein Port ist keine Variable, sondern ein Gerät 
mit zwei Interfaces: eines draußen zum Anlöten und eines drinnen mit 
Registern, die das Bedienen dieses Gerätes ermöglichen. Und das, was man 
da bedienen kann, ist von Chip zu Chip und Port zu Port und Pin zu Pin 
nur ähnlich, aber nicht gleich.

Also laß dein Ansinnen fallen, Pins mit generalisierten Funktionen 
beglücken zu wollen. Solche Ideen stammen eher aus AVR-Gefilden, sind 
aber für die Welt der Cortexe einfach nur unpassend.

Mache dir stattdessen projekt- und aufgabenbezogene Lowlevel-Treiber. 
Etwa so in der Art:
void SchalteMotorEin(void);
bool isRiegelOffen(void);
void LampeDimmen(int prozent);
und so weiter. Und innerhalb dieser Treiber greifst du direkt gemäß 
RefManual auf das am besten geeignete Register des betreffenden Ports 
zu. Es gibt nämlich je nach Chip eine ganze Reihe von sehr 
unterschiedlichen Arten, die Ports zu bedienen.

W.S.

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.