Как стать автором
Обновить

Комментарии 85

Да, но это не форм-фактор Raspberry Pi. Разъемы GPIO расположены не так (опять же порядок пинов не соответствует таковому в Raspbery), нет порта дисплея, нет Ethernet и USB A Female разъемов на своих местах, хотя STM32F4 это все умеет.
PS Фото форм фактора Raspbery PI 3 для примера
image
Автор ставил задачу уместиться в корпус малинки, а не сделать совместимую по выводам.
«форм-фактор» — это не только «уместиться в корпус».

Я бы не стал так категорично обобщать. Если мы говорим, к примеру, о форм-факторе mini-ITX,
то сравните, пожалуйста, две платы: эту
и эту.
Другое дело, что Raspberry Pi — это не только форма, но и много интересных плюшек. На данном этапе, я просто не стал реализовывать их все.

Учитывая большую свободную площадь на плате — слишком мало переферии и действительно ничего не мешало сделать…

Я в самом начале работы думал над этим и с Вами согласен, но только частично. Например, RPi3 имеет на борту аж 4 USB разъёма. Лично я не уверен, что 4 разъёма действительно нужны на подобной плате. Проводная сеть нужна, наверное. Но тут нужно иметь ввиду, что придётся тянуть в код весь TCP/IP стек, чтобы его использовать. Но, как бонус, можно сделать PoE. Сдвоенная гребёнка GPIO на 40 контактов тоже не совсем практична, так как у контроллера в корпусе LQFP64 40 свободных пинов для неё наберётся с трудом. В будущем я думаю сделать вариант с LQFP100, тогда можно будет сделать GPIO, как на RPi3.

USB можно было бы и 1 вывести (USB Host) но на то же место, где он у Raspberry. Ethernet поднимается легко, если использовать LwIP. Но желательно к Eth добавить еще и внешнюю RAM. А вот гребенка GPIO на 40 контактов — это то, что сделало бы плату совместимой с уже готовыми модулями для Raspberry (но для этого необходимо сделать вывод аппаратных интерфейсов SPI, I2C и пр на те же пины, что у малинки). Я бы взял для этого всего STM32F407IGT6 у нее и ног хватит и интерфейсы все есть.

Вы предлагаете уже высший пилотаж — LQFP-176. Мне хотя бы на LQFP-100 перейти, уже будет большим достижением для меня.

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

Разница? Развести это всё богатсво на двухслойной плате. Я не уверен, что у меня LQFP100 получится на этой площади развести. По уму, так нужно бы на четырёхслойную топологию переходить...

Так в чем проблема? На jlcpcb.com 10шт. таких плат в 32$ встанут, еще за 7 сверху и трафарет для пасты сделают)
Разведется, никуда не денется, а вот на 4 слоя перейти было бы большим плюсом, и проще и с питанием проблем не будет. лишняя переферия сейчас хоть и не нужна, но в будущем пригодится. а на гребёнку можно вывести все пины, не обязательно свободные
Тогда уж STM32F746 или STM32L4Rxx — существенно больше возможностей, кроме того последние содержат 640к RAM, что практически полностью снимает потребность во внешней RAM

Я тоже на эту серию (F476) уже поглядываю. Если переходить на 100-ножечный вариант, то этот контроллер, действительно, неплохой выбор.

Уже H7 и L4+ есть.

Я буквально неделю назад документацию на H7 изучал. Весьма достойный контроллер, только вот цена кусается — в среднем в два раза дороже, чем F405.

Да, H7 весьма современное и достойное решение (если говорить о cortex-m ядре). Богатая периферия (уже и qspi умеет, и прочее, и прочее). Мы на нем чуть проект не запилили, правда, выяснилось, что производительности нам все же не хватает, и в итоге выбрали SoC на Cortex-A9, впрочем, это совсем другая история… =))
inline void setHandler (EventHandler * _handler)


Насколько я помню, inline при реализации метода внутри объявления класса не нужно писать — эти методы и так inline.
Моё ИМХО — в принципе, можно было взять 407-ой в 100-ногом корпусе и тогда бы можно было добавить Ethernet. Ну и внешнюю оперативку заодно. Хотя в форм-фактор влезть было бы труднее.

Полностью согласен, выше я как раз об этом написал. Переход на LQFP100 с одновременным уменьшением размера пассивных компонент до 0603 в планах, но вот начало реализации этого плана я ещё не запланировал.

Спасибо, отличный материал.

А опыт конкретного применения будет?

Надеюсь, что да. У меня в доме установлены Zwave датчики на окнах, красивые, но не работают совершенно в силу большого расстояния до базы. Промежеточные усилители тоже не помогают. Хочу протянуть провода, корпуса датчиков оставить, начинку поменять, и на каждом этаже сделать свой блок на базе этой платы. Уже отлажено всё: сама плата, датчики, прошивка, серверная часть, клиент для Андроида. Осталось только провода по всему дому протянуть. То есть как всю систему запущу и настрою, так и напишу.

Отлично, будем ждать результата.
Что же вы везде куда не нужно пихаете этот недоязык? Тут место Форту.
Любой объект(язык, контроллер и т.п.) будет «недо», когда нет устойчивых знаний по нему.

Может быть вы и ОС на Форт переведете?
Тем, кто знает больше чем С++ очевидно. что таки «недо».
Умная мысль
C++ — кошмарный язык. Его делает ещё более кошмарным тот факт, что множество недостаточно грамотных программистов используют его, до такой степени, что оказывается намного проще выкинуть его как мусор. Откровенно говоря, даже если нет *никаких* причин для выбора Си, кроме того чтобы держать C++-программистов подальше — то одно это уже будет достаточно веским основанием для использования Си.
…Я пришёл к выводу, что *действительно* предпочту выгнать любого, кто предпочтёт вести разработку проекта на C++, нежели на Си, чтобы этот человек не загубил проект, в который я вовлечён.
C++ приводит к очень, очень плохим проектным решениям. Неизбежно начинают применяться «замечательные» библиотечные возможности вроде STL, и Boost, и прочего мусора, которые могут «помочь» программированию, но порождают:
— невыносимую боль, когда они не работают (и всякий, кто утверждает, что STL и особенно Boost стабильны и портируемы, настолько погряз во лжи, что это даже не смешно)
— неэффективно абстрагированные программные модели, когда спустя два года обнаруживается, что какая-то абстракция была недостаточно эффективна, но теперь весь код зависит ото всех окружающих её замечательных объектных моделей, и её нельзя исправить, не переписав всё приложение.
Другими словами, единственный способ иметь хороший, эффективный, низкоуровневый и портируемый C++ сводится к тому, чтобы ограничиться всеми теми вещами, которые элементарно доступны в Си. А ограничение проекта рамками Си будет означать, что люди его не выкинут, и что будет доступно множество программистов, действительно хорошо понимающих низкоуровневые особенности и не отказывающихся от них из-за идиотской ерунды про «объектные модели».
… когда эффективность является первостепенным требованием, «преимущества» C++ будут огромной ошибкой.(с) Линус Торвальдс,

Ну и ссылка.
Вообще-то стандартная реализация форта включает в себя ОС и IDE. Занимает это все килобайт 12 ОЗУ. Такой уж язык, создан для работы на голом железе.
Будем благодарны, если напишите статейку: «STM32 на форте — это просто!»
Ну, почти C++. А насчет Форта — аргументируйте. =)

Программирование — это же не только язык. Это и среда разработки, библиотеки, отладчики, документация, сообщество. В какой IDE лучше всего программировать на Форте? Под какие конкретно модели контроллеров уже есть библиотеки, где реалирована поддержка SD карт, файловая система, USB и прочие высокоуровневые протоколы и интерфейсы? Может, действительно напишите туториал, как начать программировать STM32 на Форте?

Я бы с удовольствие написал, но увы — хронически страдаю корявостью слога. А сред разработок навалом. Для контролеров как раз больше всего на Форте написано языков. Особенно хорош шитый Форт. Он маленький и шустрый. И запрограммировать на нём можно то, что на плюсах физичеси не возможно реализовать. А для STM32 есть среда m3Forth. Кстати не спроста он в кассовых аппаратах, на борту Аэробуса, Хаббле и много где ещё в спутниках. Без всякого С++.

Например, что физически невозможно сделать в Сдваплюса?


