STM32 Port Datentyp?

#5609846
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?
#5609894
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.
Gast #5613454
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren