STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: STM32 новичку в ARM что к чему

Сообщение СКАЗОЧНИК »

А мой вопрос остался без ответов... :(
Станислав
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Аlex »

СКАЗОЧНИК, Создайте функцию, принимающую значение. В ней побитно читайте это значение и дёргайте портами.
На чистом Си больше никак.
Реклама
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: STM32 новичку в ARM что к чему

Сообщение СКАЗОЧНИК »

Я пошел путем дефайнов. Обозначаю каждому пину свое имя и состояние, а ему уже соотношу обращение к пинам порта. Однако, как было выложено здесь же, получается обработка такая выльется в хренову тучу ассемблерных конструкций, ибо все пины по отдельности ставятся и снимаются...
Типа такого:

Код: Выделить всё

# define _1_Stroka_ON  GPIOA->BSRR |= (GPIO_BSRR_BS11);
# define _1_Stroka_OFF GPIOA->BSRR |= (GPIO_BSRR_BR11);
И все в таком же духе. Будет работать или нет, не знаю еще. :)))

И не знаю как сам порт теперь обозвать, точнее, что ему присвоить.

Код: Выделить всё

# define _KeyPORT_Stroki ?????
# define _KeyPORT_Stolbi ?????
Добавлено after 6 minutes 24 seconds:
А вообще, зачем их называть, если я уже и так все сделал?! Чет не догоняю, чего сам напихал.

Добавлено after 2 minutes 10 seconds:
Все. Догнал. Надо не так, а вот так примерно:

Код: Выделить всё

# define _1_Stroka_ON  GPIO_BSRR_BS11;
# define _1_Stroka_OFF GPIO_BSRR_BR11;
# define _2_Stroka_ON  GPIO_BSRR_BS10;
# define _2_Stroka_OFF GPIO_BSRR_BR10; 

# define _KeyPORT_Stroki GPIOA->BSRR;
# define _KeyPORT_Stolbi GPIOD->BSRR;
Добавлено after 8 minutes 39 seconds:
И, по моему, первый вариант лучше, т.к. он действительно позволяет назначать любые пины любых портов, а второй способ все же собирает в пару портов эти пины...

Добавлено after 37 minutes 7 seconds:
Почему я эту конструкцию не могу сразу затащить как условие в if?

Код: Выделить всё

# define _1_Stolb_Read	(GPIOB->IDR & GPIO_IDR_IDR15);

Код: Выделить всё

if (_1_Stolb_Read)
{
}
Не работает. Но зато могу это присвоить переменной...
Станислав
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Имхо, не очень красивые макросы. Легко ошибку сделать при их описании и пользоваться неудобно.

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

Код: Выделить всё

SET(MUTE); // пин MUTE выставляем в 1
CLR(STBY); // пин STBY выставляем в 0

READ(RC); // читаем пин RC
и т.п.

Подсмотреть принцип объявления пинов в этом случае можно у меня здесь.

Правда, я эти макросы с использованием LL библиотеки делал, но и на чистом CMSIS никакой сложности их объявить нет.

P.S. За эти "stroka" и "stolbets" и прочее подобное хочется сильно бить по голове учебником английского. Почему не "line" или "row"?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: STM32 новичку в ARM что к чему

Сообщение СКАЗОЧНИК »

А вот здесь типа цикл сделали, чтобы просто объединить группу действий?

Код: Выделить всё

#define OUT_INIT(p, t, s)   \
    do {                    \
        OUT(p);             \
        SPEED(p, s);        \
        OTYPE(p, t);        \
    } while (0);
И, вроде все понятно, но это не понятно... :oops:

Код: Выделить всё

#define OUT(p)                  (LL_GPIO_SetPinMode(CONCAT(p, _Port), CONCAT(p, _Pin), LL_GPIO_MODE_OUTPUT))
Можно словами эту строку описать. Зачем столько скобок? И почему OUT с таким "параметром" (р)?