Кстати не спроста он в кассовых аппаратах, на борту Аэробуса, Хаббле и много где ещё в спутниках.

Не аргумент.

Нельзя расширять язык средствами самого языка. Так же у Форта есть возможность самомодификации кода.
Желательно примерчик, причем какой-нибудь полезный.
А вы напишите, как сможете. Лично я готов даже помочь с правкой слога. =)
Для отсчёта времени здесь используется не HAL_GetTick, который в силу своего типа (uint32_t) сбрасывается по переполнению каждые 2^32 миллисекунд (каждые 49 дней). Я реализовал собственный класс RealTimeClock, который отсчитывает миллисекунды со старта программы, или включения контроллера, как uint64_t, что даёт примерно 5^8 лет.

Какой в этом смысл? Получается, что у вас два счетчика аптайма, ваш и системный? Хорошо когда памяти много!

Если устройство работает гарантированно меньше 49 дней, то смысла нет. Если это что-то, что должно работать в режиме 365/7/24, то Вам точно нужно периодическое переполнение системного таймера и целый спектр проблем, с этим переполением связанный?

О каком "спектре проблем" идёт речь?

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

Именно. В этой статье есть ключевая фраза: "если работа с HAL_GetTick реализована корректно". Пока мы только вычитанием, как в этой статье, то всё в порядке. Но я, например, иногда испытываю непреодолимое желание использовать значения таймеров в условных операторах, и вот там и есть засада.

В этой "ключевой" фразе как раз и кроется причина моего вопроса: почему вместо корректной работы с системным таймером нужно городить огород с оверхедом по памяти. И, кстати, за сколько тактов инкрементится двухбайтное число? Я всё ещё не вижу никаких плюсов. Если дешифровка у вас там происходит давольно часто, а переполнение происходит раз в 49 дней… чорт, я всё ещё не вижу проблемы, которую вы решаете.

Наверное, Вы правы. Похоже, я решил надуманную проблему. Ресурсы этого контроллера (частота и память) позволяют не задумываться о таких мелочах, вот я и сделал, так как мне казалось это удобным.

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


Кстати, почему у вас везде интерфейс I2C называется I2S?

Ну, это разные интерфейсы. I2S (Inter-IC Sound) — это программно-аппаратная надстройка над SPI, которая сама, например, осуществляет подбор тактовой частоты и управление каналами в зависимости от аудио-протокола и битрейта. I2C — это более универсальная штука.

А, понятно.

Кстати, многие звуковые двоично-аналоговые преобразователи (например, тот, что стоит на Discovery) используют I2C как камандную шину и отдельно шину данных. Тот, что использую я, требует только шины данных, а общая настройка осуществляется несколькими двоичными пинами. То есть со стороны контроллера данные уходят через I2S, и командная I2C не нужна.

Для какого класса точности эта плата? Я бы увеличила зазоры между полигонами и остальным и убрала острые углы. Ну и думаю, если перераставить, то получится лаконичнее.

Ваш вопрос, к сожалению, выходит за рамки моей квалификации. И по образованию, и по сфере деятельности я математик, а данный проект — это хобби. Я примерно понимаю, о чем речь в этом вопросе, но ответить на него не могу. Вот здесь лежит файл правил для EagleCad, может быть, он поможет это сказать. Если есть желание, милости прошу переработать разводку платы и закинуть merge-request. Буду только рад такому сотрудничеству!

По другому: какова минимальная толщина линии? 0.3мм?

Сигнальные линии 0.25мм, линии питания толше. Переходные отверстия 0.5мм.

Класс точности — это не только лишь толщина дорожки, но и зазоры, расстояние между компонентами, расстояния между краем полигона и остальными элементами. Чем меньше эти расстояния, тем дороже производство печатной платы =) ну, и думаю что можно подобрать компоненты подешевле. Так же лучше смотреть на диджикее цены, а не маусере. К сожалению работаю в другом ПО, а переносить весь проект довольно затратно по времени =)

Ну, я сам из Германии. С учётом бесплатной доставки Mouser мне, я думаю, обойдётся дешевле, чем диджикей. А какие замены компонент на более дешёвые Вы бы могли порекомендовать?

У С++11 есть неприятная собенность, при описании структуры нельзя присваивать ее полям значение по умолчанию. В предыдущем и следующем стандартах можно. Поэтому я использую в работе С++14 (к тому же там расширенно применение constexpr)

Я тоже уже подумываю перейти на С++14, благо sw4stm, которую я в данный момент использую, это позволяет.
Sarcasm On. С другой стороны, тут в соседней ветке обсуждают использование Форта вместо С++, так что я и не знаю даже, что сегодня более адекватно. Sarcasm off.

Лучше использовать Attolic True Studio for STM32, намного более проработанная IDE.

Спасибо за информацию, буду посмотреть, что это за зверь такой.

НЛО прилетело и опубликовало эту надпись здесь

Кстати, Вы совершенно правы! Я, в силу отсутствия опыта, об этом просто не подумал. Спасибо за подсказку, исправлю в следующих версиях.

Расположение трёхцветного светодиода также неудачное. Хочу заменить его на SMD светодиод, вынести на край платы.

Если собираетесь делать следующую ревизию то стоит убрать R6 и добавить 3 резистора на каждый из анодов светодиода отдельно. В вашем же случае при включении нескольких цветов одновременно их яркость будет падать так как R6 ограничивает общий ток.

Согласен, я здесь совершенно напрасно решил съэкономить. Это не было бы проблемой, если бы светоиод был подключен в выводам контроллера, где есть ШИМ. Но на использованных выводах ШИМа нет.

Хороша только как тренировка по изготовлению ПП. И совершенно бессмысленна… Разумнее всего как старт работы с STM было бы сделать что-то вроде «голубой таблетки».
Для расширения функционала «голубой таблетки» была разработана плата
Gerber файлы прилагаются, можете повторить.
Исправлены ошибки: слабый стабилизатор, 1.5К на USB,…
Для изготовления прототипов, макетирования придумано это
Добавляем в проект то, что интересно, например модули ардуины, коих хватает.
я правильно понял, что «зеленая» — это исправленная «голубая»?
Отчасти да. Делалось в том числе для расширения линейки МК.
Можно впаять STM32F100, STM32F103 ( Cortex M3 ), STM32F303 ( Cortex M4 )
В том же кубике можно подобрать совместимые по ногам 48-ми ножечные.
понял, спасибо.

Я и сам такое делал. В github репозитории, о котором я пишу в статье, есть набор и таких плат.

Да, я смотрел. Это по сути — переходники. Нет стабилизатора 5V — 3.3V
Я предлагаю несколько иной взгляд. Уж коль скоро максимально распространенная это «голубая таблетка», то обеспечиваем максимальную совместимость по ногам именно с ней.
Используя макетные паячно-беспаячные платы ( ссылку дал ), можно собирать прототипы из набора «микрокубиков». Вставляя / припаивая всё на макетные платы. Не нужно напрягаться рассудком, как и куда потом всё это «затолкать», в какой корпус.
Нужно поменять/попробовать как будет работать с другим МК — просто поменяли «таблетку», оставив периферию на месте.
После разработки ПО и тестирования прототипа можно «нарисовать» свою плату законченного устройства. Детали прототипа используем далее для разработки чего-то следующего. Если лень, или не целесообразно — используем как есть. Внешний вид промышленного устройства уже есть. Да и провода, в случае беспаячного монтажа хорошо прижимаются крышками корпуса.

Лично мне такой подход тоже нравится. Я даже писал о чём-то похожем на Хабре, с той только разницей, что использовал беспаячную макетную плату. Как-то та статья не зашла. Наверное, не смог хорошо объяснить. Отчасти поэтому, отчасти из-за желания нового я пошёл по пути наращивания и усложнения функционала контроллерной платы, вместо декомпозиции на макетной.

1) В вашем микроконтроллере есть 2 ЦАП, зачем использовать внешние?
(2×12-bit D/A converters)
2) Усилители и схемы можно подсмотреть у STM, но мне нравится LM4863. Дело вкуса :-)
3) Если у вас линия питания зашумлена, то я бы советовал последовательно после регулятора 3.3В поставить индуктивность (дроссель подавления ЭМ помех). Получится LC-фильтр и всё будет ровно. Схемы и компоненты можно подсмотреть в любых радиомодулях. Там качественное питание критично.
4) У вас линия SD_DET идёт сразу в контроллер. Я бы её к питанию подтянул 100к. Тогда она не будет плавать (z-state).
5) Линия NRST разве не должна быть к питанию подтянута через резистор?
Удачи вам. Буду ждать от вас LQFP100 с памятью DRAM.

