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

Как работать с GPIO


Гость Андрей

Рекомендуемые сообщения

Доброго времени суток, уважаемые Форумчане. 

Решил попробовать освоить stm32 (до этого писал несложные программы на си авр, даже что-то удельное получалось, освоил кое-как прерывания). Заказал две платы на f103 и f407 мк. Установил keil, iar. Начал читать (а в сети очень много статей типа "stm32 - это просто") и - о ужас!!! Два дня потратил чтобы просто понять как создаётся пустой проект, какие библиотеки нужно добавлять. Ну с этим вроде разобрался. Потом решил, как принято, поминать светодиодом - ещё убил день чтобы разобраться с примерами из сети. Ну с тактированием периферии более-менее понятно, сброс и установка отдельных битов - кое-как понял. Но, как записать сразу число хотя бы в младшие восемь бит - хоть убей не пойму. В авр было всё просто, кидай число в порт и готово (даже наоборот, сложнее работать с отдельными битами). Прочитал про регистры gpio, там есть регистры ODR и IDR, вроде аналоги авровских port и pin, но загнать туда байт, а тем более, два я не сумел. Пробовал писать функции со сдвигом каждого бита, сравнением и сбросом/установкой каждого бита по очереди - это дикий громоздкий ужас. И синтаксис для стм-ов меня просто убивает, какие-то стрелки, сплошные битовые операции. 

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

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

В stm32 есть регистры set и reset(что то вроде того) . Так вот чтобы установить лог.1 надо в set записать 1 а в reset 0 . Подробности есть в референс мануале на чип. 

А вообще используйте : GPIOC->ODR.

Тут можно почитать :

http://microtechnics.ru/stm32-uchebnyj-kurs-gpio-porty-vvoda-vyvoda/?fdx_switcher=true

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

BRR и BSRR. В чем проблема записать байт в регистр я так и не понял

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

BRR и BSRR. В чем проблема записать байт в регистр я так и не понял

Суть вопроса не в том, чтобы выставить или сбросить отдельный бит, это проблем не составляет. 

Объясню проблему подробнее. Допустим, я подключаю экран hd44780 в четырёхбитном режиме к одному порту (допустим Е), мне нужно дёргать каждую ножку порта Е отдельно, или как-то можно кидать маску в виде числа в ODR? 

Во всех примерах, что я видел, обычно вот такое:

GPIOE->BSRR |= GPIO_BSRR_BS0; установить отдельный пин
GPIOE->BSRR |= GPIO_BSRR_BR0; сбросить отдельный пин

С ODR то же самое. А если я пытаюсь кинуть число в ODR, то компилятор начинает меня сильно ругать.

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

GPIOE->ODR = 0x000F.

или

GPIOE->ODR &= ~0x000F. 

GPIOE->ODR |=  0x000F.

Первый случай просто запись числа в порт. Второй - запись только первых четырех бит.

На что там компилятор ругаться то  может?

Изменено пользователем Вуйко
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

4 часа назад, Гость Андрей сказал:

GPIOE->BSRR |= GPIO_BSRR_BS0; установить отдельный пин

точно так же можно записать маску, состоящую из любого байта. Надо только чтобы тип данных маски совпадал с типом данных регистра (как уже верно отметили)

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

5 часов назад, Гость Андрей сказал:

GPIOE->BSRR |= GPIO_BSRR_BS0; установить отдельный пин

Регистр BSRR доступен только для записи. Поэтому его пользуют только простым присваиванием:

GPIOE->BSRR = GPIO_BSRR_BS0; установить пин0 PortE
GPIOE->BSRR = GPIO_BSRR_BR0; сбросить пин0 PortE

 

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

Вот-вот. А мне тут парили товарищи насчет того что очень просто всё изучается. Не верь им - ставь куб и бери HAL. Там функции почти как в ардуино. Работает что называется "из коробки". А то пока во все эти BSRR вникнешь - полгода пройдет. А потом тебе надо будет I2C затактировать - умрёшь пока сделаешь. 

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

2 часа назад, Вуйко сказал:

GPIOE->ODR = 0x000F.

или

GPIOE->ODR &= ~0x000F. 

GPIOE->ODR |=  0x000F.

Первый случай просто запись числа в порт. Второй - запись только первых четырех бит.

На что там компилятор ругаться то  может?

Вот теперь я понял свою ошибку. Я пытался в одр затолкнуть однобайтное число, думал, что компилятор допишет старший байт нулями. Надо попробовать так. Спасибо.

Изменено пользователем AndrejChoo
Ссылка на комментарий
Поделиться на другие сайты

Только что, Sancta сказал:

А мне тут парили товарищи насчет того что очень просто всё изучается

Никто ничего не парил, в STM все сделано очень логично и просто. Только мозги надо иметь и умение анализировать ими прочитанное. Открываешь даташит, читаешь и пишешь прогрраму. Ну и начинать надо с того, что проще, а не сразу на ARM кидаться. Начни с 8-битных, да с тех же STM8/PIC/AVR. Разберись с ними, тогда с ЛЮБЫМ МК разобраться дело максимум на неделю времени.

 

Только что, Sancta сказал:

А то пока во все эти BSRR вникнешь - полгода пройдет. А потом тебе надо будет I2C затактировать - умрёшь пока сделаешь. 

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

Только что, AndrejChoo сказал:

Я пытался в одр затолкнуть однобайтное число, думал, что компилятор допишет старший байт

А он и допишет.

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

9 минут назад, Sancta сказал:

Вот-вот. А мне тут парили товарищи насчет того что очень просто всё изучается. Не верь им - ставь куб и бери HAL. Там функции почти как в ардуино. Работает что называется "из коробки". А то пока во все эти BSRR вникнешь - полгода пройдет. А потом тебе надо будет I2C затактировать - умрёшь пока сделаешь. 

Спасибо за совет. Куб у меня уже установлен. Только я пока ещё не вникал как с ним работать.

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

Цитата

А вообще хоть какие-то занания есть?

Не слушай их. Когда понадобится сверхсложные проекты в реальном времени - так и будешь с регистрами разбираться. А пока чтобы переферией баловаться лучше HAL. Примеров в сети полно. Чуть сложнее получается чем скетчи на ардуино...

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

Только что, Sancta сказал:

Когда понадобится сверхсложные проекты в реальном времени

Когда нужны сверхсложные проекты, как раз и юзается HAL с ОС реального времени. Никто не будет сидеть и руками настраивать весь проект. Однако для пользования HAL тоже нужны знания, и немалые. Плюс чтение даташита. Так что нефиг бредить, если у самого знаний ноль!

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

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

Когда нужны сверхсложные проекты, как раз и юзается HAL с ОС реального времени. Никто не будет сидеть и руками настраивать весь проект. Однако для пользования HAL тоже нужны знания, и немалые. Плюс чтение даташита. Так что нефиг бредить

Порог вхождения ниже. Не надо сравнивать вас - профи и нас - нубов. Да нам достаточно сторонних библиотек и HAL.  Вам может и ассемблера маловато. 

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

Только что, Sancta сказал:

Порог вхождения ниже

О каком пороге вхождения речь, если автор элементарных битовых операций не знает?! Да и что, профи сразу все знали, с рождения? К примеру, на полное изучение AVR я лично потратил около месяца поэтапного изучения. При том, что до них, я МК в глаза не видел. За это время перелопатил кучу примеров и документации. Писал сразу на Си (до этого были неплохие знания самого Си, т.к. начинал с написания ПО для ПК, плюс многолетний опыт в электронике). Лезть в говнуино у меня и мысли не было, благодаря чему не было привычки к готовым библиотекам. Зато, когда решил перейти на STM, в основах разобрался буквально за неделю. После STM32 разобрался и с STM8. Писал, к слову, БЕЗ HAL ибо было желание разобраться именно в работе МК. А теперь мне пофигу как писать на STM, хоть с HAL, хоть напрямую (для HAL, кстати, нужен IAR или Keil, которые сильно проигрывают в удобстве Eclipse). А по работе пришлось еще и 8051 ядром разобраться, а там готовых библиотек совсем нет, как и примеров в сети. Есть только даташит и те примеры, что положил производитель. И что, мне плакать теперь?

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

