Умножитель частоты шагов на STM32

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11626
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4634
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение michael-yurov »

MX_Master писал(а):2-я версия CoIDE настолько поменялась в сравнении с 1.Х.Х, что без пузыря не разобраться.
Я до сих пор не разобрался.
Уже несколько заходов делал.
Каждый раз заканчивалось нелитературным выводом.
К сожалению, не пью. Может быть пузырь и помог бы.
MX_Master писал(а): Найти, выбрать и настроить софт для разработки - целая головомойка. Пробовал Keil, IAR-EWARM, CoIDE V2. Дольше всех мучал связку "CoIDE_V2Beta + GNU ARM Embedded Toolchain + ST Link Utility".
Я так и не выбрал.
Пользуюсь первым CooCox-ом, но понимаю, что нужно от него уходить.

Ситуацию усугубляет CubeMX со своими HAL библиотеками.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение AndyBig »

А что в IAR настраивать? Выбрал нужный контроллер и пиши программу :)
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение selenur »

Я раньше кейлом пользовался, но интерфейс среды разработки удручал, пока не нашел вот такой плагин: http://visualgdb.com/tutorials/arm/stm32/
Теперь в одной среде разработки можно программировать и отлаживать не только программы по винду, но и под STM, отладка на удивление работает нормально, но плагин платный, но не дорогой ;-)
Есть возможность импортировать проект сформированный CubeMX.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение Serg »

Скачай CubeMX, создай новый проект на основе любой demoboard и сгенери результат - при генерации
будут предложены варианты IDE под которые генерить, вот любой из них и ставь.

CoIDE уж точно не стоит ставить - оно заточено под библиотеку, которую ST уже похоронил.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7474
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3098
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение MX_Master »

Как я понял, куда не плюнь, везде IDE идут на основе Eclipse. Попробовал до кучи winIDEA Open и Atollic TrueSTUDIO. У последнего порог вхождения ниже, зато отладка платная.

В итоге вышел на бесплатный SW4STM32. Весьма низкий порог вхождения - сел и поехал. На борту имеем стандартную библиотеку периферии (StdPeriph) и Cube HAL - отмечаем требуемое при создании проекта. Можно, канеш, ничего не подключать, получится голый проект для хардкорщиков. На выбор все стандартные макетки с STM32. Немного фоток для желающих попробовать..
2016-12-11_151311.png (2601 просмотр) <a class='original' href='./download/file.php?id=97325&sid=cfa615a9933a2bc200c08a014e388138&mode=view' target=_blank>Загрузить оригинал (18.42 КБ)</a>
2016-12-11_151606.png (2601 просмотр) <a class='original' href='./download/file.php?id=97323&sid=cfa615a9933a2bc200c08a014e388138&mode=view' target=_blank>Загрузить оригинал (18 КБ)</a>
2016-12-11_151957.png (2601 просмотр) <a class='original' href='./download/file.php?id=97321&sid=cfa615a9933a2bc200c08a014e388138&mode=view' target=_blank>Загрузить оригинал (46.75 КБ)</a>
2016-12-11_151453.png (2601 просмотр) <a class='original' href='./download/file.php?id=97324&sid=cfa615a9933a2bc200c08a014e388138&mode=view' target=_blank>Загрузить оригинал (16.4 КБ)</a>
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11626
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4634
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение michael-yurov »

UAVpilot писал(а):Скачай CubeMX, создай новый проект на основе любой demoboard и сгенери результат - при генерации
будут предложены варианты IDE под которые генерить, вот любой из них и ставь.
Правильная мысль. В голову пока еще не приходила, т.к. после года попыток разобраться, что же такое HAL, и как с ним работать - уже не осталось сил на поиск новой среды разработки.
UAVpilot писал(а):CoIDE уж точно не стоит ставить - оно заточено под библиотеку, которую ST уже похоронил.
UAVpilot говорит, что давно пора переходить на HAL.
staltech писал(а): Все равно какая среда, только без КАЛА!!!
В КАЛЕ шаг вправо или влево и потеря недели времени гарантирована, возможно еще и напрасно.
staltech говорит наоборот.