Хотелось качественного звука. Внешний ЦАП UDA1334 — это специализированный аудио-ЦАП с разрешением до 24 бит и частотой дискретизации до 100 кГц. Кстати, на STM-Discovery также используется внешний ЦАП, но более навороченный. Спасибо за наводку на LM4863 — интересная штука, поизучаю. Хотя он выходит почти в 3 раза дороже того, что использовал я. За совет с индуктивностью спасибо — обязательно посмотрю. SD_DET я не подтянул внешним резистором, так как при инициализации контроллера я гарантированно успеваю подтянуть его внутренним резистором перед первым использованием. То есть при старте системы напряжение конечно плавает, но это не критично. По поводу NRST: задумался и проверил документ Getting started with STM32F4xxxx MCU hardware development. Вроде нет, резистора там нет, см. Figure 26. JTAG connector implementation на странице 37.

В этом документе на 13 и 14 стр. нарисован резистор встроенный на 40к и подтянутый к VDD. Так что я не прав, у вас всё корректно.

Ну, зачем же Вы так категорично? И "голубая таблетка", и Discovery, и пара Nucleo, и пара плат от Olimex у меня есть. Все они достаточно хороши. В каждой есть изюминка. Мне, например, очень нравятся Nucleo. Как старт работы с STM32 разумно использовать любую из них. Только ведь я не совсем об этом писал. Смысл проекта: нечто, что имеет WiFi, звук, SD карточку и подходит к очень распространённым корпусам от RPi. Ну и на уровне софта несколько больше, чем просто светодиодом помигать.

Ну и хочу добавить, что для «железа» лицензия GPL не подходит. Это для ПО.
Для «железа»:
— TAPR Open Hardware License
— CERN Open Hardware Licence
— …

Упс, этого я просто не знал! Спасибо за информацию, буду курить мануалы по лицензиям.

Печально, что и на этой плате нет USB PHY, и, соответсвенно, HS не светит.
Это сужает спектр возможных применений.

Выше о USB тоже уже писали. Я тоже за то, чтобы его добавить. Предлагаю объединить усилия и поработать над этим совместно. Если есть желание скооперироваться, пишите в личку.

Напишите мне, как созреете на новую версию. Готов проконсультировать по подключению внешней RAM, Ethernet и разводке платы.
А вы тут порекомендуйте внешние RAM. Всем будет интересно.
А это смотря, какую хотите. Для начала — SRAM или DRAM?
Берите сразу FRAM. Типа 1666РЕ014. :) ОЗУ и ПЗУ в одном флаконе.

Я сам, честно говоря, внешнюю память ещё не использовал. Можно Вас попросить вкратце написать, какие есть сценарии использования внешней памяти, как это решается на уровне софта (поддержка HAL, поддержка компилятора, обращение для хранения своих данных) и, исходя из этих сценариев, конкретную модель (или модели) микросхем. На какую периферию самого контроллера нужно обратить внимание, чтобы использовать память наиболее эффективно?

1. Сценариев очень много. Ethernet, например.
2. Решается очень просто. В скрипте линкера заводится область, с началом в нужном банке и нужного размера. Потом всем переменным, которые во внешней памяти лежать должны, прописываете __attribute__ ((section(«секциянейм»))). В скрипте линкера дописывается что-то вроде:
.секциянейм:
{
} > областьнейм
Это в случае с GCC, но для IAR с Keil очень похоже должно быть, думаю.
Обращаться, соответственно, можете как и к обычным переменным.
3. У самого контроллера смотрите на FSMC, если надо только статику. За динамикой — только к FMC.
4. Конкретные модели по памяти и не назову, увы. Это надо гуглить.
В дополнение к вышесказанному, обращу Ваше внимание на документ от SGS Thomson — это касательно LL и HAL. Там подробно описано применение и FMC (SDRAM), и FSMC (SRAM).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации