STM32 новичку в ARM что к чему
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
СКАЗОЧНИК, Создайте функцию, принимающую значение. В ней побитно читайте это значение и дёргайте портами.
На чистом Си больше никак.
На чистом Си больше никак.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Я пошел путем дефайнов. Обозначаю каждому пину свое имя и состояние, а ему уже соотношу обращение к пинам порта. Однако, как было выложено здесь же, получается обработка такая выльется в хренову тучу ассемблерных конструкций, ибо все пины по отдельности ставятся и снимаются...
Типа такого:
И все в таком же духе. Будет работать или нет, не знаю еще. 
И не знаю как сам порт теперь обозвать, точнее, что ему присвоить.
Добавлено after 6 minutes 24 seconds:
А вообще, зачем их называть, если я уже и так все сделал?! Чет не догоняю, чего сам напихал.
Добавлено after 2 minutes 10 seconds:
Все. Догнал. Надо не так, а вот так примерно:
Добавлено after 8 minutes 39 seconds:
И, по моему, первый вариант лучше, т.к. он действительно позволяет назначать любые пины любых портов, а второй способ все же собирает в пару портов эти пины...
Добавлено after 37 minutes 7 seconds:
Почему я эту конструкцию не могу сразу затащить как условие в if?
Не работает. Но зато могу это присвоить переменной...
Типа такого:
Код: Выделить всё
# 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 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 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 что к чему
Имхо, не очень красивые макросы. Легко ошибку сделать при их описании и пользоваться неудобно.
Я предпочитаю такой вариант, когда использование выглядит следующим образом:
и т.п.
Подсмотреть принцип объявления пинов в этом случае можно у меня здесь.
Правда, я эти макросы с использованием LL библиотеки делал, но и на чистом CMSIS никакой сложности их объявить нет.
P.S. За эти "stroka" и "stolbets" и прочее подобное хочется сильно бить по голове учебником английского. Почему не "line" или "row"?
Я предпочитаю такой вариант, когда использование выглядит следующим образом:
Код: Выделить всё
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 что к чему
А вот здесь типа цикл сделали, чтобы просто объединить группу действий?
И, вроде все понятно, но это не понятно...
Можно словами эту строку описать. Зачем столько скобок? И почему OUT с таким "параметром" (р)?
Добавлено after 2 minutes 46 seconds:
И сверху обозначены прототипы функций?
Код: Выделить всё
#define OUT_INIT(p, t, s) \
do { \
OUT(p); \
SPEED(p, s); \
OTYPE(p, t); \
} while (0);
Код: Выделить всё
#define OUT(p) (LL_GPIO_SetPinMode(CONCAT(p, _Port), CONCAT(p, _Pin), LL_GPIO_MODE_OUTPUT))
Добавлено after 2 minutes 46 seconds:
И сверху обозначены прототипы функций?
Станислав
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Там нету цикла (while (0)). Просто несколько операций группируются в одну.
Попробую объяснить.
Здесь всё достаточно понятно. Обычная конкатенация. Любой макрос вида
CONCAT(test, pin) развернётся в строчку testpin.
Объявляю пин MUTE:
Инициализирую его с помощью макроса
В C-коде инициализация будет следующая:
Как это работает (стадии препроцессора, в качестве параметра p макроса идёт MUTE):
Аналогично и все прочие макросы (SET, CLR и т.д).
Единственное, всё это у меня разворачивается до функций библиотеки LL. Но по тому же принципу и "чистый" CMSIS можно вызывать.
Попробую объяснить.
Код: Выделить всё
#define CONCAT(x,y) x ## yCONCAT(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))Код: Выделить всё
{
...
OUT(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));Единственное, всё это у меня разворачивается до функций библиотеки 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, но я в них постоянно путаюсь, кто из них строка, а кто столбец, еще с Ехеля начиная. Ну, не англичанин я...
Добавлено after 3 minutes 25 seconds:
Я вообще думал, что это строка к С++ относится... Ни разу с такой не встречался. Пойду почитаю за конкатенацию.
А вот именно все скобки у макроса и не понятны все равно.
Вот эти:
А про НЕцикл я понял. Просто мне стало интересно, неужели в группу никаким другим образом несколько действий нельзя объединить больше? 
Добавлено after 6 minutes 25 seconds:
О! Начинает доходить. ))) Начал внимательно смотреть в скобки!
Благодарю.
Добавлено after 10 minutes 13 seconds:
Блин... что за оператор такой ##?
Точно! А я думал, как в транслите написать букву Ц!
А серьезнее, то так мне было проще, типа я художник, я так вижу. Изначально хотел написать ROW COLUMN, но я в них постоянно путаюсь, кто из них строка, а кто столбец, еще с Ехеля начиная. Ну, не англичанин я...
Добавлено 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))
Добавлено after 6 minutes 25 seconds:
О! Начинает доходить. ))) Начал внимательно смотреть в скобки!
Благодарю.
Добавлено after 10 minutes 13 seconds:
Блин... что за оператор такой ##?
Станислав
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Прочитайте по макросы в C. ## соединяет две текстовые лексемы.
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: STM32 новичку в ARM что к чему
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3579028#p3579028"]Почему я эту конструкцию не могу сразу затащить как условие в if?
Не работает. Но зато могу это присвоить переменной...[/uquote] Вероятно потому, что в дефайне стоит точка с запятой после выражения. Что нарушает синтаксис if'а.
Код: Выделить всё
# define _1_Stolb_Read (GPIOB->IDR & GPIO_IDR_IDR15);
Код: Выделить всё
if (_1_Stolb_Read)
{
}
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Ну ооочень сложные макросы у меня тогда получаются. Я разобрался в Ваших уже, наверное, основательно. С LL это много проще, похоже, чем на CMSYS.
И дальше в том же духе... настройки частоты, входов, начального состояния выходов...
Собраться верхняя штуковина должна примерно в такой вид:
Ну и вызов да, простой:
Код: Выделить всё
#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 скриптом:
То бишь, для конкатенации пишу `| что удобней и быстрее.
P.S. Остальные замены нужны, преимущественно, для использования макросов внутри одинарных или двойных кавычек.
Пусть меня забросают шапками, но я именно по этой причине 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. Остальные замены нужны, преимущественно, для использования макросов внутри одинарных или двойных кавычек.
Re: STM32 новичку в ARM что к чему
А есть ли тут гуру ассемблера? Должны быть))
В частности интересует во что компилируются инкремент/декремент обычных переменных и указателей.
Насколько я помню, в AVR'ках инкремент/декремент обычной переменной подразумевал:
1. Загрузку значения из оперативки в регистр
2. Инкремент значения в регистре одной командой
3. Выгрузку значения обратно в оперативку
Тобишь процесс не атомарен. А как это устроено в ARM'ках? Тут тоже инкремент/декремент осуществляется через регистры или как?
И что насчёт адресной арифметики? Есть какие то специальные инкременты на степени двойки? Или это реализуется уже обычными арифметическими командами?
И ещё вопрос. Насколько эффективно компиляторы реализует остаток от деления? Со степенями двойки всё должно быть просто, а с произвольными числами неизвестными на этапе компиляции? Условно, что эффективнее?
PS если где-то это уже разжёвано, буду благодарен за ссылочку.
В частности интересует во что компилируются инкремент/декремент обычных переменных и указателей.
Насколько я помню, в AVR'ках инкремент/декремент обычной переменной подразумевал:
1. Загрузку значения из оперативки в регистр
2. Инкремент значения в регистре одной командой
3. Выгрузку значения обратно в оперативку
Тобишь процесс не атомарен. А как это устроено в ARM'ках? Тут тоже инкремент/декремент осуществляется через регистры или как?
И что насчёт адресной арифметики? Есть какие то специальные инкременты на степени двойки? Или это реализуется уже обычными арифметическими командами?
И ещё вопрос. Насколько эффективно компиляторы реализует остаток от деления? Со степенями двойки всё должно быть просто, а с произвольными числами неизвестными на этапе компиляции? Условно, что эффективнее?
Код: Выделить всё
a += b;
if (a >= maxValue) a -= maxValue;
// или обойтись без if'а и просто взять остаток от деления?
a += b;
a %= maxValue;
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Эмм.. вообще-то 2-я и последняя строки в приведенном коде считают совершенно разные вещи.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Satarych, вместо кучи дурацких вопросов написал бы интересующий тебя код и посмотрел во что он компилируется. Лучше один раз увидеть, чем сто раз услышать.
Re: STM32 новичку в ARM что к чему
Калокуб STM32Cube_FW_F4_V1.24.0 "Add support of HAL callback registration feature" ну наконец годную вещь завезли...
-
DrobyshevAlex
- Открыл глаза
- Сообщения: 74
- Зарегистрирован: Пн янв 21, 2019 17:38:29
Re: STM32 новичку в ARM что к чему
Здравствуйте! Подскажите пожалуйста, мне нужно подключить 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
Возможно вместо 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 что к чему
Вообще-то, демоплата от ST, а именно - STM32F429I-DISCO имеет на борту и SDRAM, и дисплейчик 2.6". Камушек там, естественно, 429I, SDRAM 8M, и, на закуску, ST-Link...
Чтобы потренироваться - самое то!
Чтобы потренироваться - самое то!
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: STM32 новичку в ARM что к чему
Народ, подскажите, уже голову сломал. Начал изучение с STM32F0P30. Попалась китайская девайсина с этим МК, реле, входом и светодиодом. Устройство с Модбас интерфейсом. Не понравилась логика работы, решил написать свой код. Использую Cube. Закопался c RS485. В устройстве используется преобразователь UART-RS485 с переключателем DE. Всё вроде бы оформил как надо, пытаюсь отправлять наружу текст. Всё получилось, вижу его на компе в гипртерминале. Решил проверить работу переключателя DE и тут непонятка. Использую HAL_GPIO_WritePin (GPIOA, GPIO_PIN_0, GPIO_PIN_SET), текст проходит, меняю на GPIO_PIN_RESET и всё равно вижу в Гипертерминале мой текст. По идее DE должен включать/отключать передачу... Разве нет?
Re: STM32 новичку в ARM что к чему
Sergeba , в большинстве F0 есть как и аппаратное управление DE так и аппаратная поддержка модбас.
калокуб и софтовое ногодрочерство попросту не нужны, нужно начать читать и думать.
калокуб и софтовое ногодрочерство попросту не нужны, нужно начать читать и думать.
Re: STM32 новичку в ARM что к чему
[uquote="dosikus",url="/forum/viewtopic.php?p=3603922#p3603922"]Sergeba , в большинстве F0 есть как и аппаратное управление DE так и аппаратная поддержка модбас.[/uquote]
Я правильно понял, что даже в случае, если я софтово дёргаю ногу, на которой висит DE+RE и запрещаю передачу, "аппаратной поддержке" пофиг и она пропускает пакет?
А калокуб приходится использовать т.к. удобно для старта - накидал основу - и он всё нужное соберёт для инициализации и т.п.
Я правильно понял, что даже в случае, если я софтово дёргаю ногу, на которой висит DE+RE и запрещаю передачу, "аппаратной поддержке" пофиг и она пропускает пакет?
А калокуб приходится использовать т.к. удобно для старта - накидал основу - и он всё нужное соберёт для инициализации и т.п.