Добавлено after 2 minutes 46 seconds:
И сверху обозначены прототипы функций?
Станислав
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Там нету цикла (while (0)). Просто несколько операций группируются в одну.

Попробую объяснить.

Код: Выделить всё

#define CONCAT(x,y)             x ## y
Здесь всё достаточно понятно. Обычная конкатенация. Любой макрос вида
CONCAT(test, pin) развернётся в строчку testpin.
Объявляю пин MUTE:

Код: Выделить всё

#define MUTE_Port               GPIOA
#define MUTE_Pin                LL_GPIO_PIN_13
Инициализирую его с помощью макроса

Код: Выделить всё

#define OUT(p)                  (LL_GPIO_SetPinMode(CONCAT(p, _Port), CONCAT(p, _Pin), LL_GPIO_MODE_OUTPUT))
В C-коде инициализация будет следующая:

Код: Выделить всё

{
  ...
  OUT(MUTE); // Переводим пин в режим выхода
 ..
}
Как это работает (стадии препроцессора, в качестве параметра p макроса идёт MUTE):

Код: Выделить всё

1: OUT(MUTE);
2: (LL_GPIO_SetPinMode(CONCAT(MUTE, _Port), CONCAT(MUTE, _Pin), LL_GPIO_MODE_OUTPUT));
3: (LL_GPIO_SetPinMode(MUTE_Port, MUTE_Pin, LL_GPIO_MODE_OUTPUT));
4: (LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_13, LL_GPIO_MODE_OUTPUT));
Аналогично и все прочие макросы (SET, CLR и т.д).

Единственное, всё это у меня разворачивается до функций библиотеки LL. Но по тому же принципу и "чистый" CMSIS можно вызывать.
Последний раз редактировалось WiseLord Ср фев 27, 2019 16:55:42, всего редактировалось 1 раз.
Реклама
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: STM32 новичку в ARM что к чему

Сообщение СКАЗОЧНИК »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3579081#p3579081"]P.S. За эти "stroka" и "stolbets" и прочее подобное хочется сильно бить по голове учебником английского. Почему не "line" или "row"?[/uquote]

Точно! А я думал, как в транслите написать букву Ц! :)))
А серьезнее, то так мне было проще, типа я художник, я так вижу. Изначально хотел написать ROW COLUMN, но я в них постоянно путаюсь, кто из них строка, а кто столбец, еще с Ехеля начиная. Ну, не англичанин я... :dont_know:

Добавлено after 3 minutes 25 seconds:

Код: Выделить всё

#define CONCAT(x,y)             x ## y
Я вообще думал, что это строка к С++ относится... Ни разу с такой не встречался. Пойду почитаю за конкатенацию.
А вот именно все скобки у макроса и не понятны все равно. :( Вот эти:

Код: Выделить всё

#define OUT(p)                  (LL_GPIO_SetPinMode(CONCAT(p, _Port), CONCAT(p, _Pin), LL_GPIO_MODE_OUTPUT))
А про НЕцикл я понял. Просто мне стало интересно, неужели в группу никаким другим образом несколько действий нельзя объединить больше? :idea:

Добавлено after 6 minutes 25 seconds:
О! Начинает доходить. ))) Начал внимательно смотреть в скобки!

Благодарю.

Добавлено after 10 minutes 13 seconds:
Блин... что за оператор такой ##?
Станислав
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Прочитайте по макросы в C. ## соединяет две текстовые лексемы.
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Re: STM32 новичку в ARM что к чему

Сообщение afz »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3579028#p3579028"]Почему я эту конструкцию не могу сразу затащить как условие в if?

Код: Выделить всё

# define _1_Stolb_Read	(GPIOB->IDR & GPIO_IDR_IDR15);

Код: Выделить всё

if (_1_Stolb_Read)
{
}
Не работает. Но зато могу это присвоить переменной...[/uquote] Вероятно потому, что в дефайне стоит точка с запятой после выражения. Что нарушает синтаксис if'а.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: STM32 новичку в ARM что к чему

Сообщение СКАЗОЧНИК »

Ну ооочень сложные макросы у меня тогда получаются. Я разобрался в Ваших уже, наверное, основательно. С LL это много проще, похоже, чем на CMSYS.
:facepalm:

Код: Выделить всё

#define CONCAT(x,y)        x ## y

#define STROKA_1_PORT		GPIOA
#define STROKA_1_PIN    11

OUT_OD (p)    /
if (CONCAT(p,_PIN) > 7)    /
   { CONCAT(CONCAT(p,_PORT),->CRH) |= (CONCAT(CONCAT(GPIO_CRH_CNF,CONCAT(p,_PIN)),_0) }    /
else    /
    { CONCAT(CONCAT(p,_PORT),->CRL) |= (CONCAT(CONCAT(GPIO_CRL_CNF,CONCAT(p,_PIN)),_0) }    /
И дальше в том же духе... настройки частоты, входов, начального состояния выходов...

Собраться верхняя штуковина должна примерно в такой вид:

Код: Выделить всё

GPIOA->CRH |= (GPIO_CRH_CNF11_0) 
Ну и вызов да, простой:

Код: Выделить всё

OUT_OD(STROKA_1); // 1-я строка настроена на выход с открытым стоком.
Станислав
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: STM32 новичку в ARM что к чему

Сообщение ПростоНуб »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3583398#p3583398"]Ну ооочень сложные макросы у меня тогда получаются.[/uquote]
Пусть меня забросают шапками, но я именно по этой причине CONCAT() не пользуюсь.
Просто в makefile проезжаюсь по исходникам дубовым perl скриптом:

Код: Выделить всё

#!bin\perl
open INFILE, $ARGV[0];
if ( $#ARGV>0  ) {
  open OUTFILE, '>', $ARGV[1];
}
LINE:
    while (<INFILE>) {
      s/(`\|)|(`\[)|(`\])|(`\{)|(`\})|(`;)|(`:)|(`!)/
        if (length($2)>0 | length($3)>0) {chr(0x22)} 
        elsif (length($4)>0 | length($5)>0) {chr(0x27)}
        elsif (length($6)>0) {chr(0x2F)}
        elsif (length($7)>0) {chr(0x5C)}
        elsif (length($8)>0) {chr(0x0A)}
        else {''}/eg;
    } continue {
      if ( $#ARGV>0  ) {
        print OUTFILE;
      } else {
        print;
      }
    }
То бишь, для конкатенации пишу `| что удобней и быстрее.

P.S. Остальные замены нужны, преимущественно, для использования макросов внутри одинарных или двойных кавычек.
Satarych
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вт июн 04, 2013 20:25:13

Re: STM32 новичку в ARM что к чему

Сообщение Satarych »

А есть ли тут гуру ассемблера? Должны быть))

В частности интересует во что компилируются инкремент/декремент обычных переменных и указателей.
Насколько я помню, в AVR'ках инкремент/декремент обычной переменной подразумевал:
1. Загрузку значения из оперативки в регистр
2. Инкремент значения в регистре одной командой
3. Выгрузку значения обратно в оперативку
Тобишь процесс не атомарен. А как это устроено в ARM'ках? Тут тоже инкремент/декремент осуществляется через регистры или как?
И что насчёт адресной арифметики? Есть какие то специальные инкременты на степени двойки? Или это реализуется уже обычными арифметическими командами?

И ещё вопрос. Насколько эффективно компиляторы реализует остаток от деления? Со степенями двойки всё должно быть просто, а с произвольными числами неизвестными на этапе компиляции? Условно, что эффективнее?

Код: Выделить всё

a += b;
if (a >= maxValue)    a -= maxValue;

// или обойтись без if'а и просто взять остаток от деления?
a += b;
a %= maxValue;
PS если где-то это уже разжёвано, буду благодарен за ссылочку.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Эмм.. вообще-то 2-я и последняя строки в приведенном коде считают совершенно разные вещи.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Satarych, вместо кучи дурацких вопросов написал бы интересующий тебя код и посмотрел во что он компилируется. Лучше один раз увидеть, чем сто раз услышать.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: STM32 новичку в ARM что к чему

Сообщение xVekx »

Калокуб STM32Cube_FW_F4_V1.24.0 "Add support of HAL callback registration feature" ну наконец годную вещь завезли...
DrobyshevAlex
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Re: STM32 новичку в ARM что к чему

Сообщение DrobyshevAlex »

Здравствуйте! Подскажите пожалуйста, мне нужно подключить SDRAM и дисплей 2.4 дюйма, вроде бы на SPFD5408, если верить описанию к покупке)
Возможно вместо SDRAM остановлюсь на SRAM. Хочу заказать МК, но не могу понять какой лучше.
Допустим серия 429 имеет како то механизм LCD-TFT. Это поможет для работы с данным дисплеем?
Прочел, что поможет FSMC, но для SRAM тоже нужно FSMC, на 407 серии он есть, сколько там можно устройств подключить? Там речь про какие то bank1 и 2 это омжно два независимых устройства подключать?
Но для SDRAM нужно FMC которое в 427, 429 моделях. Но там я не вижу FSMC который подходит для дисплея)) Но есть, как я писал выше LCD-TFT.

Вообщем запутался, уже заказал 405 а там вообще не фига нет, хочу заказать новый, но теперь хочу посоветоваться))

Вообщем мне бы иметь возможность подключить одновременно LCD и SRAM/SDRAM. но не супер дорого)) Какой МК можно взять?

Добавлено after 1 minute:
Если кому интересно, то это в продолжение https://radiokot.ru/forum/viewtopic.php?f=59&t=161489
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Re: STM32 новичку в ARM что к чему

Сообщение afz »

Вообще-то, демоплата от ST, а именно - STM32F429I-DISCO имеет на борту и SDRAM, и дисплейчик 2.6". Камушек там, естественно, 429I, SDRAM 8M, и, на закуску, ST-Link...

Чтобы потренироваться - самое то!
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Sergeba
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт мар 28, 2019 23:41:10

Re: STM32 новичку в ARM что к чему

Сообщение Sergeba »

Народ, подскажите, уже голову сломал. Начал изучение с STM32F0P30. Попалась китайская девайсина с этим МК, реле, входом и светодиодом. Устройство с Модбас интерфейсом. Не понравилась логика работы, решил написать свой код. Использую Cube. Закопался c RS485. В устройстве используется преобразователь UART-RS485 с переключателем DE. Всё вроде бы оформил как надо, пытаюсь отправлять наружу текст. Всё получилось, вижу его на компе в гипртерминале. Решил проверить работу переключателя DE и тут непонятка. Использую HAL_GPIO_WritePin (GPIOA, GPIO_PIN_0, GPIO_PIN_SET), текст проходит, меняю на GPIO_PIN_RESET и всё равно вижу в Гипертерминале мой текст. По идее DE должен включать/отключать передачу... Разве нет?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Sergeba , в большинстве F0 есть как и аппаратное управление DE так и аппаратная поддержка модбас.
калокуб и софтовое ногодрочерство попросту не нужны, нужно начать читать и думать.
Sergeba
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт мар 28, 2019 23:41:10

Re: STM32 новичку в ARM что к чему

Сообщение Sergeba »

[uquote="dosikus",url="/forum/viewtopic.php?p=3603922#p3603922"]Sergeba , в большинстве F0 есть как и аппаратное управление DE так и аппаратная поддержка модбас.[/uquote]

Я правильно понял, что даже в случае, если я софтово дёргаю ногу, на которой висит DE+RE и запрещаю передачу, "аппаратной поддержке" пофиг и она пропускает пакет?

А калокуб приходится использовать т.к. удобно для старта - накидал основу - и он всё нужное соберёт для инициализации и т.п.
Ответить

Вернуться в «ARM»