7 минут назад, BARS_ сказал:

Писал сразу на Си (до этого были неплохие знания самого Си, т.к. начинал с написания ПО для ПК, плюс многолетний опыт в электронике).

Вот это типа опустим? Нам, нубам надо одновременно разбираться с С, с его непростой структурой и микроконтроллерами, напичкаными такой переферией, что АVR в сторонке курит. И если можно написать HAL_GPIO_Writepin вместо конструкции с BSRR и битовыми сдвигами - то лучше выбрать первый  вариант. Ибо быстрее, а для промышленности мы проекты не гоним в две смены :)

Правды нет - у каждого свой путь.

Изменено пользователем Sancta
Ссылка на комментарий
Поделиться на другие сайты

Только что, Sancta сказал:

Нам, нубам надо одновременно разбираться с С, с его непростой структурой

У Си она непростая? Да с чего бы это? Непростая она у С++. И разбираться с языком надо ДО того, как лезть в МК. Ты же не пытаешься водить машину, не зная правил!

 

Только что, Sancta сказал:

напичкаными такой переферией, что АVR в сторонке курит.

Опять же, НОРМАЛЬНЫЕ люди начинают с ПРОСТОГО, а не лезут собирать ракету, не умея собрать детский конструктор.

 

Только что, Sancta сказал:

HAL_GPIO_Writepin вместо конструкции с BSRR и битовыми сдвигами

Ну давай, запиши этой функцией сразу несколько пинов. В то время, как через ODR это секунда работы. Ну и с битовыми операциями, как и с языком программирования, разобраться придется в любом случае. Иначе программу ты никак не напишешь, хоть с HAL, хоть без него. HAL всего лишь сделан для упрощения программисту настройки МК, не более.

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Только что, Sancta сказал:

через | и усё

А что, это не с битами операция? А если я просто число в порт загоняю? Это уже не говоря о том, что операция GPIOx->ODR = 0х000F выполняется быстрее. Ну и не надо прикрывать свое нежелание думать мнимым удобством там, где его НЕТ. А те, кто умеет программить МК, используют и HAL и чистую запись в регистры там, где это удобнее и быстрее. А ты уже давно дискредитировал себя, как программиста, своими высказываниями.

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

12 минуты назад, BARS_ сказал:

А что, это не с битами операция? А если я просто число в порт загоняю? Это уже не говоря о том, что операция GPIOx->ODR = 0х000F выполняется быстрее.

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16;
  }
}

А вот это не одна ли разница скажи мне? Только не надо мучаться вспоминая BSRR и всё понятно.  Ну да - на пару тройку тактов медленнее. Но  на свистке синем 72 мгц - там можно такое и не оптимизировать.

 

Цитата

 А ты уже давно дискредитировал себя, как программиста, своими высказываниями.

А я таки на это звание и не претендую. Мне просто интересно взять плату и прикрутить к ней экранчик или еще какие девайсы и не более того. Денег это не приносит - так развлечение...

Изменено пользователем Sancta
Ссылка на комментарий
Поделиться на другие сайты

Только что, Sancta сказал:

Только не надо мучаться вспоминая BSRR и всё понятно.

А я хоть слово сказал про BSRR? Читаешь ты так же плохо, как и программишь? Доля записи ЧИСЛА в порт есть специальный регистр ODR. А BSRR нужет лишь для написания конструкций вида:

#define BLUE_H  (GPIOC->BSRR = GPIO_BSRR_BS9)
#define BLUE_L  (GPIOC->BSRR = GPIO_BSRR_BR9)

Еще раз спрашиваю, как ты будешь записывать этой функцией число в порт. Как сделаю я, выше привел. Давай свой гениальный код.

 

Только что, Sancta сказал:

там можно такое и не оптимизировать.

Что еще раз подтверждает то, что с программированием МК ты знаком крайне слабо. 

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

я бы написал так

HAL_GPIO_WritePin(GPIOx, 0xмаска, GPIO_PinSet/Reset)

это же вроде элементарно. Функции пофик - принимать маску одного бита, или маску группы битов. Но в реальной жизни воспользовался бы строчкой на SPL. Если бы речь шла именно о параллельном выводе в порт

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...