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

STM32, CubeMX, HAL, GPIO_Input <-> GPIO_Output

Пытаюсь разобраться с CubeMX, HAL.  При конфигурации изначально ногу порта можно выставить либо как GPIO_Input, либо как GPIO_Output.
Вопрос, как в HAL переводить ногу порта со ввода на вывод и наоборот?
Как это выполнить в установках соответствующих регистров, знаю.
Поскольку пытаюсь разобраться с HAL, интересует именно как это выполняется в HAL?

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


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

39 минут назад, kv_addr сказал:

Поскольку пытаюсь разобраться с HAL, интересует именно как это выполняется в HAL?

Ищите в коде сгенерированном Кубом  функцию MX_GPIO_Init(void), там настраиваются GPIO не относящиеся к модулям.

Плюс есть в каждом модуле свои настройки GPIO, например для SPI смотреть в функцию  HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)

 

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


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

1 минуту назад, HardEgor сказал:

Спасибо, это понятно. Лазил, вручную настраивал, но это же за пределами HAL-a. Некошерно. Меня интересовало, не придумали ли гуру-программеры из STM, как выполнить это на более высоком уровне абстракции? А то получается совсем уж по-ардуиновски. :cray:

 

 

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


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

2 минуты назад, kv_addr сказал:

Спасибо, это понятно. Лазил, вручную настраивал, но это же за пределами HAL-a. Некошерно. Меня интересовало, не придумали ли гуру-программеры из STM, как выполнить это на более высоком уровне абстракции? А то получается совсем уж по-ардуиновски. :cray:

Не очень понятно, вам интересно как в Кубе мышкой это сделать или как в сгенерированном коде добавить?

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


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

47 минут назад, HardEgor сказал:

Не очень понятно, вам интересно как в Кубе мышкой это сделать или как в сгенерированном коде добавить?

Я вроде понятным языком написал - как СРЕДСТВАМИ высокого уровня абстракции (HAL) управлять переводом пинов порта со ввода на вывод и наоборот? Вручную допилить смогу, но нафига тогда CubeMX вместе с его HAL придумывался?
Для того, чтобы поехать на автомобиле, нынче вроде как не нужно открывать капот и  подсасывать вручную топливо, либо заводить авто "кривым стартером" вручную. Думаю, такая аналогия уместна.

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


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

46 minutes ago, kv_addr said:

Я вроде понятным языком написал . . . 

HAL обеспечивает только базовые, "без выпендривания", настройки, с кучей избыточного кода. И то, "есть варианты"

Мало ли кому что захочется настроить и в каких режимах. На все случаи код не предусмотришь в универсальной программе.

Дай бог чтобы оно в таком виде работало надежно.

Чем не устраивает void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init). Если уж HAL.

Как раз и будет, "СРЕДСТВАМИ высокого уровня абстракции (HAL)"

57 minutes ago, kv_addr said:

. . . Для того, чтобы поехать на автомобиле, нынче вроде как не нужно открывать капот и  подсасывать вручную топливо, либо заводить авто "кривым стартером" вручную. Думаю, такая аналогия уместна.

а вы хотите чтобы толкать авто и в баке получать бензин.

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


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

23 минуты назад, k155la3 сказал:

 

Если опустить повесть о баке и бензине, как неподходящую для этого случая, то спасибо за ответ.
Буду разбираться с HAL дальше. Мене интересует именно HAL, заложенные в него возможности, ибо реклама рекламой, а реалии могут сильно от рекламы отставать. 
А регистрами и сам могу настроить.

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


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

1 час назад, kv_addr сказал:

Я вроде понятным языком написал - как СРЕДСТВАМИ высокого уровня абстракции (HAL) управлять переводом пинов порта со ввода на вывод и наоборот?

У Куба есть два уровня абстракции - в Кубе мышкой и вручную изменять сгенерированный код(там под это специальные места выделены).

4 минуты назад, kv_addr сказал:

Буду разбираться с HAL дальше. Мене интересует именно HAL, заложенные в него возможности, ибо реклама рекламой, а реалии могут сильно от рекламы отставать.

Так открываете исходники HAL и изучаете, там всё подробно написано. Если что-то непонятно, то можно сгенерировать код и посмотреть как Куб его использует.

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


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

