[uquote="Adrift",url="/forum/viewtopic.php?p=4648283#p4648283"]Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой[/uquote]Не понял - что нужно сравнивать, но вот:
Код: Выделить всё
#define PORT2(port, pin) port
#define PIN2(port, pin) pin
#define PORT(port_pin) PORT2(port_pin)
#define PIN(port_pin) PIN2(port_pin)
uint i = concat(GPIO, PORT(PIN_BUTTON1))->IDR; //операция одного чтения.
и т.д.
[uquote="Adrift",url="/forum/viewtopic.php?p=4648283#p4648283"], а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )[/uquote]Если портов много, то - создаём битмап портов:
#define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...)
а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, ....
Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.
Но правильнее все кнопки посадить на минимально-возможное кол-во портов. Чтобы уменьшить число необходимых чтений GPIO в ISR и уменьшить время его выполнения.
Добавлено after 12 minutes 32 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4648326#p4648326"]Классно. Когда пнули, оказалось, что всё знает, а мы дураки. И оказывается, правильно и неправильно - это теперь вариантами называется

[/uquote]
Не, нифига не знает.
Пишет, что знает что такое"побитовые операции", но при этом так и не понял почему обращение к EXPI_PR нужно только одно. Одно высказывание противоречит другому.
И почему плохо читать 6 раз - скорее всего тоже не понял.
Просто тупо скопипастит сейчас чужой код, а потом, когда что-то не станет работать - опять прибежит сюда.
