Как правильно назначить пины для STM32

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Столкнулся с, казалось бы, простой задачей, которая ввела меня в ступор... Пишу программу для STM32F103C8T6 в среде Arduino. Обычно пины я объявляю так:

int LED = PC13;
void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
}

Либо же объявляю пины через #define

Сейчас мне необходимо создать массив с указанием на пины для работы в цикле. Но как это правильно написать не пойму. Если написать вот так:

byte Variable1[4];
byte Variable2[4];
byte Variable3[4];

Variable1[0] = PA0;
Variable2[0] = PA1;
Variable3[0] = PA15;
...
Variable1[3] = PB9;
Variable2[3] = PB8;
Variable3[3] = PB

То получаю ошибку "does not name a type":

Blink:5:1: error: 'Variable1' does not name a type
 Variable1[0] = PA0;
 ^
Blink:6:1: error: 'Variable2' does not name a type
 Variable2[0] = PA1;
 ^
Blink:7:1: error: 'Variable3' does not name a type
 Variable3[0] = PA15;
 ^
Blink:9:1: error: 'Variable1' does not name a type
 Variable1[3] = PB9;
 ^
Blink:10:1: error: 'Variable2' does not name a type
 Variable2[3] = PB8;
 ^
Blink:11:1: error: 'Variable3' does not name a type
 Variable3[3] = PB7;
 ^

exit status 1
'Variable1' does not name a type

Если же сразу задавать значение:

byte Variable1[0] = PA0;
byte Variable2[0] = PA1;
byte Variable3[0] = PA15;

byte Variable1[3] = PB9;
byte Variable2[3] = PB8;
byte Variable3[3] = PB7;

То получаю сразу несколько ошибок: "error: array must be initialized with a brace-enclosed initializer" и "conflicting declaration"

Blink:1:21: error: array must be initialized with a brace-enclosed initializer
 byte Variable1[0] = PA0;
                     ^

Blink:2:21: error: array must be initialized with a brace-enclosed initializer
 byte Variable2[0] = PA1;
                     ^

Blink:3:21: error: array must be initialized with a brace-enclosed initializer
 byte Variable3[0] = PA15;
                     ^

Blink:5:17: error: conflicting declaration 'byte Variable1 [3]'
 byte Variable1[3] = PB9;
                 ^

Blink:1:6: error: 'Variable1' has a previous declaration as 'byte Variable1 [0]'
 byte Variable1[0] = PA0;
      ^

Blink:6:17: error: conflicting declaration 'byte Variable2 [3]'
 byte Variable2[3] = PB8;
                 ^

Blink:2:6: error: 'Variable2' has a previous declaration as 'byte Variable2 [0]'
 byte Variable2[0] = PA1;
      ^

Blink:7:17: error: conflicting declaration 'byte Variable3 [3]'
 byte Variable3[3] = PB7;
                 ^

Blink:3:6: error: 'Variable3' has a previous declaration as 'byte Variable3 [0]'
 byte Variable3[0] = PA15;
      ^

exit status 1
array must be initialized with a brace-enclosed initializer

Подскажите, как правильно это сделать?

rkit
Offline
Зарегистрирован: 23.11.2016

byte Variable1[] = {PA0, PB9, ...};

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

byte Variable1[4];
byte Variable2[4];
byte Variable3[4];

Variable1[0] = PA0;
Variable2[0] = PA1;
Variable3[0] = PA15;
...
Variable1[3] = PB9;
Variable2[3] = PB8;
Variable3[3] = PB

То получаю ошибку "does not name a type":

у вас проблема не с "пинами СТМ", а с тем что вы у вас неверная структура программы.

Судя по всему, процитированный выше код вы размещаете в глобальной области - то есть до любых процедур и функций? - по стандарту Си тут может размещаться только описание и (одновременная) инициализация переменных.

Строчка  Variable1[0] = PA0; - это не то и не другое, в глобальной области ее размещать нельзя.

Сделайте либо так, как написал rkit. либо выполните присвоение элементов массива внутри какой-то функции. например setup

byte Variable1[4];
byte Variable2[4];
byte Variable3[4];

void setup() {
Variable1[0] = PA0;
Variable2[0] = PA1;
Variable3[0] = PA15;
}

Из этих вариантов более короткий и правильный - вариант rkit. но и мой тоже иногда бывает полезным


 

forfrends
Offline
Зарегистрирован: 24.02.2015

Спасибо!