4 часа назад, kv_addr сказал:

Пытаюсь разобраться с CubeMX, HAL.  При конфигурации изначально ногу порта можно выставить либо как GPIO_Input, либо как GPIO_Output.
Вопрос, как в HAL переводить ногу порта со ввода на вывод и наоборот?

Обычно так:

      HAL_GPIO_WritePin( GPIOC, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_RESET);

- это пример того, как в порту GPIOC устанавливаются в низкий уровень пины GPIO_PIN_11 и GPIO_PIN_12 сразу. А если им надо высокий уровень установить, то так:

      HAL_GPIO_WritePin( GPIOC, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_SET);

В том случае, если пин нужно перевести в противоположное состояние, то так:

      HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_10);

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


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

54 минуты назад, Xenia сказал:

Обычно так:

      HAL_GPIO_WritePin( GPIOC, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_RESET);

- это пример того, как в порту GPIOC устанавливаются в низкий уровень пины GPIO_PIN_11 и GPIO_PIN_12 сразу. А если им надо высокий уровень установить, то так:

      HAL_GPIO_WritePin( GPIOC, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_SET);

В том случае, если пин нужно перевести в противоположное состояние, то так:

      HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_10);

Спасибо, понятно. Но меня интересует иное. Не как устанавливать 0 или 1 на выходе пина, сконфигурированного на вывод, а как менять его назначение с вывода на ввод и обратно.
Не регистры GPIOx_ODR, GPIOx_BSRR, GPIOx_BRR,
а регистры GPIOx_CRL/CRH.
 

2 часа назад, HardEgor сказал:

Так открываете исходники HAL и изучаете, там всё подробно написано. Если что-то непонятно, то можно сгенерировать код и посмотреть как Куб его использует.

Смотрел. Там - либо/либо.
Если указал мышкой пину направление на выход, он кубится только на выход, если указал на вход, кубится только на вход. Указать, что пин может быть в разные моменты то входом, то выходом невозможно. Нужно лезть под капот и реализовывать закат солнца вручную. Это как к мраморным ступеням приторочить лестнцу-стремянку. Иначе - никак.

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


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

3 hours ago, kv_addr said:

Если опустить повесть о баке и бензине, . . .

Это не повесть. Это "challenge"  :biggrin:

ps

У Ti есть аналогичная утилита, но функционал существенно скромнее чем у куба. Я думаю, Ti "вовремя остановились" умышленно. Потому как ребята там умные.

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


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

1 час назад, kv_addr сказал:

Спасибо, понятно. Но меня интересует иное. Не как устанавливать 0 или 1 на выходе пина, сконфигурированного на вывод, а как менять его назначение с вывода на ввод и обратно.

Только так:

  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;  // GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

т.е. заполнить структуру GPIO_InitTypeDef (целиком!) и скормить ее функции

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

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


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

1 hour ago, kv_addr said:

Указать, что пин может быть в разные моменты то входом, то выходом невозможно.

Ага. И мышкой же указывать, в какие именно моменты он должен это делать.

Я видел  такие штуки, очень прикольно. Для дошкольников. А те, кому работать надо, по-старинке пишут закат солнца вручную. Без мышки.

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


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

3 minutes ago, Xenia said:

Только так:


  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;  // GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

т.е. заполнить структуру GPIO_InitTypeDef (целиком!) и скормить ее функции

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Можно сделать

const GPIO_InitTypeDef init_mode_GPIOA = { ... };

и "скармливать" без всяких заполнений

HAL_GPIO_Init(GPIOA, (GPIO_InitTypeDef *) &init_mode_GPIOA);

 

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


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

1 час назад, kv_addr сказал:

Если указал мышкой пину направление на выход, он кубится только на выход, если указал на вход, кубится только на вход. Указать, что пин может быть в разные моменты то входом, то выходом невозможно. Нужно лезть под капот и реализовывать закат солнца вручную. Это как к мраморным ступеням приторочить лестнцу-стремянку. Иначе - никак.

А что вы хотели, если там стремянка с мраморными ступенями :)

Куб это удобный инструмент предварительной конфигурации микроконтроллера и генерации соответствующего кода. Весь остальной функционал только ручками.

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


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

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

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

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

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

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

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

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

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

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