Начало работы с stm32 или не повторяйте моих ошибок

image


Небольшой рассказ о граблях, встреченных на пути познания ARM на примере stm32f103c8t6 и stm32l151rct6.


Мое знакомство с микроконтроллерами началось с AVR. Ими я занимался довольно долго, пройдя путь от плат с процарапанными дорожками и ассемблера в AtmelStudio4 до нормального лута и самописных makefile'ов для работы в блокноте (в моем случае — KWrite) и командной строке.


Но пришло время потыкать палочкой и в их старших братьев — ARM. Выбор конкретного семейства был долгим и пассивным (потому что прямой надобности нет, вот и не спешил), но в конце концов закончился на stm32f1, как самом, пожалуй, распиаренном. Покупать программатор, отладочную плату вроде Discovery или blue pill? Что вы, я же мастер по AVR-кам! Любую плату можно сделать ЛУТом, да еще так, как тебе нужно, без лишнего обвеса. Поэтому покупаю голый stm32f103c8t6 и начинаю шаманить с трассировкой платы. Что же мне понадобится? Хотя бы два порта вывести на гребенки… упс, выводить порты целиком неудобно. Да и ладно, выведу по 8 ножек — от порта A младшие (0-7), от B — старшие (8-15). Еще, конечно, светодиоды и кнопки, как же без индикации и управления. Вот что меня удивляет в готовых отладочных платах так это отсутствие хотя бы 2-3 светодиодов и 1-2 кнопок, которые бы ни с чем не конфликтовали. Как они вообще себе представляют отладку? Под кнопки сами просятся PA8, PA9, они удобно расположены. Еще пригодятся USB, джамперы BOOT0, BOOT1 и разъем батарейки для часов. И разъемы для кварцев, чтоб совсем красиво (впоследствии ни разу не воспользовался разъемами для кварцев). Для питания контроллеру нужно не более 3.6 В, а с USB идет 5 В. Надо ставить стабилизатор. Много читал, как народ выбирает стабилизаторы с низким падением напряжения… зачем? Разница полтора вольта, да тут дубового 78l33 хватит. А теперь разъем JTAG. У Atmel разъем программирования был стандартный ISP10 или ISP6. Наверное JTAG тоже штука стандартная. Оказывается, да… но только для отдельного производителя или даже устройства. Смотрим разъем на st-link: красивый, 10-контактный. Смотрим на каком-то программаторе для AVR: упс, уже 20-контактный. Смотрим еще где-то: больше несовместимых разъемов богу несовместимых стандартов. Ну, раз так, будем изобретать свой. Если что, переходник между ними будет не сложнее переходника ISP-6 на ISP-10. Вроде бы все готово, можно делать плату. Как оказалось, шаг 0,5 мм вполне достижим на любительском уровне, даже почти маркером подрисовывать не пришлось.


Теперь чем ее прошивать. Раз есть USB, наверное, через него и умеет. Читаю даташит — ага, через USB не умеет, зато через UART1 умеет. Упс, как раз его-то я и забыл вывести. Мало того, он еще и с кнопкой конфликтует, с той что на PA9 висит. Ну да ладно, выведу на проводочках, а кнопка все равно еще одна есть. Немного шаманства и плата готова и даже определяется в stm32flash.


image


image


С железом вроде бы разобрался, пора переходить к коду. Почитав несколько статей в интернете нашел готовый архив под gcc-arm-none-eabi. Разбираться, как именно задавать последовательность сборки, буду потом. Пока что занимаюсь hello-world'ами на кнопках и светодиодах. Поскольку это мое первое знакомство с данным семейством, никаких оберток вроде HAL — только ручная работа с регистрами. Впрочем, это вполне естественный подход, как мне кажется, можно было и не упоминать. Немного напрягает все время дергать питание и BOOT0 на плате, ну да ладно, когда-нибудь сделаю JTAG-программатор. Как ни странно, на грабли с отключенным тактированием периферии не наступил. Вспомнил молодость, когда на TurboPascal'е писал обработку трехмерной графики. Здесь у меня есть дисплей на ili9341 от raspberry pi и контроллер на целых 72 МГц. Вот что получилось — до 200 точек на модель и 11 fps. Конечно же, все матрицы трансформаций считаются в числах с фиксированной точкой.



В какой-то момент захотелось сделать носимое устройство, чтобы долго работало от батарейки. Посмотрел я в даташит и огорчился: знаменитые ARM по потреблению в разы хуже тех же AVR-ок! Если у вторых (ткнул в первый попавшийся контроллер, которым оказался ATmega88p) потребление составляет 0,8 мкА в учетом часов, то у первых даже в самом экономичном режиме сна* — 25 мкА ± 1.4 мкА на RTC. Это никуда не годится. Впрочем, stm32f103 и не позиционируется как экономичная серия. Смотрю на сайте STmicroelectronics другие серии контроллеров и выбираю серию stm32l1: помимо потребления порядка 1 мкА, там есть еще емкостный датчик и контроллер ЖКИ. Правда, максимальная частота поменьше, всего 36 МГц (или 24 МГц если используется USB), но это я как-нибудь переживу. Решено: беру пару stm32l151rct6 аж с 32 кБ оперативки (еще там 256 кБ флеша, но слабо представляю чем его можно забить. Разве что совсем диким говнокодом или массивами данных).


  • ) не путать режимы сна (sleep, stop) с отключением (standby)

Параллельно делаю из запасной stm32f103 программатор st-link v2, просто потому что надоело возиться с BOOT0 и питанием, да и быстрее он. Впрочем, программирование по UART оставлю — мало ли что. Там тоже было немного шаманства, но ничего выдающегося. Разве что найти командную строку для openocd оказалось проблемой. Для будущих поколений оставлю ее:


openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase "$(firmware).bin" 0x08000000" -c "reset run" -c "exit"

Для stm32l151 надо, само собой, поправить target на "target/stm32l1.cfg"


image


image


Чуть забегу вперед по хронологии, но чтоб не возвращаться. Господа, не экономьте на толщине текстолита! Или хотя бы добавляйте подпорки, или не используйте smd-компоненты. Так получилось, что на плате программатора я предусмотрел всего два крепежных отверстия в рандомных местах. А места оказались довольно далеко от разъема JTAG. И через какое-то время я заметил, что программатор работает нестабильно. То работает, то нет, то через UART приходится стереть "жертву", тогда подхватит. Оказалось, что резистор, идущий от вывода контроллера к разъему, сломался. У него просто отвалилась контактная площадка от корпуса. Резистор я перепаял. Потом перепаял остальные. Потом догадался, что даже той малой деформации платы, которая возникала при втыкании-выдирании шлейфа, хватало для несчастных компонентов. В результате воткнул подпорку прямо рядом с разъемом. Пока держит.


Как читатель уже догадался, программирование все также идет в текстовом редакторе, а компиляция и прошивка — в консоли. Естественно, покупная отладочная плата под l151 меня вдохновляла не больше, чем всякие IDE. Потирая следы от граблей, оставленных первой платой, развожу вторую (считая программатор — третью, но он все-таки не отладочная плата). Раз уж собрался отлаживать энергоэффективное устройство, надо заморочиться с питанием. Стабилизатор 78l33 менять не буду, но его выход я разорвал джампером, чтобы туда можно было ткнуться амперметром (надеюсь все-таки на микроамперметр, но там уж как пойдет). Гребенки пусть будут такие же, как на предыдущей плате — совместимость! Ну и пару светодиодов и кнопок, конечно. Грабли с UART1 призывно поблескивают, но я все же ставлю его разъем и не получаю по лбу. Конечно, JTAG у меня уже есть, но страховка не повредит. Так же, как и предыдущую (и плату программатора тоже) удалось развести по одной стороне, даже перемычек не слишком много.


А вот при запаивании контроллера возникла проблема. Я как-то наивно полагал, что на корпусе микросхем должен быть ключ, обозначающий первую ногу. Кто бы ожидал, что молодцы из ST сделают ДВА ключа, симметрично. Вот и какой стороной его запаивать теперь? Подумав, я решил, что это не ключи, а технологические углубления. Мало ли, для позиционирования чипа при изготовлении, например. Или прижать основание для заливки пластиком. Тогда надо ориентироваться по надписи. Логично же, что надпись должна быть читаема если расположить микросхему "стандартно", то есть когда первая нога в левом верхнем углу. Так и начал припаивать. То ли дефект ЛУТа, то ли кривые руки, но припаялась микросхема криво, благо вовремя заметил, прежде, чем запаял целиком. Не беда, есть же старый способ отпаивания многоножек с помощью лезвия бритвы: оно не смачивается припоем и достаточно тонкое чтобы не слишком погнуть. Оказалось, руки все-таки недостаточно прямые, поскольку ножки погнулись. Но не вверх, а вбок, хорошо хоть не сильно и их удалось кое-как выпрямить. Вторая попытка запаивания шла уже под микроскопом, но прежде я решил доправить ножки. И одна из них отломалась. Из чего их делают, что один раз согнуть-разогнуть нельзя? У выводных-то компонентов такой проблемы нет. Ну все, думаю, микросхему в брак, придется запаивать другую. Но вдруг это не критичная ножка? Ну там, вывод общего назначения, или одно из питаний. Пока что запаяю без нее, а там видно будет. На этот раз удалось запаять ровно, правда ножка попала на I2C, с которым я хотел поразвлекаться, но хоть не на жизненно важные разъемы вроде USB, JTAG, UART или BOOT. Подключаю — не работает, программаторы плату не видят. Какое-то время шаманю с пропаиванием ножек, но не помогает. Блуждающий по даташиту взгляд натыкается на картинку контроллера, расположенную где-то в подвале документа. Вот как можно было придумать нанести надпись БОКОМ?! То есть если повернуть контроллер так, чтобы надпись читалась, первая нога окажется в левом нижнем углу. Попутно выяснилось, что одно из "технологических углублений" таки является ключом. Правда, не поясняется, как его отличить от симметричного… Ну, хоть какая-то зацепка. Выпаиваю контроллер строительным феном, чтобы не доломать выводы, и запаиваю на этот раз боком. Отломанный вывод попадает аккурат на TX вывод UART1, то есть на разъем программирования и отладки. Это совсем нехорошо, но перед тем, как менять контроллер, надо хотя бы убедиться что с ориентацией угадал чтобы при перепаивании на живой не убить его неправильным подключением. Подключаю программатор — работает. Ура. Остались мелочи — впаять разъемы, диоды и прочую обвязку. В комментариях подсказали еще один способ — прозвонить земли: они обычно соединены внутри корпуса и расположены не полностью симметрично. Правда, учитывая шаг выводов, попасть по нужным выводам может быть непросто. Как бы то ни было, это самый надежный способ.


Работать с контроллером без UART1 не хочется, да и хуже чем сейчас уже не будет. А если и будет, так все равно менять, поэтому принимаю решение поиграть в хирурга и сделать контроллеру протез ноги из волосинки МГТФа. Как раз под рукой валяется хороший электропроводный клей, которым волосинка решительно приляпывается к площадке на корпусе микросхемы. Тот клей, который попал на соседние ножки, безжалостно удаляется скальпелем. А что вы хотите, попасть в полумиллиметровую площадку и не попасть по соседним торчащим ножкам? Проверяю — работает. Пока не отвалилось, а чтобы не отвалилось и потом, заливаю цианакрилатом.


Возможно, так бы я этой платой и пользовался, если бы ножка не отвалилась повторно. А она залита клеем. Впрочем, он довольно мягкий и режется скальпелем, поэтому успешно счищается. Но использовать тот же электропроводный клей второй раз почему-то не хочется. Попробую-ка я ножку припаять. Обычным жалом паяльника туда не подлезть, но в комплекте шло коническое (вообще-то, коническое изначально было единственным, но ввиду его очевидной неудобности, было заменено обычным, с клиновидной заточкой), которое туда вполне подлезает. Как ни странно, "операция трансплантация" прошла успешно и ножка заработала как ей положено (фотография ножки крупным планом на КДПВ).


image


image


Итак, железо готово, пора перейти к коду. Хорошо бы найти готовый пример под gcc и библиотеки CMSIS. Что для этого подойдет лучше, чем официальный сайт производителя? Как оказалось, STmicroelectronics не разделяют моего оптимизма. То, что навигация на сайте сделана через неприличное место — уже привычно, сейчас трудно найти сайт, сделанный людьми для людей. Но они не позволяют ничего с сайта скачать! Возможно, позволили бы после регистрации, но у меня и раньше не было желания регистрироваться где попало, а после такого отношения к разработчикам — и подавно. На кой ляд вам моя почта или что вы там требуете? Собирать персональные данные, спам слать? Идите лесом, а я в свободном доступе найду! Кстати, немного удивило что соответствующего пакета не оказалось в репозитории, но, возможно, ST придумали какой-то лицензионный геморрой. Посему шлю лучи поноса маркетологам, придумавшим такую политику, да и за неудобный сайт тоже.


