Forum: Mikrocontroller und Digitale Elektronik stm32duino pinname datentyp


von DocRaptor (Gast)


Lesenswert?

Hallo euch allen,
ich möchte bei PlatformIO eine STM32F103 mit der Arduino (STM32duino) 
Libary programmieren und möchte, da es für meine Zwecke es einfacher 
ist, die Pin bzw. ihre Bezeichner (z.B. PA1) in einem Array speicher, um 
diese dann über pinMode zu verwerten:

   UnbekannterDatentyp digitalPins[] = {PA1, PC10, PB4}
   int size = sizeof(digitalPins);
   int i = 0;
   while(i<size){
      pinMode(digitalPins[i], OUTPUT);
      i++;
   }

(Dieser Code kann Fehler enthalten. Der ist nur ebend "hingeschmiert", 
damit man eine Vorstellung bekommt, was ich in etwa machen möchte)

Welchen Datentyp muss ich dort, wo im Beispiel UnbekannterDatentyp 
steht, einsetzen. Int würde bei den avr and atsam arduinos 
funktionieren, aber bei stm32duino nicht, da hier die Pine ja über 
Registernamen bezeichnet werden.

Habt ihr eine Idee?

Beitrag #6287976 wurde von einem Moderator gelöscht.
von leo (Gast)


Lesenswert?

DocRaptor schrieb:
> Welchen Datentyp muss ich dort, wo im Beispiel UnbekannterDatentyp
> steht, einsetzen. Int würde bei den avr and atsam arduinos
> funktionieren, aber bei stm32duino nicht, da hier die Pine ja über
> Registernamen bezeichnet werden.

PA1 ist ein #define:
1
~/.arduino15/packages/STM32/hardware/stm32$ ag 'ine PA1'|less
2
...
3
1.5.0/variants/BLUEPILL_F103XX/variant.h:71:#define PA1  21 // A1

D.h. "int" geht natuerlich schon.

leo

von Andreas S. (igel1)


Lesenswert?

Ich schließe mich leo an ...

Ein weiterer Beweis dafür ist die Tatsache, dass Du statt:
1
    pinMode(digitalPins[0], OUTPUT);

... natürlich auch schreiben könntest:
1
    pinMode(PA1, OUTPUT);

Also genügt in Blick in die Deklaration oder die Definition der Funktion 
pinMode, die als ersten Parameter mit 99,9999%iger Sicherheit einen 
Parameter vom Typ int erwarten wird.

Viele Grüße

Igel1

von Einer K. (Gast)


Lesenswert?

Dann sollte sowas ja möglich sein:

1
PinName digitalPins[] {PA1, PC10, PB4};
2
for(PinName pin:digitalPins)pinMode(pin, OUTPUT);
3
4
5
// alternativ
6
using PinType = decltype(PA1);
7
PinType digitalPins[] {PA1, PC10, PB4};
8
for(PinType pin:digitalPins)pinMode(pin, OUTPUT);
ohne Gewähr

von Stefan F. (Gast)


Lesenswert?

Ich hätte dazu einfach in den Quelltext der pinMode() Funktion geschaut, 
da kann man ja den Typ des Parameters direkt sehen.

von DocRaptor (Gast)


Lesenswert?

Hab es mit int probiert und es funktioniert. Vielen Dank.

von leo (Gast)


Lesenswert?

DocRaptor schrieb:
> int size = sizeof(digitalPins);

BTW: das gibt die nicht die Anzahl der Elemente im Array retuour.
Du willst:
1
#define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

leo

von Einer K. (Gast)


Lesenswert?

leo schrieb:
> DocRaptor schrieb:
>> int size = sizeof(digitalPins);
>
> BTW: das gibt die nicht die Anzahl der Elemente im Array retuour.
> Du willst:#define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

define war Gestern
1
    template<typename ArrayType, size_t count> 
2
    constexpr size_t arrayCount(const ArrayType (&)[count])
3
    {
4
      return count;
5
    }
6
7
// -------
8
9
int digitalPins[] {PA1, PC10, PB4};
10
11
for(...;i<arrayCount(digitalPins);...)

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.