Я несколько раз пытался создать основу проекта используя CubeMX с его HAL библиотеками.
Пока делаешь что-то простое - компилируется.
Как доходит дело до инициализации сложной периферии - не могу скомпилировать.
И в статусном окне система не объясняет где возникает ошибка и что ей не нравится.
Просто че-нибудь вроде "ошибка компилирования".
Несколько дней пытался создать базу для проекта с USB COM портом, SPI, UART, энкодерами и несколькими таймерами.
В итоге не смог даже один единственный USB поднять.

А со стандартными библиотеками получилось за несколько часов.
Аватара пользователя
staltech
Почётный участник
Почётный участник
Сообщения: 544
Зарегистрирован: 01 июл 2016, 22:50
Репутация: 155
Настоящее имя: Сергей
Откуда: Пензенская обл., г. Никольск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение staltech »

michael-yurov писал(а):Пока делаешь что-то простое - компилируется.
Как доходит дело до инициализации сложной периферии - не могу скомпилировать.
И в статусном окне система не объясняет где возникает ошибка и что ей не нравится.
Просто че-нибудь вроде "ошибка компилирования".
Несколько дней пытался создать базу для проекта с USB COM портом, SPI, UART, энкодерами и несколькими таймерами.
В итоге не смог даже один единственный USB поднять.

А со стандартными библиотеками получилось за несколько часов.
Я не хочу навязывать свое мнение. Но при последней попытке пару недель назад использовать HAL у меня вообще часть кода не работала при этом компиляция без ошибок. Настройки оптимизации и прочие танцы с бубном пофиг абсолютно. Ковырять ASM желания не возникло, потому что у меня с халом это не в первый раз.
Как и писал Михаил на стандартных библиотеках завел код без проблем.
С меня этого ХАЛА хватит, хотя соглашусь с тем что простые поделки на нем писать будет проще, цель ХАЛА насколько помню было упрощение переносимости кода между сериями контроллеров STM.
Аватара пользователя
staltech
Почётный участник
Почётный участник
Сообщения: 544
Зарегистрирован: 01 июл 2016, 22:50
Репутация: 155
Настоящее имя: Сергей
Откуда: Пензенская обл., г. Никольск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение staltech »

michael-yurov писал(а):UAVpilot писал(а):
Скачай CubeMX, создай новый проект на основе любой demoboard и сгенери результат - при генерации
будут предложены варианты IDE под которые генерить, вот любой из них и ставь.

Правильная мысль. В голову пока еще не приходила, т.к. после года попыток разобраться, что же такое HAL, и как с ним работать - уже не осталось сил на поиск новой среды разработки.
Я так пробовал, после внесения небольших добавлений в проект, используя исключительно HAL проект упал. Что было связано с энкодерами. После этого переписал инициализацию вручную и все заработало стабильно. К сожалению опыт пока что печальный.
Может кто покажет живой пример как этого зверя победить, только на чем то реальном? ;)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение Serg »

Странно, почему у меня всё замечательно компилится и работает?.. Может потому, что не ленюсь читатать документацию?.. :)
Например нынешний проект: usb hid, виртуальный com, клавиатура, 2 spi, 2 usart, can, i2c, 2 энкодера, adc, куча таймеров, rtos - всё с использованием hal.
А старые библиотеки более не поддерживаются, баги не фиксятся, обновления не выпускаются, новые камни не поддерживаются.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
staltech
Почётный участник
Почётный участник
Сообщения: 544
Зарегистрирован: 01 июл 2016, 22:50
Репутация: 155
Настоящее имя: Сергей
Откуда: Пензенская обл., г. Никольск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение staltech »

UAVpilot писал(а):Странно, почему у меня всё замечательно компилится и работает?.. Может потому, что не ленюсь читатать документацию?..
Я не отказываюсь, что не умею его (HAL) готовить :) Помнишь когда после Ubuntu 10.04 Gmome2 выкатили Unity... Иногда подбешивает этот маркетинг. Пока просто перешел на другие микроконтроллеры.
UAVpilot писал(а):Например нынешний проект: usb hid, виртуальный com, клавиатура, 2 spi, 2 usart, can, i2c, 2 энкодера, adc, куча таймеров, rtos - всё с использованием hal.
Это та платка что недавно на фотке мелькала?
Аватара пользователя
MX_Master
Мастер
Сообщения: 7474
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3098
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение MX_Master »

Я думаю, что перед тем как начинать кодить, надо глубоко задуматься на тему - буду ли я (или еще кто-то) портировать мой проект под другие STM МК? Если все мысли сходятся к ответу - ДА, то мой выбор это HAL. С другой стороны, если проект крошечный в плане кода или по максимуму выжирает ресурсы МК, то мой выбор это SPL и ниже.

Тут уместно сравнение. STM32 HAL это как те же pinMode(), digitalWrite(), analogWrite() и т.д. - в ардуинке. Если б этой абстракции не было, ардуинка никогда б не получила столько юзеров. Таким же путём шагает STM32 HAL. Для начинающего изобретателя герлянды из светодиодов куда приятнее выглядит

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

НAL_GPIO_WritePin( GPIOA, GPIO_PIN_2, GPIO_PIN_RESET );
чем

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

GPIOA->ODR &= ~(1UL << 2);
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11626
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4634
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение michael-yurov »

А если без HAL:

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

GPIO_WriteBit ( GPIOA, GPIO_Pin_2, Bit_SET );
или

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

GPIO_SetBits ( GPIOA, GPIO_Pin_2 );
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение Serg »

staltech писал(а):Это та платка что недавно на фотке мелькала?
Да.
MX_Master писал(а):Таким же путём шагает STM32 HAL.
Это не основная цель, а бонус. Основная цель поддержать аппаратную стратегию stm32 - если перестало хватать аппаратных ресурсов, то на место прежнего МК можно тупо запаять более мощный и прога, использующая HAL пойдёт на нём без переделок.

С пинами пример неудачный - не показывает разницу. Хорошим примером была бы например инициализация периферии для работ с ADC через DMA на разных МК, например на stm32f1 и stm32f4.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение AndyBig »

UAVpilot писал(а):Хорошим примером была бы например инициализация периферии для работ с ADC через DMA
Вот инициализация нескольких каналов ADC через DMA:

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

void ADC_Config()
{

	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	DMA_InitTypeDef DMA_InitStructure;
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6); 
	// Enable ADC1, DMA, GPIOA and GPIOB clock
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

	// Configure PB1 (ADC Channel9) as analog input -------------------------
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	// Configure PA4 (ADC Channel4) as analog input -------------------------
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
#ifdef _RESKEY_
	// Configure PA3 (ADC Channel3) as analog input -------------------------
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif

	// DMA1 channel1 configuration ----------------------------------------------
	DMA_DeInit(DMA1_Channel1);
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCResults;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
#ifdef _RESKEY_
	DMA_InitStructure.DMA_BufferSize = 3;
#else
	DMA_InitStructure.DMA_BufferSize = 2;
#endif
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);
	// Enable DMA1 Channel1
	DMA_Cmd(DMA1_Channel1, ENABLE);

	// ADC1 configuration -----------------------------------------------------
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
#ifdef _RESKEY_
	ADC_InitStructure.ADC_NbrOfChannel = 3;
#else
	ADC_InitStructure.ADC_NbrOfChannel = 2;
#endif
	ADC_Init(ADC1, &ADC_InitStructure);
	// ADC1 regular channels configuration
	ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_55Cycles5);    
	ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_55Cycles5);
#ifdef _RESKEY_
	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_55Cycles5);
#endif
	// Enable ADC1 DMA
	ADC_DMACmd(ADC1, ENABLE);
		
	// Enable ADC1
	ADC_Cmd(ADC1, ENABLE);
	// Enable Vrefint channel17
	ADC_TempSensorVrefintCmd(ENABLE);
	
	// Enable ADC1 reset calibration register
	ADC_ResetCalibration(ADC1);
	// Check the end of ADC1 reset calibration register
	while(ADC_GetResetCalibrationStatus(ADC1));
	
	// Start ADC1 calibration
	ADC_StartCalibration(ADC1);
	// Check the end of ADC1 calibration
	while(ADC_GetCalibrationStatus(ADC1));
	
	// Start ADC1 Software Conversion
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	
	// Test on DMA1 channel1 transfer complete flag
	while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
	// Clear DMA1 channel1 transfer complete flag
	DMA_ClearFlag(DMA1_FLAG_TC1);

}
//==============================================================================	
Правда, я использую древние библиотеки от ST - Standart Periferal Library :)
Аватара пользователя
MX_Master
Мастер
Сообщения: 7474
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3098
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение MX_Master »

UAVpilot писал(а):С пинами пример неудачный - не показывает разницу.
Этот пример был применительно к моей задаче. Дергать биты портов и читать порты целиком надо очень часто. Если есть возможность, то лучше атомарно. А светодиодную змейку с HAL'ом быстрей написать. Ушёл читать Description of STM32F4xx HAL drivers ..

И еще один вопрос на десерт. Работу ардуинки можно было визуально симулировать в протеусе, где даже осциллограф был. А где ж визуально просимулировать работу Кортекса М4 ?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение Serg »

AndyBig писал(а):Вот инициализация нескольких каналов ADC через DMA:
Отквотил только удобную часть? :) А ты попробуй написать такое-же и для М4 и сравни... :)
MX_Master писал(а):Дергать биты портов и читать порты целиком надо очень часто.
Это как раз в обоих библиотеках практически одинаково, даже внутренняя реализация, разница в основном в инициализации периферии, в HAL она максимально платформонезависима.
MX_Master писал(а):А где ж визуально просимулировать работу Кортекса М4 ?
На демоплатах. :) Лабцентр уже заявил, что такой симулятор они дерать не планируют, т.к. нет должного спроса, но если кто-то профинансирует такую работу, то они конечно-же сделают. Тут нет желающих? :)
Но демоплаты несколько дешевле обходятся...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
u37
Новичок
Сообщения: 15
Зарегистрирован: 11 дек 2016, 15:03
Репутация: 1
Настоящее имя: serj
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение u37 »

Ой, не понимаю я вас. От ардуинки на F4? А почему же не F7??
Для subj вполне хватает F030.
Теперь по сути. ТС задался вопросом быстрых тиков для мягкости вращения двигателей, но забыл, что программа выдает тики явно не аппаратно.
Что Win, что Linux - это не реалтайм системы, они не способны адекватно выдерживать времена и, что особо противно, способны отнимать время в самый неподходящий момент. Драйвер под Win, у него тоже есть весьма опосредованная точность как вызова, так и времени исполнения. Если запись в порт (LPT) занимает 1 uS, то та-же запись через драйвер Win занимает уже 10 uS, и это на современном компьютере. Причина - большие накладные расходы на вход/выход драйвера.
Короче, тики хоть и сыпятся с частотой 30 кГц, но это только в_среднем. А в действительности, интервал междй соседними может быть гораздо меньше 30 uS. Как следствие - пропуск тика на моторе.
Т.е. программа должна не "ускорять", а "буферизировать" поток. Тогда отпадают много вопросы из темы и добавляются новые фичи. Например, ограничение скорости разгона/торможения. Возможно, автореверс.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение AndyBig »

UAVpilot писал(а):Отквотил только удобную часть? А ты попробуй написать такое-же и для М4 и сравни...
Отквотил целиком всю функцию настройки АЦП с DMA :) С M4 не работаю :)
Аватара пользователя
MX_Master
Мастер
Сообщения: 7474
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3098
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение MX_Master »

u37 писал(а):Ой, не понимаю я вас. От ардуинки на F4? А почему же не F7??
Для subj вполне хватает F030
Мегу2560 взял за 7$, макетку с F4 возьму за 8$, почём нынче макеточка с F7? С ардуинкой я уже разобрался в своей задаче, ресурсов едва хватает. почему бы не попробовать в рамках 10$ что-то получше? Особенно, если могут добавится новые полезные функции
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Умножитель STEP/DIR на Arduino или STM32 Cortex M4

Сообщение AndyBig »

Бери плату с Altera EP4CE10 - аппаратные генераторы STEP/DIR до десятков МГц с любым умножением-делением шагов, аппаратные обработчики энкодеров, аппаратная реакция на все прерывания 1 такт... Да и вообще все там - аппаратное, причем есть (будет) все что нужно и при этом ничего лишнего :-D
Цена - всего двадцатка баксов :)
Ответить

Вернуться в «Электроника»