STM32F103 & Arduino IDE

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

DetSimen пишет:

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

Какую ссылку то хочешь?

CheS_66 пишет:

b707 пишет:
похоже дело в конкретной плате.

Эти платы в Китае клепают все кому не лень похоже.

... ...

Так что ничего удивительного в том что одна плата работает как и должна, а другая нет.

Платы из разных закупок чтоли?

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

Probelzaelo пишет:

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

ссылку вот на это, на этот аналог от GD32

b707
Offline
Зарегистрирован: 26.05.2017

Probelzaelo пишет:

Платы из разных закупок чтоли?

я ж написал - платы от разных продавцов.  Хотя может это и не важно, а просто первая плата - случайный брак.

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

Probelzaelo пишет:

Платы из разных закупок чтоли?

У меня как минимум из 4 разных магазинов алиэкспресса, и ещё одна у местных продаванов/перекупов за 400 рублей куплена.

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

DetSimen пишет:

Probelzaelo пишет:

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

ссылку вот на это, на этот аналог от GD32

Таки забирай GD32F103C8T6 хотя врядли там тебя на ali забанили в поиске.  datasheet .

 

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

Блаадарю. 

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

Подскажите какой версией IDE лудше пользоваться?

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

лучше мелкостудию поставить с плагином для Дуино

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

DetSimen пишет:

лучше мелкостудию поставить с плагином для Дуино

что за мелкостудию?

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

infyniti пишет:
Подскажите какой версией IDE лудше пользоваться?

Удмуртский букварь. 1898 год. («Букварь для вотскихъ дѣтей»)

Votskij_bukvar.jpg

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

не гони тогда стм32 небыло

 

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

infyniti пишет:

не гони тогда стм32 небыло

тогда были неграмотные удмурты. О_О

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

Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье). Тут есть один нюанс, на момент написания статьи, ядро не работает на версиях среды разработки свыше 1.6.5, у меня стоит 1.6.5-r5 которую скачал тут. 

Проверенна работоспособность ядра на Arduino IDE версии 1.6.9.

я про это спрашивал

изначально думал что на1.8.5 тоже не работает

но поковырялся и заработало

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

Visual Studio Community 2015 c плагином Visual Micro.  Перед этим любую IDE от Duino

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Visual Studio Community 2015 c плагином Visual Micro.  Перед этим любую IDE от Duino

что-то я запутался...  Visual Studio и Visual Code Studio - это одно и то же? Вроде и то, и другое советуют для разработки. Если разные  - то что лучше?

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

Visual Code Blocks от мелкософта это просто редактор кода не привязанный к языку программирования.  На какой настроишь, тот синтаксис и будет подсвечиваца да плюс канпилятор надо к нему привязать и настроить.  Не знаю, что там с intellisence, а в Студии это очень удобная штучка. 

ЗЫ. Студия с плагином Микро, практически тот же Code Blocks, то бишь фактически надстройка над набивайкой, которая сама всё вызывает Ардуиновское + intellisence.  Я в Студии для десктопа на C# пишу, а на С++ - только под AVR. Попробовал какта на С++ desktop для Windows наваять, дак пил потом 3 дня с горя. Нету у меня диплома доктора философии, к сожалению. 

b707
Offline
Зарегистрирован: 26.05.2017

Блин... теперь стало еще непонятнее... А что такое Visual Code Studio? https://code.visualstudio.com/

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

дадада это я перепутал.  в моих сообщениях читать вместо Code Blocks - Code Studio

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

dimax пишет:

одной командой в сетапе SPI.setModule(2); всё само переключилось..

Сработало, спасибо за подсказку. Единственное что пришлось ещё подправить - явно указать пин CS, вместо 

#define PIN_CS SS указал #define PIN_CS PB12. Работает, карту памяти видит, пишет/читает.

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

Добрый вечер. Подскажите как реализовать ШИМ для управления трехфазным мостовым инвертором (см. изображение). 

Где-то читал что можно реализовать трехфазный ШИМ с помошью 1 таймера.

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

Трехфазный мостовой инвертор

b707
Offline
Зарегистрирован: 26.05.2017

Shpulka пишет:

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

 

если совсем ничего не знаете - обратитесь в раздел "Ищу исполнителя", там сделают за деньги. Разжевывать с нуля вам никто бесплатно не станет.

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

Мне исполнитель не нужен, т.к. в дальнейшем планируется исследовательская работа и постоянные корректировки  СПО. Нужно самому освоить.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Shpulka пишет:

Мне исполнитель не нужен, т.к. в дальнейшем планируется исследовательская работа и постоянные корректировки  СПО. Нужно самому освоить.

https://www.google.com/search?q=stm32+таймеры

https://www.google.com/search?q=stm32+таймеры+3+фазный

https://www.google.com/search?q=stm32+таймеры+BLDC

nik182
Offline
Зарегистрирован: 04.05.2015

прочитайте AN4013 App Note последний раздел. Тамвсё описано.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Вот и я блинк попробовал, бутлоадер залил через STM32-Link

slider
Offline
Зарегистрирован: 17.06.2014

Народ, подскажите по теме

беру blink , убираю delay() ,

void setup() 
{
 pinMode(PC13, OUTPUT);
}

void loop() 
{
   while (1)
  {
   digitalWrite(PC13, HIGH);  
   digitalWrite(PC13, LOW);  
  }
}

на выходе получаю частоту 750КГц ,   где спрашивается 72МГц ? 
теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).

пробовал как в либе   gpio_write_bit(PC13,1);   gpio_write_bit(33,0);  ругается, видимо внутренние функции .

1. где можно посмотреть как выводить в порт быстрее чем  digitalWrite()  , как это у ардуино: PORTB=B00100000; PORTB=B00000000; ?

2. как выводить в порт целиком 8ми битовый байт byte на PB0..PB7  (PA0..PA7)  или на 8..15 пины  ,  и как можно вывести 2байта сразу на 16пинов 0..15 ?

 

slider
Offline
Зарегистрирован: 17.06.2014

в либе  \Documents\Arduino\hardware\Arduino_STM32\STM32F1\libraries\LiquidCrystal
подсмотрел 
 

void LiquidCrystal::write8bits(uint8 value)
 {
    for (int i = 0; i < 8; i++) 
    {
    digitalWrite(_data_pins[i], (value >> i) & 0x01);
    }

  pulseEnable();
}

 

но это же блядство! 
медленным digitalWrite()  выводить в цикле 8раз побитово  + множественные сдвиги  . этож сколько дохрена тактов тратится,
а  AVR за 1 такт выдает цельный байт в цельный порт. 
как сделать то поуму, как быстро устанавливать пины , и как можно сразу байт на порт положить за 1 такт?

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

slider пишет:

как сделать то поуму, как быстро устанавливать пины , и как можно сразу байт на порт положить за 1 такт?

Никак... Хотите скорость ногодрыга??? Переходите на ПИКи...

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

slider пишет:

теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).

У вас неправильная теория... отсюда и все беды... Для 103-го... четыре такта без перехода... максимум...

slider
Offline
Зарегистрирован: 17.06.2014

ssss пишет:

slider пишет:

теоретически должно быть на выходе 24МГц (= 3такта = 1,0,переход).

У вас неправильная теория... отсюда и все беды... Для 103-го... четыре такта без перехода... максимум...

очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц).  Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов.  Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.

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

\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?

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

slider, ну digitalWrite по скорости конечно далёк от идеала...

В stm-ках удобно ногодрыг делать бит-бендом, особенно учитывая, что автор библы stm32duino уже предусмотрел специальную функцию.


void setup() {
pinMode(PC13,OUTPUT);
while(1){
bb_peri_set_bit(&GPIOC_BASE->BSRR, 13, 1);
bb_peri_set_bit(&GPIOC_BASE->BRR, 13, 1); 
   }
}

void loop() {}

Ежели дёргать не бит, а цельный порт то можно ещё быстрее, но это будет не корректно по отношению к тем битам порта, которые не хотят дёргаться :) . Но можно в остальные биты писать ноль например...


void setup() {
pinMode(PC13,OUTPUT);
while(1){
GPIOC_BASE->BSRR= 0x2000;
GPIOC_BASE->BRR=0x2000;

   }
}

void loop() {}

 

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

Дизассемблировал вот такую функцию:

void dimax() {
while(1){
GPIOC_BASE->BSRR= 0x2000; 
GPIOC_BASE->BRR=0x2000;
}
}

Получилось вот это:

08002144 <_Z5dimaxv>:
 8002144:	4b02      	ldr	r3, [pc, #8]	; (8002150 <_Z5dimaxv+0xc>)
 8002146:	f44f 5200 	mov.w	r2, #8192	; 0x2000
 800214a:	611a      	str	r2, [r3, #16]
 800214c:	615a      	str	r2, [r3, #20]
 800214e:	e7f9      	b.n	8002144 <_Z5dimaxv>
 8002150:	40011000 	andmi	r1, r1, r0

Судя по коду 

2стр - загрузка в регистр R3 адреса порта со смещением 8

3стр -скопировать  в регистр r2   0x2000(13й бит)  для записи в порт

4стр - записать 0x2000 в порт с адресом r3 и смещением 16

5стр- записать 0x2000 в порт с адресом r3 и смещением 20

6стр -неведомая хрень, похоже на джамп в начало.

Итого 5 команд, если правильно понял (в асме я разбираюсь на уровне "лампочкоморгатель" :)

Частота получаемая -4,5МГц. Осталось теперь понять как 5 команд выполняются за 16 системных тактов :)

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

slider пишет:
как можно вывести 2байта сразу на 16пинов 0..15 ?
Записью в регистр ODR.

dimax пишет:
Осталось теперь понять как 5 команд выполняются за 16 системных тактов
За 15.

two wait states, if 48 MHz < SYSCLK < 72 MHz

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Там время исполнения команд может быть до 4 тактов, тут andriano недавно разбирался с этим вопросом.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

slider пишет:

очень жаль что 72мгц stm32 оказалась в несколько раз медленней по работе с пинами чем 16мгц atmega328 ( 0.7Мгц против 4МГц).  Уж думал что 8/16ми битные дисплеи на ней бысстрее будут работать , ан нет. Прийдется выбросить ее для медленных проектов.  Многие примеры в инете с якобы быстрым ногодрыгом не компилятся в IDE , видимо для других оболочек. потратил день впустую на поиск в инете решений.

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

\\ мож какая команда есть в IDE чтоб увеличить скорость тактированиея портов ?

Нет, ну два такта на переход минимум. Т.е. логический анализатор на 24 МГц уже пропускает импульсы. На AVR такого не может быть в принципе.

По поводу экрана - по моим измерениям заливка экрана одним цветом (цвет 16-разрядный) дисплея с разрешением 320х240 может выполняться со скоростью более 115 fps (почти 18 Мб/с).

http://arduino.ru/forum/proekty/video-na-stm32duino-ov7670-stm32f103c8t6-ili9341#comment-387716

Если можете такое изобразить на AVR - вперед.

slider
Offline
Зарегистрирован: 17.06.2014

о, благодарю за содержательные ответы,  то что надо! 
действительно, частота дерганья пина теперь стала хорошая.
значит будем все же постигать stm32 :) .
С каморой прям в точку, как раз хотел замутить быстро сохранять картинку с камеры на микросд uhc, чтоб потом выдавать ее на дисплей nextion (понять где он в своей флэш памяти w25q256  сохранил картинки, прочитав флэш на разных по цвету картинках, и одну перезаписывать с помощью stm32 ).  

//  А то в ITEAD уже как 2 года назад обещали intelligent (advanshion) nextion дисплей , но решили не развиваться дальше, а тупо продавать старое, у которого типа нет и не будет возможности работать с микросд (только копировать прошивку).  
    А через UART передать  картинку будет до 15секунд (хотя год назад они придумали ужать как-то картинку в несколько секунд , но делиться этим не хотят,  и форум у них закрытый).   Через их GPIO 8байт тож видимо не быстро будет (у Enhanced версий дисплеев).  
  Подкупает одно в этих HMI дисплеев - это графическая среда для рисования.  А у nextion в частности и дешевизна среди всех остальных HMI. 

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

Знаний, полученных от вдумчивого просмотра дизассемблированого кода хватило что б написать свой максимально оптмимизированный код, в цикле крутятся всего 3 команды.

void setup() {
pinMode(PC13,OUTPUT);
toogle_pin();
}

void toogle_pin() {
asm volatile (
  "ldr   R0, =0x40011000"  "\n\t" 
  "mov   R1, 0x2000"       "\n\t"  
  "loop:"                  "\n\t"
  "str   R1, [R0,0x10]"    "\n\t" 
  "str   R1, [R0,0x14]"    "\n\t" 
  "B  loop"                "\n\t"     
: : : );

}

void loop() {}

Итоговый ногодрыг  10.264 Mhz при 72 MHz тактовой.

Судя по картинке каждая команда выполняется очень примерно по 30нС

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Спасибо dimax. Наконец-то начало доходить то, что писалось мною тут как-то давненько уже. Хороший камень по бросовой цене - не продают. :)

Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)

Ну и ещё, дополню. Отсюдова: частота 48..72Мгц требует 2 такта ожидания, из которых 1 похоже "съеден" конвеером (буфер на 2 команды у СТМ, в отличии от других АРМ). То есть на боевых программах можно ожидать просадку ещё в два раза и в итого .. получаем мегу с каналом ДМА. В недостатке - значительно больший размер программы и данных (32 разряда + выравнивания), что резко снижает достоинство большего флеш и оперативы.. ровно все то, что писал раньше .. зато криков .. :)

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

Arhat109-2, кстати вот неплохо бы найти такую табличку как у AVR, где расписано какая команда сколько тактов выполняется. Что-то не попадалась она мне... Похоже производители не афишируют эти данные, что-б не пугать покупателей :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Её не может быть в силу архитектуры. В зависимости от частоты работы - втыкаются такты ожидания, которые сьедаются буфером команд и конвейером предвыборки .. все как у "взрослых" :) Это ещё одна причина, почему такие камни хуже пригодны к ембедед разработке - только грамотное использование периферии по прерываниям, аппаратным возможностям и т.д. Тут "строго таймированный ногодрыг" - фактически запрещен. :)

.. и главная причина почему они не в состоянии вытеснить 8-битники. :)

slider
Offline
Зарегистрирован: 17.06.2014

хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 . хотя ткнувшись на рядом кварц  8.00003МГц кажет . Сколько у вас осцил на кварце 8.000  STM32 кажет?
Мож дело в моей плате в бутлоадере generic_boot20_pc13.bin , заливал по статье https://habr.com/post/395577/  ,  Разве что IDE1.8.5, и либы stm32 самые последние https://github.com/rogerclarkmelbourne/Arduino_STM32 , в менеджере плат Ard Sam Boards (32b SRM Cortex-M3) 1.6.11  тож последний (на 1.6.8 также).

вот еще быстрый код нашел
исходя из него попробуйте на ассемблерной вставке , не на PC13 посылать, а в нижний бит регистра ,  к примеру PB0 или PB1 , PA0.

// <a data-cke-saved-href="https://wiki.stm32duino.com/index.php?title=API" href="https://wiki.stm32duino.com/index.php?title=API" rel="nofollow">https://wiki.stm32duino.com/index.php?title=API</a> 

void setup()
 {
  pinMode(PB0, OUTPUT);
  pinMode(PB10, OUTPUT);
  pinMode(PC13, OUTPUT);
}
 
void loop()
 {
 while (1) 
   { 
  // 25нс+25нс+90нс переход             бит из нижнего байта-7.18мгц  
  gpio_write_bit(GPIOB, 0, HIGH);    
  gpio_write_bit(GPIOB, 0, LOW);

  // 30нс+30нс+107нс переход           бит из верхнего байта -5.98MHz 
//  gpio_write_bit(GPIOB, 10, HIGH);    
//  gpio_write_bit(GPIOB, 10, LOW);
 }
}
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

slider пишет:

хммм , у меня осцил этот код что с ассеблерной вставкой не 10.24 кажет, а 7.98 .

Боюсь, что это нормально. Вряд ли компилятор станет менять явный код на асме, значит поменял что-то ещё, что именно трудно понять, нужно очень хорошо ориентироваться в этой кухне..

Попробуйте влить готовую прошивку.  Можно будет понять компмилятор это шалит, или что-то ещё. с пина С13 там должно идти 10МГц, а с пина А8 тактовая частота (72МГц). Строчку для программирования можно посмотреть с включённой опцией "показать подробный вывод при загрузке" в ArduinoIDE,

я залил вот так:

"C:\Program Files (x86)\Arduino\hardware\Arduino_STM32/tools/win/maple_upload.bat" COM6 2 1EAF:0003 r:\stm_10MHZ_pc13.bin

 

slider пишет:
хотя ткнувшись на рядом кварц  8.00003МГц кажет . Сколько у вас осцил на кварце 8.000  STM32 кажет?

Конечно. В МК есть синтезатор частоты, который умееет умножать частоту с кварца.  В данном случае умножает на 9.

slider пишет:

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

Без разницы какие биты дёргать, я много эксперементировал, (несколько часов) у меня с любыми вариантами было не более 8Мгц, а только тот ассемблерный код дал больше.

 

a5021
Offline
Зарегистрирован: 07.07.2013

dimax пишет:

Судя по картинке каждая команда выполняется очень примерно по 30нС

Надписи перепутаны. Слева направо они должны идти так: BSRR, BRR, LOOP.

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

a5021, почему? В единице сигнал находится когда команда , поднимающая бит в BSRR уже отработала, и  длительность единицы cоответссно определяться длительностью исполнения команды записи в BRR.

"str   R1, [R0,0x10]"    // запись в BSRR, сигнал в это время в "0" 
"str   R1, [R0,0x14]"    //запись в BRR сигнал в это время в "1"
"B  loop"                     // состояние в это время в "0"

 

a5021
Offline
Зарегистрирован: 07.07.2013

Теперь понял, что вы имели ввиду. Момент, когда команда уже отработала находится на кончике стрелки. Мое же мнение, которое, впрочем, я никому не навязываю,  надписи должны находиться над вертикальными линиями и идти в том порядке, что я предложил.

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

Снизил тактовую до 16МГц, ногодрыг стал очень странным:

Полный цикл чётко чередуется то 4 то 5 тактов МК , не представляю как это можно объяснить, ведь команд по прежнему 3 .. :-\

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

dimax пишет:
Полный цикл чётко чередуется то 4 то 5 тактов МК , не представляю как это можно объяснить, ведь команд по прежнему 3
Все дело в Prefetch buffere

a5021
Offline
Зарегистрирован: 07.07.2013

По хорошему надо вот так сделать: FLASH->ACR = 0; Вышеназванный буфер выключить и число циклов ожидания сократить до нуля.

a5021
Offline
Зарегистрирован: 07.07.2013

Arhat109-2 пишет:
Спасибо dimax. Наконец-то начало доходить то, что писалось мною тут как-то давненько уже. Хороший камень по бросовой цене - не продают. :)

Собственно получается похоже так: 72Мгц тактовая, или 13.8(8)нсек период. 3 команды из них 2 по 2 такта и 1 в 3 такта (BR), итого 7тактов или частота = 10,285Мгц .. и никаких чудес. Что выше 16Мгц меги .. всего в 2(Два) раза при большей тактовой в 4,5 об чем и писал раньше. :)

"Разы" можно по разному сравнивать. Вот кто и как быстрые преобразования Фурье выполняет (Mapple  это и есть stm32duino).

До 65 раз доходит.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это как раз то, что описал выше и почему невозможно фикс. тактирование команд.