Как бы то ни было, библиотека прекрасно нашлась на просторах интернета (ссылки давать не буду, мало ли что с сайтом случится). Альтернативный вариант — скачать среду разработки или CubeMX, где эти библиотеки вшиты. Правда, скачать их с официального сайта точно так же невозможно, так что ищем на сторонних и устанавливаем на виртуалку, просто на случай "если вдруг что".


С железом разобрались, с сорцами тоже. Пришло время разбираться наконец с контроллером. Первый сюрприз ждал при попытке воспользоваться сторонним кодом под Discovery. Там применен контроллер stm32l152, который на первый взгляд почти не отличается от stm32l151, установленного у меня. Помимо мелких отличий, оказалось, что в "мой" контроллер не установлен модуль ЖКИ. Немножко обидно, но я все равно не планировал им пользоваться. Хотя вот такое различие могли бы и более явно выделить, чем сносочкой в даташите. Кстати, в даташите рекомендуется в таком случае соединить вывод VLCD с питанием, у меня на фотографии соответствующий 0-омный резистор не запаян, но в реальности я его все же установил. Без него тоже работает, но не стоит перегружать внутренние соединения. Более интересным оказалось поведение часов реального времени. Они упорно не хотели работать, причем в интернете пишут просто "делай так, делай так, оно работает". А оно не работает. Кое-где, впрочем, упоминалось об "известных проблемах с RTC в данной серии". Как бы то ни было, часы все же завелись, правда, только на встроенном RC-генераторе. Попытки запстить часовой кварц приводили к бесконечному ожиданию бита готовности LSE. Я попытался проверить не отвалились ли ножки микросхемы от дорожек на плате и подергал ими в режиме обычных GPIO. Отвалился высокочастотный кварц. WTF?! В общем, вместе эти два кварца работать не желают, но хотя бы по отдельности худо-бедно функционируют.


И тут я догадался: суперклей, которым была залита половина контроллера (он ведь жидкий, его точечно не нанесешь, да и кто бы мог подумать...), дает утечку и кварцы своими наводками мешают друг другу. Ну, снаружи отскрести клей нетрудно, но ведь он затек даже под низ микросхемы. И если утечек по нему достаточно для кварцев, это ведь и на потреблении скажется. Ищу в гугле, чем люди удаляют цианакрилат. Предлагается теплая вода (что???) и диметилсульфоксид. В теплую воду я не верю, поэтому покупаю ДМСО. После более чем часового нахождения капли химиката на поверхности клея, разницы я не заметил. Зато заметили кварцы и стали работать более-менее нормально (интересно, почему? Димексид вытеснил влагу, впитанную клеем?). Впрочем, меня это не убедило, да и остатки клея все равно мозолят глаза… даром что находятся на нижней стороне платы и особо не видны. Кстати, теплая вода, которой я смывал димексид, на клей не повлияла (я не удивлен). Обнаружил, что существует такая штука, как удалитель клея, в таком же тюбике, как и сам клей, только фиолетовом. Ну хоть она-то должна сработать! Как оказалось, она может и работает, но по консистенции напоминает сметану и под микросхему просто не лезет. Ну и толку с тебя, удалитель?! Снаружи я и так почистить могу. Последний шанс: изредка упоминается ацетон. Немножко опасаюсь за пластиковые детали, но как раз их заменить несложно. Заливаю ацетон в стеклянную банку, кидаю туда плату и оставляю на ночь. Наутро выяснилось, что ацетон и правда работает, да еще как! От клея не осталось и следа. Мало того, растворился толкатель одной из кнопок. Что интересно, вторая уцелела, наверное, была сделана из более устойчивого пластика. Немного удивлен был, что и прочий пластик остался нетронутым, даже надписи уцелели. Ну и отлично, а кнопку можно и заменить.


Вот теперь удалось запустить и RTC от часового кварца, и режим сна потрогать, да и с другой периферией пообщаться. А еще, чтобы совсем фен-шуйно было, нанес подписи на плату. Но не маркером (вдруг снова купать в растворителях?) а процарапал скальпелем. На века!


Ну и для будущих поколений оставлю примеры кода для обоих контроллеров, вместе с библиотеками, makefile'ами и прочим. Останется только установить gcc-arm-none-eabi, openocd, stm32flash и прочую мелочь.
stm32f103
stm32l151


В комментариях несколько раз советовали не заниматься ЛУТом и заказать изготовление плат у профессионалов. Для прототипирования, как здесь — не вижу смысла. Другое дело, если нужны будут многослойный платы, или еще меньший шаг, или BGA-корпус, или еще что-то, что в домашних условиях сделать сложно. И, разумеется, при изготовлении финальной версии устройства и тиражировании. Нехорошо, если заказчик разберет корпус, спаянный из текстолита, и обнаружит криво отпиленню плату без маски и с перемычками из МГТФ.


Выводы:


  1. Делать отладочные платы под себя при желании можно, они не хуже покупных. А вот программатор-отладчик все же лучше купить, если он не слишком дорогой. Сделать его, конечно, можно, но схему-то вы менять не будете, а раз так — лучше покупного он не будет. Дешевле, скорее всего, тоже. Разве что если контроллер лишний остался или с доставкой проблемы.
  2. Не забывайте про резервный разъем программирования UART1, ну и заодно джамперы BOOT0, BOOT1. Помимо собственно программирования, по UART'у довольно удобно отлаживать программу.
  3. На корпусе LQFP64 два ключа, один из которых фальшивый. Ориентироваться придется на надпись чтобы смотрела ногами влево.
  4. Паять компоненты с малым шагом стоит только под микроскопом. Иначе сложно определить все ли пропаялось и нет ли "соплей". Ну либо на "профессиональном" оборудовании вроде специального фена, паяльной пасты и т.п. Тут уж не знаю, я пишу про любительскую технологию.
  5. Не экономьте на толщине текстолита. Он гнется и этого может хватить для повреждения smd резисторов и, наверное, конденсаторов. Выводным это не страшно, да и компоненты с гнутыми выводами (транзисторы, микросхемы), пожалуй, переживут.
  6. Делать разъемы для кварцев — пустая трата времени. Вы не будете их менять, поэтому просто запаяйте на плату.
  7. Выпаивать многоножку с помощью лезвия бритвы стоит только в самом крайнем случае, когда нет фена. Иначе слишком велик риск ее повредить
  8. Даже если у микросхемы отвалилась ножка, ее можно восстановить! Даже когда шаг 0,5 мм. Главное пользоваться пайкой, а не проводящим клеем.
  9. Никогда не заливайте микросхему цианакрилатным клеем (суперклеем)! Он не обладает должными электрическими, да и механическими, характеристиками.
  10. Для удаления суперклея из труднодоступных мест лучше всего подходит ацетон. Растворяет полностью. Главное убедиться что окружающие компоненты не пострадают. Из не-труднодоступных мест можно и механически удалить.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 64

    +21
    В 2002 я, будучи бедным студентом, делал такую отладочную плату для микроконтроллера AT90S2313. Но зачем это делать сегодня, когда BluePill стоит 115 руб, STLink около 100? Итого несколько кликов мышки, стоимость 1 обеда, и готов полноценный проверенный комплект разработки, который гарантированной работает.
    В конце этого текста должен быть только один пункт: купите любую из отладочных плат и быстрее начните программировать, а не занимайтесь рукоблудием.
      0
      А еще есть VisualGDB и jlcpcb.com %)
        +1

        Ощущение от проделанной работы безценно.
        А вот это вот "быстрее начните программировать" поверхностно как то.

          +1
          Ощущение от проделанной работы безценно.

          Это точно. До сих пор с замиранием в сердце вспоминаю эту свою плату. Дорожки рисовал лаком для ногтей, который взял у своей девушки. Купленный на последние деньги микроконтроллер AT90S2313 в моих глазах был настоящим компьютером уровня Радио-86РК, засунутым в крошечный корпус DIP-20.
          Но это все давно ушло, ушла эпоха радиолюбительства. Теперь эпоха алиэкспресса и проводков dupont. Эпоха, когда не нужен паяльник, вольтметр, хлорное железо. С другой стороны, теперь у вас есть возможность делать удивительные, невероятные вещи очень быстро, очень дешево.
          Что можно было сделать на той старой AVR с 2К флэш памяти и 64 байта RAM? Термометр с дисплейчиком какой-нибудь… А сейчас — автопилот самолета, интернет-радио mp3, умный дом с GPRS. Это задачи совершенно другого уровня. Сейчас важно не уметь травить платы и паять, а быстро программировать, используя наработки других людей.
          Если вы хотите быть конкурентноспособным работником, нужно уметь делать эффективные готовые решения. Эффективные прежде всего во времени разработки, стоимости, повторяемости.
        +5
        Паять компоненты с малым шагом стоит только под микроскопом. Иначе сложно определить все ли пропаялось и нет ли «соплей». Ну либо на «профессиональном» оборудовании
        Это LQFP64 то под микроскопом? 144 нормально паял вручную.
          +3
          Статья конечно, хардкорная) Я, как человек который по любому чиху привык заказывать готовую 2+ слойную плату, аплодирую)
          Ну а теперь по делу:
          1. Зарегистрироваться на сайте все таки надо. Да, они рассылают рекламу, зато можно получить бесплатный доступ к куче важной документации.
          2. К проблемам переходящих с AVR так же можно назвать раздельную документацию. В datasheet-е, в отличии от той же atmega8, только электрические характеристики и карта памяти (сюда же описания краткое характеристик периферии. Уровня максимальной частоты и прочее). А вот за регистрами уже нужно лезть в порой доходящий почти до 2500 страниц reference manual.
          3. Далее стоит отметить, что в отличии от avr, где можно в принципе жить только регистрами, тут приходится использовать оболочки. Сейчас выбор между CM3 и HAL. Последний через официальную утилиту обновляется чуть ли не раз в месяц.
          4. Ну и на последок стоит отметить, что раньше был вместо HAL популярен SPL. Так что в интернете куча статей именно по последнему. Что затрудняет новичков. Поскольку он уже не поддерживается.
            0
            Далее стоит отметить, что в отличии от avr, где можно в принципе жить только регистрами, тут приходится использовать оболочки. Сейчас выбор между CM3 и HAL


            Во-первых, не приходится, и можно совершенно спокойно жить только регистрами, ничего страшного в них нет.

            Во-вторых, CM3 процентов на 80 представляет собой заворачивание одиночных обращений к регистрам в простенькие функции, и от работы напрямую с регистрами в этой своей части особо не отличается.
              0
              Во-первых, не приходится, и можно совершенно спокойно жить только регистрами, ничего страшного в них нет.

              Да, согласен. В домашних проектах нормально. Можно. Но в продакшене, увы. Когда просят «эзернет за 2 дня», то уже нет времени вдумчиво сидеть и работать с регистрами, которых порой более 500 на модуль… Чего стоит настройка DMA2D+LTDC например. Другой вопрос, что один раз под себя написал и пользуешь. Но на это, опять же, нужно время.
              Во-вторых, CM3 процентов на 80 представляет собой заворачивание одиночных обращений к регистрам в простенькие функции, и от работы напрямую с регистрами в этой своей части особо не отличается.

              Так же согласен. Но все же помогает как-то абстрагироваться.
                +5
                Но в продакшене, увы. Когда просят «эзернет за 2 дня»


                Во-первых, «эзернет за два дня» — это не продакшен, это быстро сляпать на коленке. Если у вас такое идёт в продакшен — мои вам искренние соболезнования. Ни один пригодный к практическому применению проект за два дня не делается.

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

                В-третьих, у вас инструментарий какой-то наработанный есть, или вы только на коленке ляпаете? RTOS, библиотеки? Внутри них — магия или таки регистры?

                Так же согласен. Но все же помогает как-то абстрагироваться.


                Абстрагироваться от чего и зачем?
                  0
                  Во-первых, «эзернет за два дня» — это не продакшен, это быстро сляпать на коленке. Если у вас такое идёт в продакшен — мои вам искренние соболезнования. Ни один пригодный к практическому применению проект за два дня не делается.

                  Про «2 дня», конечно, утрирую (хотя опыт поднятия eth за 2 дня действительно был. Правда это на скорую руку было и действительно потом пришлось писать в течении двух недель нормально. Чтобы стыковалось со всем наработанным API). Просто обычно занимаешься несколькими проектами и нет особо времени капаться.
                  Во-вторых, если в сляпанном на коленке коде у вас что-то работать не будет — а в любом минимально сложном проекте вы с этим рано или поздно встретитесь — без понимания работы на уровне регистров чёрта с два вы разберётесь, что не так.

                  Само собой нужно понимать что происходит. Поскольку HAL не идеален и нужно быть готовым в случае чего поправить.
                  В-третьих, у вас инструментарий какой-то наработанный есть, или вы только на коленке ляпаете? RTOS, библиотеки? Внутри них — магия или таки регистры?

                  Да понятно, что есть наработки и как правило написание прошивок под МК скорее напоминает конструктор на основе когда-то правильно спланированной архитектуре.
                  Абстрагироваться от чего и зачем?

                  От железа. В идеале, когда в проекте есть класс bsp (при условии, что пишете на С++), который предоставляет данные с датчиков и прочие сигналы из вне, а так же позволяет выводить сигналы во внешний мир (pwm, uart,,,) через приятные прослойки.
                    +2
                    libopencm3 не обеспечивает абстракции от железа.
                    0
                    В случае верной архитектуры появляется возможность вообще работать с абстрактным железом, которые при необходимости заменяется подменой одного класса (ответственного за взаимодействие с конкретным устройством). Это, кстати, очень помогает производить тестирование (если в проекте заложено время под тесты в принципе).
                      0
                      Мне кажется что когда появятся проблемы, тогда и можно лезть в кишки либы, а начинать с писания собственного велосипеда на регистрах — а зачем? Цель ж чтобы работало, а не чтобы все до байта самописно было.
                        +1
                        В любом минимально сложном проекте проблемы появятся очень быстро.

                        Собственно, не столь давно в меня прилетел проект на вышеупомянутом libopencm3 — при всей простоте библиотеки, в кишки ей пришлось лезть практически сразу просто чтобы уточнить, что именно оно тут делает.
                          0
                          Ну да, и свой код придется отлаживать сразу после написания. Но тут уже все написано за нас. Велосипеды в подавляющем большинстве случаев не помогают, не экономят, и только добавляют граблей и боли.
                            +3
                            Как только покажете мне библиотеку, в которой всё написанное до нас работает правильным, очевидным и документированным образом — сразу же начну ей пользоваться.

                            Пока что я таких не встречал.
                              0
                              А такого кода не бывает. И велосипед таким тоже не будет.
                                0
                                Но велосипед поможет понять основы и найти возможные ошибки…
                                Имхо, велосипед нужен начинающим, которые хотят поднять свой уровень…
                      0
                      Но в продакшене, увы. Когда просят «эзернет за 2 дня», то уже нет времени вдумчиво сидеть и работать с регистрами

                      Это называется херовая культура разработки, когда лишь-бы сделать быстро, не важно как. К сожалению, во мноких конторках практикуется, но это не значит, что это норма.
                        0
                        Это называется херовая культура разработки, когда лишь-бы сделать быстро, не важно как. К сожалению, во мноких конторках практикуется, но это не значит, что это норма.


                        Да понятное дело, что не норма. Однако распределение времени это уже дело не разработчиков, а начальства. Если скажут «за 2 часа» — будет за 2 часа. Скажут «тщательно продумать на будущее» — будет, условно, за 2 месяца.
                  +8
                  Что за...? Ладно такие платы и пайку показывать будучи учеником 5-6 класса, но вроде взрослые люди, не уже ли вы сами не видите что сделали откровенное гуано? Зачем его показывать на хабре?

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

                  Паять компоненты с малым шагом стоит только под микроскопом
                  Паяю микры 3х2 мм без микроскопа, наверное я помазанник божий на этой земле? А если серьезно, то хороший флюс и паста позволяют обойтись без микроскопа и паять любым топором.
                  Еще есть финт ушами — сначала обильно залить ноги припоем, а затем лишнее удалить с помощью оплетки. Получается идеальная пайка.

                  Паять компоненты с малым шагом стоит только под микроскопом. Иначе сложно определить все ли пропаялось и нет ли «соплей»
                  А еще можно научиться паять и не приплетать микроскоп в каждом предложение.

                  я пишу про любительскую технологию.
                  Ага… то есть если у человека есть фен и паяльная паста за 100 рублей, то он автоматом из любителя превращается в профессионала?

                  Никогда не заливайте микросхему цианакрилатным клеем (суперклеем)!
                  Лучше расскажите как до такого можно было вообще додуматься и как избежать такой участи.
                    +3
                    Я вот тоже не понял — зачем там клей под микросхемой? Чтобы она при пайке не «уползла»?
                    Дык микрухи всегда паяют методом «Припаял одну ногу, выровнял, припаял противоположную (Диагонально расположенную), подровнял прогревая первую, запаял остальные»…
                      0
                      Перечитайте «квест» с восстановлением отломанной ноги: автор поначалу приклеил ее проводящим клеем, а поверх, для пущей прочности и надежности, «наляпал» циакрина.
                        +1
                        Для крепления различных проводников всегда использовал цапонлак, вроде ни разу с ним не было проблем. В любом случае его можно легко снять, растворителем и/или нагреть феном.
                        А цианакрилатом совсем не люблю пользоваться, только в крайнем случае.
                      0
                      Паяю микры 3х2 мм без микроскопа, наверное я помазанник божий на этой земле?
                      От остроты зрения зависит. Я в 30 лет свободно паял 0201 и шаг 0.65 без лупы, а когда охреневшие американцы сказали на митинге, что это невозможно сделать вручную, надо паять у них и слать плату в РФ, сказал, что уже запаял и иронически поблагодарил за то, что поздно сказали. А сейчас даже для 0805 использую лупу с подсветкой. Глаза. Не надо судить по себе. У Вас глаза, скорее всего, тоже не будут 1 до старости.
                      Навыки, описанные в статье, безусловно, полезны, если человек сидит в госНИИ где-нибудь в Норильске, где умучаешься согласовывать покупку и ждать доставку. Или вылетает для пусконаладки-ремонта «в поля», опять же, неблизко от основных логистических потоков, а работать должно вчера. Для разработчиков из Штатов и даже из городов-миллионников в exUSSR описанное, конечно, выглядит дико — столько уметь и тратить бешено дорогое рабочее время на повторение копеечных плат, массово выпускающихся китайцами.
                        +3
                        От остроты зрения зависит
                        Зависит это не от зрения, а от того прогуливал ли физику на 1-м курсе или нет. Есть такая магия — силы поверхностного натяжения. Достаточно намазать пальцем паяльную пасту, поставить примерно микросхему и нагреть, эти «магические» силы сами отцентруют микросхему.

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

                        Для разработчиков из Штатов и даже из городов-миллионников
                        А почта и курьеры есть только в миллионниках? Несколько лет жил в городе с населением 250к на Севере и никаких проблем не испытывал с покупкой печатных плат за пару баксов, да и доставка прекрасно и быстро работала. Не думаю, что в Норильске с этим хуже.
                          –2
                          Зависит это не от зрения, а от того прогуливал ли физику на 1-м курсе или нет
                          Невозможно спозиционировать QFP с мелким шагом на плате, если дорожек не видно глазами. «Примерно» — так же по физическим законам ножки чипа прекрасно встанут между дорожек, и дорожки будут мешать им сдвинуться на правильное место. Так и припаяется.
                          Про почту и курьеров… Попробуйте как-нибудь, интереса ради, заказать срочную доставку в станицу Ханская, возле Майкопа — всего 300км от Краснодара. У меня-то получилось, надо было больному ребенку знакомых конструктор Лего туда доставить на ДР из интернет-магазина, но я с логистикой достаточно много работаю, у меня хватило навыков и терпения найти через три переадресации человека, который снизошел за 500р в свой карман доехать туда на личном авторанспорте после работы и вручить. Обычный электронщик вряд ли смог бы пройти этот путь, там люди попадались… своеобразные.
                          Норильск, кстати, я зря привел в качестве примера — туда хоть самолеты летают. А вот если небольшой населенный пункт — то прямо беда.
                            –2
                            эти «магические» силы сами отцентруют микросхему
                            QFP так не отцентрируется, особенно многовыводная, особенно если (не)много флюса под корпус затекло. А вот QFN вполне центрируется, но если размер большой, то тоже может не встать из-за большого центрального пятака. Вспомните ту-же физику и вязкость жидкости.
                              +2
                              QFP так не отцентрируется
                              Да ну? LQFP-208 отлично центруется с легким перегревом и крем-флюсом. QFN центруется даже без флюса, на одной пасте.

                              Невозможно спозиционировать QFP с мелким шагом на плате, если дорожек не видно глазами
                              Ну тогда статья точно нужна на хабре. Только зачем она в хабе схемотехника и МК? Ни программирования, ни схемотехники тут нет. Ей место в «Здоровье гика», т.к. рассказывает что делать если ты рукожопый и хирург не смог выпрямить руки.

                              А вот если небольшой населенный пункт — то прямо беда.
                              Если в нем есть Почта России, то и EMS туда таскает. Если надо совсем срочно, то прыгаешь в машину и едешь до ближайшего города, в тот же Майкоп. У меня достаточно знакомых живущих в жопе мира и все они спокойно себе заказывают и с алишки, и со всяких jlcpcb и с ЧиДа. Видимо нужно только захотеть сделать хорошо, а не как в статье.
                        +11
                        Правда, скачать их с официального сайта точно так же невозможно
                        Осторожно! Вы в одном шаге от того, чтобы отморозить уши назло маме.
                          +5

                          Относительно первого пина: я в datasheet’е вижу пачку пинов с названием VSS_x. Практика показывает, что все земли внутри обычно объединены, а всё остальное (кроме питаний, но это когда как — они могут и к разным доменам относится) — нет, поэтому когда ножка земли не одна (она не одна), и когда ножки земли расположены несимметрично (а сторона с ножками 17…32 — единственная, у которой есть по земле на второй с начала и второй с конца ножке), то тогда можно понять, где первый пин, прозванивая несимметричные земли.


                          Ну и ещё, google «stm LQFP64 determine first pin» на первой же странице выдаёт мне ссылку https://electronics.stackexchange.com/questions/123703/which-of-these-marks-signifies-pin-1-on-the-stm32f-lqfp64, где есть как минимум три полезных совета:


                          1. Смотреть на меньшую точку.
                          2. Если повернуть текст так, чтобы надпись читалась, то первый пин слева‐снизу (кстати, у вас написано, что справа‐сверху, так что кто‐то ошибается; скорее всего, вы, т.к. в datasheet нарисовано то же самое).
                          3. Если прозвонить тестером земли, то всё станет понятно.
                            +8
                            где есть как минимум три полезных совета
                            Зачем куда-то идти? В даташите прям для самых «одаренных» есть картинка, где показано расположение точки относительно текста. Как можно быть такими… невнимательными.
                              +6
                              Из-за «принципиальной позиции» автора:
                              Но они не позволяют ничего с сайта скачать! Возможно, позволили бы после регистрации, но у меня и раньше не было желания регистрироваться где попало, а после такого отношения к разработчикам — и подавно.
                              заглянуть в документацию, как поступает большинство «не столь принципиальных» людей, для него было проблематично.
                                +6
                                Есть только одно «но» — документацию ST совершенно спокойно отдаёт без регистрации, можно вообще название нужного чипа вбить в гугль, и с большой вероятностью попасть на прямую ссылку на PDF.

                                Регистрации требует скачивание софта.
                                  +1
                                  Google, скорее всего, приведет к product specification и datasheet, у ST, помимо этого, есть масса другой полезной информации, позволяющей избежать (как минимум — спрямить) хождения по граблям. Применительно к описываемому в статье случаю — автору сильно повезло, что с такой разводкой проблемы с кварцами решились отмывкой соплей (да и неизвестно — полностью решились ли). Как минимум стоило бы почитать Oscillator design guide for STM8AF/AL/S
                                  and STM32 microcontrollers
                                  . Впрочем, уж Вам то это объяснять не требуется.
                                    +2
                                    Вся документация у ST доступна без регистрации и СМС.

                                    Ну а гугл приведёт к тому, о чём его просить — «stm32l151 reference manual» даёт, например, прямую ссылку на RM0038 в первых строках (и это сильно быстрее, чем тыкать в ST'шный сайт, особенно после его редизайна).
                                      +2
                                      Google, безусловно, приведет к тому, о чем его попросить. Но о существовании многих документов, помимо datasheet и reference manual можно просто не догадываться.
                                      По поводу новой версии сайта — согласен, несколько непривычно. Увы, придется привыкать.
                              0
                              2. Если повернуть текст так, чтобы надпись читалась, то первый пин слева‐снизу (кстати, у вас написано, что справа‐сверху, так что кто‐то ошибается; скорее всего, вы, т.к. в datasheet нарисовано то же самое).

                              Спасибо за исправление, внесу его в статью.
                              3. Если прозвонить тестером земли, то всё станет понятно.

                              Тоже хороший совет, добавлю как способ, которым можно воспользоваться
                              +8
                              Если кратко:
                              1. Читайте даташиты
                              2. Используйте материалы по назначению (читайте описание)
                              3. Ручное изготовление плат — прошлый век.
                                +16
                                Набросились на человека. Просто рассыпал и собрал ногами и головой грабли, но он старательно задокументировал и указал, где можно наложить и найти грабли головой.
                                Натуральный естествоиспытатель! Уважение!
                                  0
                                  Ну это как если назвать себя первооткрывателем и пойти исследовать неизведанные места западного Бирюлево. Аккуратно документировать какие там люди живут и какие дома строят, выживать, ловя ворон самодельными силками и стреляя по крысам из самодельного лука.
                                  Круто, наверное, но зачем?
                                  +2
                                  А программирование через SWD чем не устаивает?
                                  И быстро, и ног минимум, и перемычки дергать не надо.

                                  Что касается программатора: у меня одна древняя rapberry pi программирует, и avr, и stm, и общается с ними по uart и i2c. причем по wifi — к компутеру ничего цеплять не надо.

                                  Ну и наберите в гугле что-нть типа «temporary email»
                                  кучи сайтов предлагают одноразовые случайно сгенерированные email-ы.
                                    +5
                                    еще там 256 кБ флеша, но слабо представляю чем его можно забить. Разве что совсем диким говнокодом или массивами данных

                                    Мне бы ваши проблемы. Я вот в мегабайт оперативки (STM32H7) с трудом вмещаюсь. И 300к флэш на прошивку. Все просто — большие матрицы (GNSS) и куча кода для математической обработки. Примерно так же — в любом GNSS-приемнике, только мы одновременно обрабатываем данные с нескольких антенн.

                                    Параллельно делаю из запасной stm32f103 программатор st-link v2
                                    А не проще купить за 200 рублей?

                                    Правда, скачать их с официального сайта точно так же невозможно
                                    Вот ссылки: STM32CubeIDE , STM32CubeMX. Внизу есть кнопочка «Get Software». Регистрироваться, разумеется, придется.
                                      –1
                                      Мне бы ваши проблемы. Я вот в мегабайт оперативки (STM32H7) с трудом вмещаюсь. И 300к флэш на прошивку. Все просто — большие матрицы (GNSS) и куча кода для математической обработки.

                                      Про оперативку согласен на 100%: ее всегда не хватает. Собственно, «подопытный» контроллер я и выбирал в первую очередь за ОЗУ и потребление, а вовсе не за выводы или флеш.
                                      Но и про флеш согласен с вами: забить туда константы, препрощитанные данные и тому подобное — логичный и правильный подход. Уж точно более правильный, чем забивать то же место говнокодом :)
                                      А не проще купить за 200 рублей?

                                      Объективно — проще. Да я об этом и в выводах написал. Но вот захотелось сделать вручную. Тренировка в изготовлении плат, если хотите.
                                      Вот ссылки: STM32CubeIDE, STM32CubeMX. Внизу есть кнопочка «Get Software». Регистрироваться, разумеется, придется.

                                      И об этом я писал. Скачать весь этот софт без регистрации точно так же невозможно, как и библиотеки. Но его проще найти на просторах интернета, а если кто боится венерических «подарков», которые к нему могут подложить, то виртуальная машина стерпит.
                                        0
                                        Про оперативку согласен на 100%: ее всегда не хватает.


                                        В абсолютном большинстве проектов мне хватает 20 КБ ОЗУ, ЧЯДНТ?
                                          +1
                                          Не воспринимайте настолько буквально. Разумеется, бывают задачи, где узкое место не в оперативке. Разумеется, всегда можно добавить оптимизацию или, в крайнем случае, поставить внешнюю ОЗУ. Но ведь нередки и задачи, где кэширование результатов увеличивает быстродействие.
                                          Да чего ходить за примером: в статье есть видео с трехмерной графикой. Экран 320х240х16, то есть 150кБ. Это уже далеко за пределами 20кБ памяти stm32f103, а ведь еще хорошо бы задний буфер, да буфер глубины, и данные моделей хранить где-то надо.
                                            0
                                            Почти во всех задачах узкое место не в оперативке.
                                            0
                                            Значит проекты у вас «детские». Мы одновременно принимаем до 27 спутников (12 GPS+8 ГЛОНАСС + 6 GALILEO + 1 SBAS), так что расчет на 32 спутника — нормален. Тем более, что через пару лет будет приниматься до 14 GALILEO.

                                            Считаем 32 спутника на 2 измерения (код+фаза) = 64. Матрица 64*64 = 4096 элементов. Размер элемента минимум 8 байт (double) (СКО шума фазы 1 мм, величина — 2*10^11 мм, во float никак не лезет). Так что 32 килобайта на одну матрицу. А их надо десяток одновременно.

                                            Вы попробуйте, найдите современный GNSS-приемник с ОЗУ/ПЗУ меньше 256/256. Обычно — больше. Вон, смотрю на размер прошивки ZED-F9P — мегабайт.
                                              +3
                                              Мне ваши выступления каждый раз напоминают одну картинку:



                                              Вы вообще в курсе, что в мире довольно много электроники помимо GNSS-приёмников? И что у большинства людей не стоит задача делать GNSS-приёмники? Ну или что GNSS-приёмники даже не являются вершиной эволюции электроники?
                                                0
                                                Что вас так на туалетную тематику тянет? Энурез, что ли?

                                                Ваш случай (2 грубых костыля на 5 строк кода) нетипичен.

                                                Ну или что GNSS-приёмники даже не являются вершиной эволюции электроники?
                                                Согласен, есть много более крупных задач. Сейчас тренд такой: если вам linux нужен как запускалка — выкиньте его. И вместо трех корпусов получите один SoC. То есть вместо 16Мб ОЗУ + 16Мб ПЗУ — будет 1Мб ОЗУ + 2Мб ПЗУ. Но для очень многих задач этого хватает. Не хватило — есть SoC c 13Мб ОЗУ. Как ни странно, но если вам не нужен полномасштабный TCP/IP, linux — это огромный монстр.

                                                Так что сравнивайте 1Мб ОЗУ не с примерами на 5 строчек, а с тем, что нынче болтается на linux. В ближайшие 10-15 уйдет оно уйдет на SoC.

                                                Разумеется, мелкие задачки «на 5 строчек» никуда не денутся и кому-то надо их делать. Вплоть до AVR и PIC с их считанными байтами ОЗУ.
                                                  +4
                                                  Согласен, есть много более крупных задач. Сейчас тренд такой: если вам linux нужен как запускалка — выкиньте его. И вместо трех корпусов получите один SoC. То есть вместо 16Мб ОЗУ + 16Мб ПЗУ — будет 1Мб ОЗУ + 2Мб ПЗУ. Но для очень многих задач этого хватает. Не хватило — есть SoC c 13Мб ОЗУ. Как ни странно, но если вам не нужен полномасштабный TCP/IP, linux — это огромный монстр.


                                                  Вы отдаёте себе отчёт, что вы увлечённо беседуете сами с собой?..
                                            0
                                            Но его проще найти на просторах интернета

                                            У нас с вами невероятно разное определение слова «проще»
                                              0
                                              Но и про флеш согласен с вами: забить туда константы, препрощитанные данные и тому подобное — логичный и правильный подход.
                                              У нас — именно код. 5 мегабайт исходников — это довольно много.

                                              Скачать весь этот софт без регистрации точно так же невозможно,
                                              И чем вам так страшна регистрация? Вы ядерное оружие делаете? На космос работаете? Засекреченный китайский шпион?
                                            +10
                                            зато будет что внукам рассказать. мы воевали как могли, у нас был только штык (паяльник), я потерял ногу, но приклеил её на клей. потом она снова отпала, пришлось все таки припаивать…
                                            легендарно!
                                            в статье правда ожидал что нибудь про программирование увидеть.
                                              +14
                                              — Интернет раньше нужно было покупать по карточкам, но по ночам с 2 до 7 он был бесплатный, только дозвониться было сложно.
                                              — Куда?
                                              — В интернет.
                                              — Мам, кажется, дедушка опять свои таблетки забыл принять.
                                              +4

                                              Левша танцевал на граблях, но блоха таки была подкована)

                                                +4
                                                Позволю себе дать несколько советов…
                                                1. Собери нормальный паяльник. Загугли про жала T12, мне моя станция обошлась (вместе с корпусом) примерно за 2к руб. Паять станет намного комфортнее, пайка получится намного красивее. Из типов жала тебя в первую очередь интересует тип «K», начинай с него.
                                                2. Купи самый дешевый флюс-гель. Продается в шприцах по 10/30 грамм. Про канифоль забудешь сразу. Отмывать не обязательно, пай получается намного более красивый. При правильной температуре качество пая от фабричного отличить невозможно. Для пайки МК сойдёт даже самый дешевый, но я использую NC-D500, тюбик покупал что-то около 300 рублей, хватает для любительской пайки на год.
                                                3. Заказывай платы прототипов на алиэкспрессе. Трассируешь прототипы для 5-10 моделей, формуешь в один лист, делаешь гербер, пишешь китайцу. Цена около 1 доллара да кв. дециметр (давно не заказывал, цена могла поменяться). На муське есть несколько обзоров. Постепенно это входит в привычку — делать проекты сначала теоретически и сохранять всю информацию, а как приходят платы — уже в железе. В итоге тренируешь свою фантазию, чтобы всегда был «поток».
                                                4. Заказывай производство небольших корпусов или стендов на 3D-печать, самым дешевым пластиком получается весьма недорого, зато удобство зашкаливает. Да и выглядит уже не колхозно, есть чем похвастаться. Мускулиные мужицкие платы на коленке — это тоже круто, но когда есть красивый прототип — уже совсем другой уровень, чувствуется творение.
                                                  0
                                                  не ради реклама, а только ради того что бы автор не страдал
                                                  смотрим пару туторов по алтиуму(игл)
                                                  рисуем плату
                                                  заказываем на allpcb
                                                    0
                                                    Комментарии наверняка читают новички в stm32, я недавно сделал пример хорошего проекта с libopencm3 без IDE и т.п. github.com/vikaig/stm32-libopencm3-meson-blink это должно вам неплохо помочь ибо мне в начале пришлось через грабли к этому приходить и потратить немало времени на «идеальный» шаблон проекта.
                                                      0
                                                      Прекрасное руководство как не надо. Будучи разработчиком с опытом, от всех усердно описанных проблем автора можно закатиться под стол, от смеха. Потом, конечно, ловишь себя на мысли, что городил подобные огороды сам, когда познавал азы.
                                                      Автору "+" за усердие.
                                                      Нам "-" за мизерное количество стоящих статей о мире встраиваемых систем.
                                                        0
                                                        Странная статья, с одной стороны интересно, нос другой как будто специально все грабли собраны. Во первых зарегаться на сайте ST всё же стоит — там много интересного, а спам они практически не шлют, письма 3 за год. Во вторых почему бы не купить ST-Link у китайцев за 150р и шить им — поверьте, на много удобнее чем UART. Ну и в третьих — почему не используете нормальную среду разработки? Есть полностью бесплатный EmBitz, есть условно бесплатный Atollic. Ну и на мой взгляд для изучения лучше брать готовую отладочную плату и думать только о софте.
                                                          0
                                                          Насчёт спама от СТ. Шлют всё же почаще чем 3 раза в год, но большей частью это вполне годные информационные материалы, которые не грех прочитать даже по диагонали.
                                                          0
                                                          На кой ляд вам моя почта или что вы там требуете? Собирать персональные данные, спам слать?


                                                          Уже давно держу отдельной email как раз для таких товарищей. Никогда не читаю, но там уже больше 100K писем.
                                                            0
                                                            По мне, дык весьма отличный старт!
                                                            Человек сам сделал девборду и знает где раки зимуют, в отличие от тех, кто к железу не притрагивался.
                                                            Великолепно для начала, у всех бы так!

                                                            Only users with full accounts can post comments. Log in, please.