Считать число с порта stm32

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
pazitiff25
Сообщения: 10

Сообщение pazitiff25 » 22 сен 2018, 11:33

Братцы, подсобите!
Разбираюсь с STM32, купил stm32f767, скачал Cube и Keil. Воткнул в E-порт 4 провода, подаю на них двоичное число. Пины порта настроил в CubeMX как GPIO_input , в пин-конфигураторе подтянул к земле pull-down резистором.

Пользуюсь HALом. Один бит считывать научился - командой

if (HAL_GPIO_ReadPin (GPIOE, GPIO_PIN_1) == GPIO_PIN_SET)
{
...
}

А вот как теперь считать число с четырех пинов? Точнее, как склеить число из 4-х пинов и положить его в переменную?
Мне кажется, должно получиться что-то типа такого: int X = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1 | GPIOE, GPIO_PIN_2 | GPIOE, GPIO_PIN_3 | GPIOE, GPIO_PIN_4);

Qic
Сообщения: 985

Сообщение Qic » 22 сен 2018, 18:40

.
Последний раз редактировалось Qic 19 май 2019, 19:33, всего редактировалось 1 раз.

Аватара пользователя
iEugene0x7CA
Адепт
Сообщения: 1395
Откуда: Киев

Сообщение iEugene0x7CA » 23 сен 2018, 23:01

Зачем сразу так дерзко.
Кто тут на форуме писал, что мол все с чего-то начинают. :mrgreen:

Короче, если вопрос еще актуален — есть два варианта: питерский, и джедайский:
1. Питерский(но 100% рабочий):
*Создаём пустую переменную, с ней будем работать, и в итоге там окажется финальный результат;
*Читаем по очереди интересующие нас биты порта, от самого мелкого(least significant bit) и до самого жирного(most significant bit);
*В зависимости, ножка порта прочиталась как 1 или как 0 — через if/else прибавляем к переменной двоичное число нужного размера.
Например первый с мелкого конца(LSB) бит равен 1 – тогда к переменной прибавляем 0b00000001.
Если второй бит был равен 1, то прибавляем 0b00000010.
Если 7-й бит был 1, то прибавляем 0b01000000. Надеюсь идея понятна. :)
В итоге получается лёгкими умственными затратами то, что по-нормальному нужно делать битовой маской и сдвигом регистра.

2. Джедайский метод:
*Так же создаём пустую, на этот раз 32-битную переменную, с ней будем работать;
*Туда считываем напрямую из аппаратного регистра STM'ки всё состояние порта с интересующими нас ножками;
*Сдвигаем регистр вправо настолько, чтобы неинтересующие нас биты пропали, а LSB принятого числа по параллельной шине занял 1-й мелкий бит переменной;
*Битовой маской забиваем нулями все оставшиеся неинтересующие нас биты что остались слева.
*Вуаля — вот и число. ;)

pazitiff25
Сообщения: 10

Сообщение pazitiff25 » 23 сен 2018, 23:44

Нашел ролик https://www.youtube.com/watch?v=imBE-TVf0lY&t=575s , сделал так же, собрал число из битов.
x = (HAL_GPIO_ReadPin (GPIOC, GPIO_PIN_1) << 1) | (HAL_GPIO_ReadPin (GPIOC, GPIO_PIN_0) << 0);
Работает нормально. Так можно делать, или много ресурсов жрет? Все-таки мало того что библиотека HAL подключается, так еще и куча операций на каждой итерации обсчитывается.
Чем нравится способ - можно собирать любые свободные ноги, а не только от одного порта.

Вообще странно. В суперсовременном чипе нет простой команды считывания порта.

pazitiff25
Сообщения: 10

Сообщение pazitiff25 » 24 сен 2018, 00:36

Кстати, я слышал в STM порты можно двигать произвольным образом. Попробовал в Cube - не двигаются. Заблокированы по умолчанию?

Qic
Сообщения: 985

Сообщение Qic » 24 сен 2018, 02:44

.
Последний раз редактировалось Qic 19 май 2019, 19:33, всего редактировалось 1 раз.

pazitiff25
Сообщения: 10

Сообщение pazitiff25 » 27 сен 2018, 22:53

Научился передвигать порты. Серые двигать низзя, сперва надо сделать их зелеными (назначить функцию или ввод-вывод). Зажимаем ctrl, тыкаем пин курсором. Те места куда можно двигать подсвечиваются голубым. Если пин сдвинуть нельзя, то голубым не подсветится ничего. Великое открытие!!!

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя