Перейти к содержанию
    

Устанавливаю пин как вход

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)));
}

или я что то не догоняю?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

или я что то не догоняю?

Выскажу, наверное, банальную и изъезженную мысль, но: зачем все эти либы? Неужели они так удобны? А, вот например, если нужно инициализировать список пинов?

А для ответа на ваш вопрос не хватает данных: устройство MODIFY_REG, POSITION_VAL... Не все используют LL)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, haker_fox said:

Выскажу, наверное, банальную и изъезженную мысль, но: зачем все эти либы? Неужели они так удобны? А, вот например, если нужно инициализировать список пинов?

А для ответа на ваш вопрос не хватает данных: устройство MODIFY_REG, POSITION_VAL... Не все используют LL)))

мне LL понравилась. очень не дурно написанна. я думаю лучше чем SPL. реально удобно пользоваться. но если там такие баги то я начинаю беспокоиться. я много написал на основе LL библиотеки теперь надо все это дебагировать.

MODIFY_REG и POSITION_VAL есть в хидере любого камня.

 

когда у вас куча проектов и в каждом куча кода - реально легче открыть через х месяцев и видеть осмысленные имена типа LL_GPIO_SetPinMode чем набор регистров и вспоминать что значит каждый регистр.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jenya7 said:

LL_GPIO_SetPinMode чем набор регистров и вспоминать что значит каждый регистр

О... ну если сравнивать LL с писаниной в регистры, то да, LL лучше. Но я подразумевал свой код. На который времени тратится всё равно меньше, чем на разбор тонкостей периферии. И это видно по вашим топикам)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

то есть выставляю idx = 5 и по идее должен получить MODER5 = 0 но вместо этого вижу MODER0 = 0.

Все правильно, POSITION_VAL(5) равно 0. Как ты умудрился много написать на основе LL, если не можешь понять где номер пина нужно передавать, а где маску...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 минут назад, jenya7 сказал:

нет времени копаться во всех их макросах и дефайнах (я честно пошел по пищевой цепочке #define POSITION_VAL(VAL)   (__CLZ(__RBIT(VAL))). но на тертьем или четвертом переходе понял что мне не победить)

Надо смотреть результат работы препроцессора. Там должно быть всё видно, что где определено, что где включается и т. д.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, andrew_b said:

Надо смотреть результат работы препроцессора. Там должно быть всё видно, что где определено, что где включается и т. д.

 

в листинге?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, andrew_b said:

Вы знаете, что такое препроцессор в языке Си?

 

знаю. не знаю где смотреть результат работы препроцессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...