Re: Обработка кнопок, EXTI[0]
Добавлено: Ср ноя 13, 2024 13:47:32
Да, есть варианты. Но то, что можно читать вместе, лучше/и легче/ читать вместе (например состояние 3 пинов в одном порту).
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Это же пример, скучно просто читать с порта ) Естественно пины были сконфигурированы на вывод.jcxz писал(а):код этот ваш делает следующую операцию:Какое отношение это имеет к теме опроса ног - вообще непонятно....Код: Выделить всё
u32 *p = ...; p[6] = ~p[4] & 0xE0 | 0xE00000;![]()
Также очевидно, что ноги подключенные к кнопкам, настроены на ввод. Какой смысл в них что-то писать? Что это даст?
Что не может работать? Смотрите, 2010 год, либа для AVR, да на старом С++, да не настолько эффективна, но работает и уже можно было писать код типа:jcxz писал(а):Вы приводите нечто невразумительное. Что ни проверить ни даже просто посмотреть - невозможно. И что очевидно и работать в принципе не может. И в чём сами же очевидно нифига не разбираетесь. При этом ещё сразу начинаете наезжать и пытаться чем-то меряться...
Код: Выделить всё
typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4> MyPins;
MyPins::Write(0x55);Код: Выделить всё
static uint32_t _inline_ read()
{
return ports_.accumulate(readDummy(pins_), [](auto port) __inline__ {
return readWrite<PinShift::Read>(GpioT<unbox<port>::port, 0xFFFF>::read(), getIndexedPins<unbox<port>::port>(pins_)); });
}Код: Выделить всё
static constexpr auto pins_ = TypeList<Pins...>::accumulate(TypeList<>{}, [](auto pin) { return expandPL<unbox<pin>>(); });
static constexpr auto realPins_ = pins_.remove([](auto pin) { return IsDummyPin<unbox<pin>>; });
static constexpr auto ports_ = realPins_.unique([](auto pin1, auto pin2) { return unbox<pin1>::port == unbox<pin2>::port; });Код: Выделить всё
static consteval auto unique(auto pred) { return unique_(pred, TypeList<Ts...>{}); }
template<typename... In, typename... Out>
static consteval auto unique_(auto pred, TypeList<In...> in, TypeList<Out...> out = {})
{
if constexpr (in.empty())
{
return out;
}
else
{
if constexpr (!out.contains(in.head(), pred))
return unique_(pred, in.tail(), out.pushBack(in.head()));
else
return unique_(pred, in.tail(), out);
}
}Я не мог бы написать с нуля, но когда увидел как это работает, то думаю может чуть похуже, но могу и написать, по крайней мере на rp2350 портировать смог. А вы сейчас даже не можете поверить, что такое в принципе возможно )jcxz писал(а):Чем докажете? Раз не можете сами написать, а тырите откуда-то - очевидно совершенно не понимаете.
Я настроил на вывод, предварительно выполнив write(0b010) и проверил, что после write(~read()) в битах 7..5 порта оказывается 0b101, значит в том числе и чтение работает правильно. Пример демонстрировал работу с портами, одной строкой можно не только прочитать, но и записать, а если нужно только читать состояние кнопок, то настраиваем порты на вход и читаем, какие проблемы...jcxz писал(а):Полный бред...Вы даже не понимаете что такое GPIO и как он работает.
Как можно что-то читать (состояние кнопок) с пинов "настроенных на вывод"???
Код: Выделить всё
//.h
#define PIN_BUTTON1 A, 7
#define PIN_BUTTON2 A, 6
#define PIN_BUTTON3 A, 5
//.cpp
#define PIOIX_A 0
#define PIOIX_B 1
#define PIOIX_C 2
#define PIOIX_D 3
#define PIOIX_E 4
#define PIOIX_F 5
#define PIOIX_G 6
#define PIOIX_H 7
#define PORT_IX2(port, pin) PIOIX_##port
#define PORT_IX(port_pin) PORT_IX2(port_pin)
#define BTN_PORT_MAP (1u << PORT_IX(PIN_BUTTON1) | 1u << PORT_IX(PIN_BUTTON2) | 1u << PORT_IX(PIN_BUTTON3))
void f()
{
#if BTN_PORT_MAP & 1 << 0
uint iA = GPIOA->IDR;
#endif
#if BTN_PORT_MAP & 1 << 1
uint iB = GPIOB->IDR;
#endif
#if BTN_PORT_MAP & 1 << 2
uint iC = GPIOC->IDR;
#endif
#if BTN_PORT_MAP & 1 << 3
uint iD = GPIOD->IDR;
#endif
#if BTN_PORT_MAP & 1 << 4
uint iE = GPIOE->IDR;
#endif
#if BTN_PORT_MAP & 1 << 5
uint iF = GPIOF->IDR;
#endif
#if BTN_PORT_MAP & 1 << 6
uint iG = GPIOG->IDR;
#endif
#if BTN_PORT_MAP & 1 << 7
uint iH = GPIOH->IDR;
#endif
......
}Код: Выделить всё
uint32_t val = pins.read();Код: Выделить всё
#if BTN_PORT_MAP & 1 << 0
uint iA = GPIOA->IDR;
#endifЧеловеки пользуются HAL потому что он уже написан и сколько там тысяч строк для них не имеет значения. Разницу между сложностью написания библиотек и сложностью их использования не видите?jcxz писал(а):А человеки, использующие HAL по вашему - нормальные? А ведь в файлах HAL там не "30 строчек", а ГОРАЗДО больше! Может и все 30 тысяч строк.
"Любого нормального человека" такой объём не напрягает? Почему тогда "30 строк" напрягают?