jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 (изменено) · Жалоба Устанавливаю пин как вход inputs[idx].port = GPIOC; inputs[idx].pin = idx; LL_GPIO_SetPinMode(inputs[idx].port, inputs[idx].pin, LL_GPIO_MODE_INPUT); какой бы idx не выставил - в регистрах вижу MODER0 = 0. то есть выставляю idx = 5 и по идее должен получить MODER5 = 0 но вместо этого вижу MODER0 = 0. пошел смотреть что за зверь такой LL_GPIO_SetPinMode __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) { MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); } это как понимать? они жестко впендюрили GPIO_MODER_MODE0 ? ааа... они используют его как маску. почему не модифицируются другие входы не понятно. по моему надо переделать так __STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) { //MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODE0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); MODIFY_REG(GPIOx->MODER, ( (0x3UL << (Pin* 2U)) << (POSITION_VAL(Pin) * 2U) ), (Mode << (POSITION_VAL(Pin) * 2U))); } или я что то не догоняю? Изменено 23 июня, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, jenya7 said: или я что то не догоняю? Выскажу, наверное, банальную и изъезженную мысль, но: зачем все эти либы? Неужели они так удобны? А, вот например, если нужно инициализировать список пинов? А для ответа на ваш вопрос не хватает данных: устройство MODIFY_REG, POSITION_VAL... Не все используют LL))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 (изменено) · Жалоба 1 hour ago, haker_fox said: Выскажу, наверное, банальную и изъезженную мысль, но: зачем все эти либы? Неужели они так удобны? А, вот например, если нужно инициализировать список пинов? А для ответа на ваш вопрос не хватает данных: устройство MODIFY_REG, POSITION_VAL... Не все используют LL))) мне LL понравилась. очень не дурно написанна. я думаю лучше чем SPL. реально удобно пользоваться. но если там такие баги то я начинаю беспокоиться. я много написал на основе LL библиотеки теперь надо все это дебагировать. MODIFY_REG и POSITION_VAL есть в хидере любого камня. когда у вас куча проектов и в каждом куча кода - реально легче открыть через х месяцев и видеть осмысленные имена типа LL_GPIO_SetPinMode чем набор регистров и вспоминать что значит каждый регистр. Изменено 23 июня, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 4 minutes ago, jenya7 said: LL_GPIO_SetPinMode чем набор регистров и вспоминать что значит каждый регистр О... ну если сравнивать LL с писаниной в регистры, то да, LL лучше. Но я подразумевал свой код. На который времени тратится всё равно меньше, чем на разбор тонкостей периферии. И это видно по вашим топикам))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reflector 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, jenya7 said: то есть выставляю idx = 5 и по идее должен получить MODER5 = 0 но вместо этого вижу MODER0 = 0. Все правильно, POSITION_VAL(5) равно 0. Как ты умудрился много написать на основе LL, если не можешь понять где номер пина нужно передавать, а где маску... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 (изменено) · Жалоба 2 hours ago, Reflector said: Все правильно, POSITION_VAL(5) равно 0. Как ты умудрился много написать на основе LL, если не можешь понять где номер пина нужно передавать, а где маску... да я понял что LL_GPIO_PIN_5 это маска. но даже если я передаю абсолютный номер функция не работает. нет времени копаться во всех их макросах и дефайнах (я честно пошел по пищевой цепочке #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))). но на тертьем или четвертом переходе понял что мне не победить) накропал своё static inline void GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t pin, uint32_t mode) { GPIOx->MODER &= ~(3<<(pin*2)); GPIOx->MODER |= (mode<<(pin*2)); } ааа...понял. аргумент должен быть маска. inputs[idx].pin = (1<<idx); Изменено 23 июня, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 59 минут назад, jenya7 сказал: нет времени копаться во всех их макросах и дефайнах (я честно пошел по пищевой цепочке #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))). но на тертьем или четвертом переходе понял что мне не победить) Надо смотреть результат работы препроцессора. Там должно быть всё видно, что где определено, что где включается и т. д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, andrew_b said: Надо смотреть результат работы препроцессора. Там должно быть всё видно, что где определено, что где включается и т. д. в листинге? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 10 минут назад, jenya7 сказал: в листинге? Переведите на русский. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, andrew_b said: Переведите на русский. в асемблерном файле? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба Вы знаете, что такое препроцессор в языке Си? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, andrew_b said: Вы знаете, что такое препроцессор в языке Си? знаю. не знаю где смотреть результат работы препроцессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба gcc -E, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба 1 hour ago, andrew_b said: gcc -E, например. а если IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 23 июня, 2020 Опубликовано 23 июня, 2020 · Жалоба Понятия не имею. Изучайте компилятор, с которым работаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться