STM32F103 & Arduino IDE

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

qwone пишет:

тогда они будут велосипедами.

хорошо, что не щуками, амфорами или стерхами

b707
Онлайн
Зарегистрирован: 26.05.2017

Возвращаемся к теме ветки. В прошлый раз я сравнивал обьем кода для Арудуино Уно и STM32F103 при стандартных настройках Ардуино IDE. Напомню,  результаты были "так себе" (скетч работы с тензодатчиками, 48 строк без учета комментариев)

Уно - код 3,9к байт(12%), данные 480 байт(23%)
СТМ - код 23к(34%), данные 5600(17%) байт

Однако, как выяснилось из изучения буржуйских форумов, размер кода STM32 можно существенно уменьшить, не отказываясь от Ардуино IDE.

Рассмотрим по пунктам :

1. Если отказаться от загрузки через встроенный USB-USART. (выбрать в опциях Upload method => Serial), то в программу не будет добавляться весьма обьемный код USB-Serial

результат компиляции - код 15870, данные 4824 байт

2. Заменим setup() и loop() на классическую main()

результат компиляции - код 14522, данные 4684 байт

3. Добавим опцию --specs=nano.specs в настройки компилятора Ардуино IDE (см. ссылку ниже)

результат компиляции - код 11436, данные 984 байт

 

В итоге код стал меньше вдвое, а расход оперативки уменьшился более чем в 5 раз. Это уже куда интереснее, чем исходные цифры. И это я еще не оптимизировал код...

Результаты ниже в таблице

Code     Data    Comment

23156    5600    stsndart settings
15870    4824    Upload - serial
14522    4684    main()
11436     984    nano.specs

способы уменьшения размера кода взяты вот отсюда http://stm32duino.com/viewtopic.php?f=28&t=1596

PS просьба к ТС или админам  почистить тему от спама и флуда

Morroc
Offline
Зарегистрирован: 24.10.2016

Да... интересно. Но вот, кстати, отсутствие EEPROM немного напрягает, текущие настройки/значения сохранять удобно туда.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А если ты из main() вызовешь init(), то все вернется на круги своя. А без init() RTL работать не будет. 

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

А если ты из main() вызовешь init(), то все вернется на круги своя. А без init() RTL работать не будет. 

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

ssss
Offline
Зарегистрирован: 01.07.2016

А что вы сравниваете ваще? Кривость ард ИДЕ на разных камнях? Зашибись! И так ясно, что она кривая до не могу! Кривее уже наверное ничего и нет на белом свете.

Вот Кейл, СТМ32Ф103

Без систем инита и с пустым майном

Program Size: Code=120 RO-data=320 RW-data=0 ZI-data=1024

С систем инитом и с пустым майном

Program Size: Code=368 RO-data=320 RW-data=0 ZI-data=1024

А теперь прикиньте, сколько гуана ард ИДЕ накидывает? Не знаю как вам, а мне страшно от такого упорото-колхозного решения.

vvadim
Offline
Зарегистрирован: 23.05.2012

а ты не бойся))))

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ssss пишет:

Не знаю как вам, а мне страшно от такого упорото-колхозного решения.

ок. и, шо? всем пофиг.

ssss
Offline
Зарегистрирован: 01.07.2016

А я не боюсь, я брезгую.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ssss пишет:

А не боюсь, я брезгую.

я четвёртый год наблюдаю, как тебя тошнит...

выплюнь мядузу, скотина тупая!

ssss
Offline
Зарегистрирован: 01.07.2016

Клапауций 112 пишет:

всем пофиг.

Тогда нехрен скулить по поводу СТМ32 если рожа ард ИДЕ крива.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ssss пишет:

Клапауций 112 пишет:

всем пофиг.

Тогда нехрен скулить по поводу СТМ32 если рожа ард ИДЕ крива.

да всем пофиг на твои анальные страдания по поводу кривости Дуино ИДЕ.

ssss
Offline
Зарегистрирован: 01.07.2016

Зато все рады за твои орально-анальные удовольствия по жизни. ))))))))))))

"Береги сфинктер, Сеня!"(с). )))))))))))

Тед
Offline
Зарегистрирован: 06.11.2017

В этой программе ширина импульсов изменяется самостоятельно, можна ли ее сделать на постаянно 50% ?

Тед
Offline
Зарегистрирован: 06.11.2017

В этой программе ширина импульсов изменяется самостоятельно, можна ли ее сделать на постаянно 50% ?

infyniti
Offline
Зарегистрирован: 15.07.2017

А кто кого победил?

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

infyniti пишет:

А кто кого победил?

А победила, как всегда, пьянка, в доказательстве вся эта страница ...

PS. И три предыдущих тоже.

Shpulka
Offline
Зарегистрирован: 09.11.2017

Здравмтвуйте!
Начал изучать arduino и не могу подключить функцию pwmWrite().
В Arduino IDE эта функция никак не подсвечивается. При компиляции ошибок не возникает, но при этом генерации частоты на выходе нет.
В чем может быт проблема?
Функция analogWrite() работает, но может принимать значения только от 0 до 255.

Вопрос 2: какое время по умолчанию между выборками АЦП в Ардуино.
Вопрос 3: какого номинала сопротивлене лучше ставить на входе АЦП. Уж очень сильно пляшет цифровой код с АЦП.

МК stmf103c8t6

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Так на удачу, задам вопрос... У кого нибудь есть решение по отладке прошивки сгенеренной для STM ардуино IDE в протеусе. НИРАБОТАЮТ они там :( Из кеила,  у меня так же не получилось запустить. Только то что скомпилировано в самом шпроте, то работает....

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Дак pwmWrite() и analogWrite()  по сути одно и то же, просто имена разные. значение 0...255 это целый байт. чтобы использовать больше значений для ШИМ нужно чтобы на канале использовался 16 битный таймер, по умолчанию он не включится. тем не мение  не без некоторого шаманства воспользоваться ШИМ16бит таки можно. Смотреть тут - https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Probelzaelo, ваш мудрейший совет к STM32 никак не использовать.

Shpulka, вы забыли команду  pinMode(нога, PWM);

b707
Онлайн
Зарегистрирован: 26.05.2017

brokly - своего опыта нет, но на КАЗУСе народ пишет, что поддержка STM в протеусе очень сырая пока... Вообще, если там еще не спрашивали - советую kazus.ru, там по протеусу отдельный большой раздел и больше шансов. что подскажут.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

dimax пишет:

Probelzaelo, ваш мудрейший совет к STM32 никак не использовать.

Отчего же? Суть, вернее причина того что ШИМ имеет установку 0..255 вполне понятна. Для STM версии эта проблема с 8 битными установками таймера оставлена ради совместимости на уровне скетчей. Бороться придется с той же проблемой что и в примере для Атмеги, применять "в лоб" наверняка не получится, хотя и не думаю что адаптация к IDE на столько половинчата, но управление таймером и запись в регистры все же отличаться может, не говоря уже о необходимосте не запутаться в коэффициентах для пересчета

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Probelzaelo, на stm32 нет никакой проблемы.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

brokly - своего опыта нет, но на КАЗУСе народ пишет, что поддержка STM в протеусе очень сырая пока... Вообще, если там еще не спрашивали - советую kazus.ru, там по протеусу отдельный большой раздел и больше шансов. что подскажут.

Нормальная там поддержка. Все волшебно работает, если код пишешь прям в протеусе.  А вот эльфы стмовские оно не понимает, но что прикольно, нехы тоже 8(.  Да и на казусе, похоже, никто серьезно этим вопросом не задавался. Просто мне тут потребовалось мультипроцессорный проект отладить AVR + STM, думал в шпроте счаз моментом... Ага... Хрен там...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

dimax, тогда мне не понятно, почему об этом человек пишет.

Shpulka
Offline
Зарегистрирован: 09.11.2017

dimax,  спасибо, команда pinMode(нога, PWM); помогла. Теперь ШИМ принимает 65536 значений. хотя ранее пробовал pinMode(нога, PWM); данную команду, но видимо что то делал не так.

Тед
Offline
Зарегистрирован: 06.11.2017

как исправить ошибку?

 error: 'A6' was not declared in this scope

 
Тед
Offline
Зарегистрирован: 06.11.2017
nt redPin = B10;
int yellowPin = B11; 
int greenPin = B12; 
int analogPin = A6; 

void setup() 
{ 
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT); 
} 
void loop()
 { 
int val = analogRead(analogPin);
int mapVal = map(val, 0, 1023, 0, 3);
switch(mapVal)
{
case 0: 
setLights(LOW, LOW, HIGH);
 break;
 case 1: setLights(LOW, HIGH, LOW);
 break;
 case 2: setLights(HIGH, LOW, LOW);
 break; 
  } 
}

void setLights(int red, int yellow, int green)
 { 
digitalWrite(redPin, red);
 digitalWrite(yellowPin, yellow);
 digitalWrite(greenPin, green); 
} 

 

Shpulka
Offline
Зарегистрирован: 09.11.2017

Тед, возможно нужно указывать не "А6", а "PA6"?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Shpulka, конечно. Поосторожнее с "ардуиновскими привычками", в stm-duino совместимость далеко не во всём!

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

dimax пишет:

Shpulka, конечно. Поосторожнее с "ардуиновскими привычками", в stm-duino совместимость далеко не во всём!

И мне кажется, что это правильно.

Тед
Offline
Зарегистрирован: 06.11.2017

Поставил везде P - помогло, большое спасибо

b707
Онлайн
Зарегистрирован: 26.05.2017

Народ, подскажите форум, где позадавать вопросы по stm-duino? тут наверно не стоит срач провоцировать...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

b707
Онлайн
Зарегистрирован: 26.05.2017

dimax. спасибо

 

b707
Онлайн
Зарегистрирован: 26.05.2017

нда. там, прежде чем задавать вопросы - нужно рассказать о себе и своих проектах :)  В принципе, неплохое правило....

Рискну все ж таки сначала спросить здесь.

Кто-нибудь работал из-под Ардуино ИДЕ с встроенным RTC на плате STM32F103C8(b)T6 (самая ходовая, синенькая :) ? Что-то у меня даже встроенный пример из библиотеки не работает - выдает одни нули по функции rtc.getTime().  Надо ли для работы RTC обязательно подавать питание на пин VB, или при наличии основного питания оно должно работать и так?

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

b707 пишет:
Кто-нибудь работал из-под Ардуино ИДЕ с встроенным RTC на плате STM32F103C8(b)T6 (самая ходовая, синенькая :) ? Что-то у меня даже встроенный пример из библиотеки не работает - выдает одни нули по функции rtc.getTime().  Надо ли для работы RTC обязательно подавать питание на пин VB, или при наличии основного питания оно должно работать и так?

Пробовал этот RTC. Как-то странно он запускается - то работает, то нет. На некоторых экземплярах плат заводится сразу, на некоторых даже с батарейкой не работает. Другой момент - скетч с выводом времени в сериал сжирает порядка 70% памяти, хз почему(

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Да какой там срач, только тешимся. По любому если у кого то есть мнение то оно или правильное или одно из двух, на этот случай обязательно кто то возразит. В конце тунне.. диспута всегда будет какой нибудь ответ.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

b707 пишет:
нда. там, прежде чем задавать вопросы - нужно рассказать о себе и своих проектах :)  В принципе, неплохое правило....

Прекрасное правило отбивающее у начинающего любое желание задавать вопросы ))

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

dimax пишет:

Толькма буржуйский.

Штурмовать буржуйский с гуглотранслятором, я так почти все ответы на свои вопросы нашел, и про RTC, и про карту памяти, и многие другие мелочи. У них многое уже обсуждалось и решение так или иначе нашлось. Главное правильно вопрос сформулировать и правильно понять гуглоперевод. Единственный вопрос который так и не осилил - как переселить карту памяти на второй аппаратный SPI. Из их форума понял только что надо переписывать библиотеку работающую с картой памяти, но как именно это сделать - хз((( На первом SPI карта работает прекрасно, но блин в моем проекте эти пины для другого используются, и перенести на другие пока не получается - аппаратное ограничение конструкции(

b707
Онлайн
Зарегистрирован: 26.05.2017

CheS_66 пишет:

Штурмовать буржуйский с гуглотранслятором, я так почти все ответы на свои вопросы нашел, и про RTC, и про карту памяти, и многие другие мелочи.

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

b707
Онлайн
Зарегистрирован: 26.05.2017

CheS_66 пишет:

[Другой момент - скетч с выводом времени в сериал сжирает порядка 70% памяти, хз почему(

это вы что-то неправильно настроили ... у меня пустые скетчи берут сразу около 1.5К оперативки, но дальше этот параметр растет вполне адекватно коду .  70% памяти у меня пока ни один проект не занимал.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

CheS_66, я в своём генераторе сажал TFT дисплей на SPI2, никаких библиотек не правил, одной командой в сетапе SPI.setModule(2); всё само переключилось..

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

b707 пишет:

CheS_66 пишет:

[Другой момент - скетч с выводом времени в сериал сжирает порядка 70% памяти, хз почему(

это вы что-то неправильно настроили ... у меня пустые скетчи берут сразу около 1.5К оперативки, но дальше этот параметр растет вполне адекватно коду .  70% памяти у меня пока ни один проект не занимал.

Только что тоже с этим разобрался, на одном компе IDE старая и все библиотеки для стм тоже. Там скетч с часами жрет 70%. На другом IDE 1.8.5 и свежие библиотеки - пример с часами всего 26% выходит.

dimax пишет:

CheS_66, я в своём генераторе сажал TFT дисплей на SPI2, никаких библиотек не правил, одной командой в сетапе SPI.setModule(2); всё само переключилось..

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

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

DetSimen пишет:

Я тоже заказал.  Тоже хочу пащюпать.  Тоже жду. 

А я даже заказал Китайский "аналог" с как будто запасным функционалом от GD32, интересно что же там на самом деле )))

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

зовите эсесовца - срочно нужно обосновать, какие все пидарасы, а он - дыртанЬан.

b707
Онлайн
Зарегистрирован: 26.05.2017

По поводу RTC на плате STM32F103C - отвечаю сам себе: похоже дело в конкретной плате.

Взял две такие же платы, но от другого продавца - прошил, залил скетч - RTC завелся на обоих сразу, без танцев с бубном. А на первой плате так и не работает. То ли плата глючная, то ли я ее уже "поджарил" в ходе экспериментоа -  но на ней и USB-Сериал стартует не всегда, и скетчи грузятся через раз.

Так что проблема решена. Теперь еще надо проверить, не будет ли сбиваться время при отключении питания... но это уже не сейчас, пора спать :)

 

PS - просьба к админам - дайте мне право чистить сообщения в этой ветке

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Probelzaelo, ссылку давай

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

b707 пишет:

похоже дело в конкретной плате.

Эти платы в Китае клепают все кому не лень похоже. Различия начиная от разноцветных светодиодов и заканчивая другими по дизайну/разводке платы. Уже обсуждавшийся где-то здесь на форуме РоботДюн тоже стал делать плату на STM32F103C8T6, в своем традициионно-черном стиле. Так что ничего удивительного в том что одна плата работает как и должна, а другая нет.