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

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Post Reply
pazitiff25
Posts: 10
Joined: 22 Sep 2018, 11:00

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

Post by pazitiff25 »

Братцы, подсобите!
Разбираюсь с 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
Posts: 985
Joined: 03 Feb 2012, 00:14

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

Post by Qic »

.
Last edited by Qic on 19 May 2019, 19:33, edited 1 time in total.
User avatar
iEugene0x7CA
Адепт
Posts: 1571
Joined: 20 May 2012, 02:38
Location: Киев

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

Post by iEugene0x7CA »

Зачем сразу так дерзко.
Кто тут на форуме писал, что мол все с чего-то начинают. :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
Posts: 10
Joined: 22 Sep 2018, 11:00

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

Post by pazitiff25 »

Нашел ролик , сделал так же, собрал число из битов.
x = (HAL_GPIO_ReadPin (GPIOC, GPIO_PIN_1) << 1) | (HAL_GPIO_ReadPin (GPIOC, GPIO_PIN_0) << 0);
Работает нормально. Так можно делать, или много ресурсов жрет? Все-таки мало того что библиотека HAL подключается, так еще и куча операций на каждой итерации обсчитывается.
Чем нравится способ - можно собирать любые свободные ноги, а не только от одного порта.

Вообще странно. В суперсовременном чипе нет простой команды считывания порта.
pazitiff25
Posts: 10
Joined: 22 Sep 2018, 11:00

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

Post by pazitiff25 »

Кстати, я слышал в STM порты можно двигать произвольным образом. Попробовал в Cube - не двигаются. Заблокированы по умолчанию?
Qic
Posts: 985
Joined: 03 Feb 2012, 00:14

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

Post by Qic »

.
Last edited by Qic on 19 May 2019, 19:33, edited 1 time in total.
pazitiff25
Posts: 10
Joined: 22 Sep 2018, 11:00

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

Post by pazitiff25 »

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