kv_addr 0 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба Пытаюсь разобраться с CubeMX, HAL. При конфигурации изначально ногу порта можно выставить либо как GPIO_Input, либо как GPIO_Output. Вопрос, как в HAL переводить ногу порта со ввода на вывод и наоборот? Как это выполнить в установках соответствующих регистров, знаю. Поскольку пытаюсь разобраться с HAL, интересует именно как это выполняется в HAL? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 39 минут назад, kv_addr сказал: Поскольку пытаюсь разобраться с HAL, интересует именно как это выполняется в HAL? Ищите в коде сгенерированном Кубом функцию MX_GPIO_Init(void), там настраиваются GPIO не относящиеся к модулям. Плюс есть в каждом модуле свои настройки GPIO, например для SPI смотреть в функцию HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kv_addr 0 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 1 минуту назад, HardEgor сказал: Спасибо, это понятно. Лазил, вручную настраивал, но это же за пределами HAL-a. Некошерно. Меня интересовало, не придумали ли гуру-программеры из STM, как выполнить это на более высоком уровне абстракции? А то получается совсем уж по-ардуиновски. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 2 минуты назад, kv_addr сказал: Спасибо, это понятно. Лазил, вручную настраивал, но это же за пределами HAL-a. Некошерно. Меня интересовало, не придумали ли гуру-программеры из STM, как выполнить это на более высоком уровне абстракции? А то получается совсем уж по-ардуиновски. Не очень понятно, вам интересно как в Кубе мышкой это сделать или как в сгенерированном коде добавить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kv_addr 0 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 47 минут назад, HardEgor сказал: Не очень понятно, вам интересно как в Кубе мышкой это сделать или как в сгенерированном коде добавить? Я вроде понятным языком написал - как СРЕДСТВАМИ высокого уровня абстракции (HAL) управлять переводом пинов порта со ввода на вывод и наоборот? Вручную допилить смогу, но нафига тогда CubeMX вместе с его HAL придумывался? Для того, чтобы поехать на автомобиле, нынче вроде как не нужно открывать капот и подсасывать вручную топливо, либо заводить авто "кривым стартером" вручную. Думаю, такая аналогия уместна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 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: . . . Для того, чтобы поехать на автомобиле, нынче вроде как не нужно открывать капот и подсасывать вручную топливо, либо заводить авто "кривым стартером" вручную. Думаю, такая аналогия уместна. а вы хотите чтобы толкать авто и в баке получать бензин. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kv_addr 0 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 23 минуты назад, k155la3 сказал: Если опустить повесть о баке и бензине, как неподходящую для этого случая, то спасибо за ответ. Буду разбираться с HAL дальше. Мене интересует именно HAL, заложенные в него возможности, ибо реклама рекламой, а реалии могут сильно от рекламы отставать. А регистрами и сам могу настроить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 1 час назад, kv_addr сказал: Я вроде понятным языком написал - как СРЕДСТВАМИ высокого уровня абстракции (HAL) управлять переводом пинов порта со ввода на вывод и наоборот? У Куба есть два уровня абстракции - в Кубе мышкой и вручную изменять сгенерированный код(там под это специальные места выделены). 4 минуты назад, kv_addr сказал: Буду разбираться с HAL дальше. Мене интересует именно HAL, заложенные в него возможности, ибо реклама рекламой, а реалии могут сильно от рекламы отставать. Так открываете исходники HAL и изучаете, там всё подробно написано. Если что-то непонятно, то можно сгенерировать код и посмотреть как Куб его использует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kv_addr 0 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 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 и изучаете, там всё подробно написано. Если что-то непонятно, то можно сгенерировать код и посмотреть как Куб его использует. Смотрел. Там - либо/либо. Если указал мышкой пину направление на выход, он кубится только на выход, если указал на вход, кубится только на вход. Указать, что пин может быть в разные моменты то входом, то выходом невозможно. Нужно лезть под капот и реализовывать закат солнца вручную. Это как к мраморным ступеням приторочить лестнцу-стремянку. Иначе - никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 3 hours ago, kv_addr said: Если опустить повесть о баке и бензине, . . . Это не повесть. Это "challenge" ps У Ti есть аналогичная утилита, но функционал существенно скромнее чем у куба. Я думаю, Ti "вовремя остановились" умышленно. Потому как ребята там умные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 1 hour ago, kv_addr said: Указать, что пин может быть в разные моменты то входом, то выходом невозможно. Ага. И мышкой же указывать, в какие именно моменты он должен это делать. Я видел такие штуки, очень прикольно. Для дошкольников. А те, кому работать надо, по-старинке пишут закат солнца вручную. Без мышки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 66 27 апреля, 2020 Опубликовано 27 апреля, 2020 · Жалоба 1 час назад, kv_addr сказал: Если указал мышкой пину направление на выход, он кубится только на выход, если указал на вход, кубится только на вход. Указать, что пин может быть в разные моменты то входом, то выходом невозможно. Нужно лезть под капот и реализовывать закат солнца вручную. Это как к мраморным ступеням приторочить лестнцу-стремянку. Иначе - никак. А что вы хотели, если там стремянка с мраморными ступенями :) Куб это удобный инструмент предварительной конфигурации микроконтроллера и генерации соответствующего кода. Весь остальной функционал только ручками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться