All streams
Search
Write a publication
Pull to refresh
6
0
Забулдыга @shell4692

Разработчик

Send message
Дорожки поела коррозия. Он не включается, по питанию звонится накоротко. Восстановить плату не получится однозначно, разве что поступить так, как поступил автор статьи и сделать так же.
Я недавно обнаружил у себя на чердаке свой старый ZX Spectrum Краснодар, который я сам доработал когда-то до 256Кб с использованием ОЗУ от 286й и подключением дисковода и музыкалки. Мои тетрадки со схемами не выжили при переезде и пришлось реверсить собственную работу. 256Кб делалось в режиме совместимости либо со Скорпион-256, либо с Профи, либо с АТМ-Турбо, чтобы копировщики его видели. Пришлось искать по всему интернету схемы Профи и Скорпион-256 и прочих, чтобы выяснить, под кого именно я тогда маскировался. Дисководов уже нет, ВГ93 в Beta Disk Interface дохлая (и них сдыхает драйвер 12в сигнала STEP), дорожки поела коррозия за 25 лет…

Ломаю голову, что с этим всем делать дальше. Дисководов нет, дискет нет, жёсткие диски тоже старьё… Если реанимировать его в первозданном виде, нет ресурсов. Если доставать FPGA и делать на нём всю обвязку и эмуляцию старого оборудования на современный VGA стандарт и SDкарты, тогда теряется весь шарм и ностальгия по старине.

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

Совершенно с Вами согласен. Пока готовил статью, пропустил. Уже исправил, спасибо.
stm32f103c8 взят для примера статьи. Тем не менее, это мощный 72МГц процессор. У него много периферии, которую можно очень эффективно задействовать и мощное ядро АРМ на 72МГц. ОЗУ и Flash маловат, но на это есть 103rb или 103rc варианты. Статья про организацию программного кода для реализации кооперативной многопоточности. Для тех задач, которые нуждаются в многопоточности без ОСРВ. Если задача перебирать порты GPIO или опрашивать АЦП, достаточно просто вызывать блокирующие функции в цикле main(). Или организовать цепочки использования одного периферийного модуля другим. Для таких задач есть контроллеры попроще, например, stm 30й серии. Или вообще Atmel-овские tinyXXX.

Какой контроллер, какой IDE и какие методы выбирать? Здесь не может быть какого-то истинно правильного метода. Каждый выбирает в меру своих познаний и опыта в данном вопросе, а также на основе параметров проекта, который он выполняет.

Несомненно, Eclipse и Keil имеют более зрелую IDE, но как-то привык к старому доброму IAR. Если условия работы будут требовать именно Eclipse или Keil, ну… буду на них. Насчёт STDPeripheral: для демонстрации концепции в этой статье подойдёт, лично я из него «вырос» много лет назад. Теперь только чистый CMSIS. У меня давно разработана собственная архитектура драйверов, так что CubeMX с его HAL не подходят. Когда я начинал STM, тогда не было ещё CubeMX. Пять лет вполне достаточно, чтобы научиться ориентироваться в различиях периферии и схемах тактирования без него.
Я так увлёкся написанием ответа на Вашу статью :))), что забыл упомянуть о том, что константа для инициализации I2C используется только в семействе stm32f0x. В других семействах, никакой необходимости в ней нет. Однако, не могу с Вами согласиться, что подобная константа является очень удобной. Ей нельзя просто так вот взять с «с потолка». Игнорировать её тоже нельзя. И обойтись без неё (как в семействах stm32f10x или stm32f20x) тоже.

Насчёт «гибко настраиваемой» периферии я полностью с Вами согласен, но сложность, на мой взгляд, всё же имеется. И она проистекает не только из обилия функция (хотя бы того же I2C), а из алгоритмов её использования (согласно Справочному руководству). В каждом семействе не только различаются регистры одной и той же периферии, а также различны и действия, которые нужно совершить для получения желаемого результата. Кроме того, чем ближе к регистрам, тем менее переносимой становится прошивка.

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

CubeMX был сделан не просто так — он был сделан, чтобы вынести работу с периферией в HAL и абстрагироваться от неё. Структура HAL во многом напоминает PerLib. Не готов утверждать, что это хорошоее решение, однако оно как нельзя лучше демонстрирует, что «не всё так гладко в Датском королевстве».

А насчёт сложностей, они обычно возникают не при мигании светодиодами, а где-то при написании, к примеру, многопоточного приложения, в котором на одной шине I2C1 висят LCD1602 экран (через расширитель порта PCF8574T), просто расширитель порта PCF8574T для клавиатуры, ds2482s-100, который опрашивает 5 термодатчиков ds18b20, а на шине I2C2 висят, например 3-4 других модуля с другими МК (к примеру 30й серии). При этом также используется USART1 для управления несколькими блоками по RS485 и протоколу MODBUS. И всё это в одном единственном stm32 (правда f103).

Я не в коем случае не посягаю на Ваше право строить логику изложения, коллега, прошу меня великодушно простить за (может быть) излишнюю настойчивость. :)))

Вот не совсем понятна целевая аудитория автора. Люди, которые не понимают основы языка и битовые операции, уж точно не пойдут на stm32. Для таких людей вполне подходит Ардуина. По моему разумению, stm32 не есть платформа для начинающих (особенно такого уровня, где человек не знаком с основами двоичной арифметики). STM32 — адское место даже для продвинутых профессионалов, особенно на уровне CMSIS. Периферия STM32 чрезвычайно сложна, регистры и их поля существенно различаются в разных семействах stm32. Например, при работе с модулем I2C нужно записывать в регистр некую константу, вычислить которую можно либо в Excel-утилите, которая есть на сайте STMicro, либо через STM32CUBEMX.

Если уж действительно обучать ИМЕННО stm32, наверное, нужно знакомить читателя не с битовыми операциями, а с общей архитектурой? Нужно показать, из чего она состоит, в какие группы объединяется периферия, какие шины её соединяют и какая схема тактирования этих шин. Также неплохо особенно подчеркнуть, что в Stm32 процессорное ядро является не монолитным, а входит в общий кластер периферии как модуль.

Говоря о тактировании, хорошо бы упомянуть про RCC, без понимания работы которого нет смысла вообще связываться с stm32. И почему бы, на этапах ознакомления с общей архитектурой, не использовать PeripheralLibrary, которая как раз позволяет сосредоточиться на функциональности периферии, общих принципах её работы, а не на деталях программирования регистров?

Опять же, самая главная книга при работе с stm32 это Reference manual. Почему бы не указать людям ссылку на источник?
Несомненно считается. Автор scmRTOS делал её для не только для AVR, а вообще для МК и делал её на C++. И это наложило отпчаток на системные требования scmRTOS — 512 байт ОЗУ минимум. Однако, простой кооперативной многозадачности было бы достаточно для небольшого (по сравнению с stm32) ресурса этих контроллеров. Честно говоря, не хочется превращать беседу в holywar типа stm32 vs avr. Я много лет назад начинал на AVR и до сих пор их использую. Также, как и stm32.
Вот насчёт контроллера «умного дома» на stm32Discovery у меня возникают сомнения. Тридцатка слабовата, чтобы тянуть на себе RTOS на целый умный дом, для таких целей, наверное, могли бы подойти модули Maple-Mini, на stm32f103c8, у которых 72Мгц с внешним кварцем. Да и они тоже как-то слабоваты.
Будучи уже 5 лет разработчиком на stm32 хочу обратить внимание автора статьи на один нюанс. Главное отличие stm32 от AVR есть возможность вложенной обработки прерываний и наличие DMA. А также, наличие SysTick — таймера, который тикает не во внешней периферии, а в ядре. Это позволяет делать на нём многопоточные приложения, чего AVR8 лишён в принципе (я имею ввиду mega328p/mega16/mega32 и вообще AVR ядрёные версии). Для однопоточной задачки вполне себе подошёл бы и Ардуино, ничего такого ужасного в нём нет. С моей точки зрения, оба контроллера пригодны для решения задач, у каждого есть свои преимущества и недостатки. Пятивольтовые AVRки вполне себе могут уживаться в одной схеме с трёхвольтовой stm32. А для выключателя на стенке вполне себе, наверное, хватило бы и чего-то мелкого, вроде attiny.

Кстати, использование CMSIS для новичков, это довольно сложный способ вхождения в тему. Есть гораздо более простые вещи, например, библиотека Peripheral Library, которая является надстройкой над CMSIS и предлагает простые и удобные функции работы с очень запутанной периферией контроллера, без надобности (на первом этапе) вникать в структуры периферийных регистров и карты их полей. Ну, или более современный вариант, вроде CubeMX.

На мой взгляд, самым «вкусным» контроллером 30й серии stm является ИМХО stm32f030f4p6. Имея встроенный генератор на 8МГц, который раскачивается ФАПЧем до 48МГц и корпус TQFP20, он очень красиво становится на адаптер TQFP->DIP и занимает всего лишь пару квадратных сантиметров на бредборде. На него запросто можно уместить 10-15 поточное приложение, которое будет иметь некую структуру драйверов и сервисов.
Я работаю с stm32 через IAR, который работает на Windows XP. Сама «винда» работает в виртуальной машине VirtualBOX на MacMini. Программатор, само собой ST-LINK V1. Китайский. Почему V1? Потому что китайский V2 не определяется из под линукса/макОсь. Разбираясь в проблеме, я выяснил, что вся проблема в строковом дескрипторе, который возвращает прошивка по USB при инициализации. В старых программаторах st-link v1 там возвращалось простое число, записанное в виде ASCII символов (0x30). В новых программаторах, наши китайские друзья в это поле пишут что-то в кодировке либо UTF-8, либо что там многбайтовое, но при этом содержащее недопустимые ASCII символы. Наверное, под Windows есть собственный драйвер, который это игнориует. А вот VirtualBox, который фильтрует все эти пакеты между реальным интерфейсом и драйвером виртуальной машины, вешается и потом сыпет ошибками. Может быть, кому-то будет интересно. Программаторы V2 покупались за очень-очень недорого. На настоящей Windows машине они работают безупречно.
Мы с сыном собираемся посетить робостанцию в начале сентября. Точной даты пока не знаю. Мы на ВДНХ приезжаем каждый год. Сын очень любит конструкторы Лего и им подобные. Но, посещение робостанции однозначно в списке. Поиграть с роботами jimu было бы интересно. У нас дома есть mindstorm, но я его пока отложил. Изучение языка программирования Лего ( из кубиков) не заладилось, я решил придержать конструктор до более алекватного возраста. Поддержка Apple-ом модулей ev3 в ios playground — это очень классное решение.

Кроме того, Лего открыла для публичного использования ev3 sdk, так что у меня в планах освоить написание модулей и прикрутить к ev3 разные ардуиновские причиндалы, которых у меня навалом.

Если сын освоит/осилит свифт, это будет огромный успех… скрестил пальцы на удачу.
А я как-то на досуге придумывал схему моста шины ISA на CPLD для stm32f103. Много разного железа валяется, хочется заюзать его в своих проектах. Да и текстовый режим рулит!
Пока что две главы прошли только. Но он играется с примерами кода, которые там. К тому же я ему даю тестовые задачки по пройденным темам на разбор. Учу понимать программы.

ему еще компилировать это все


Там почти 3/4 книги примеры в Playground. В XCode тоже есть игровая площадка. Так что компилировать ничего не нужно.
Сам занимаюсь программированием с 9 лет, сейчас мне 41. Учу своего восьмилетнего сына SWIFT по книжке “Swift Programming: The Big Nerd Ranch Guide 2nd Edition”. Я сам свободно читаю без словаря и перевожу ему по одной главе в Word-е с конвертацией в PDF. Сын делает большие успехи. Перед этим сначала пытался учить его бейсику на эмуляторе Спектрум, но потерпел фиаско. Ребёнок не запоминает устные объяснения. После этого, я скорректировал программу обучения. Сначала, он месяц набирал тексты (фрагменты из детских книжек, распечатанные крупным шрифтом) на русском, чтобы освоить клавиатуру. Затем, я ему дал набор таких же английских текстов и столкнулся с проблемой: на клавиатуре написаны заглавные английские буквы, а в тексте маленькие. Пришлось потратить 3 дня на изучение английского алфавита (произношение букв, узнавание маленьких букв для больших и заглавных букв для маленьких).

Теперь успешно осваиваем книгу с огромным интересом.

Хочу заметить, что при переводах для ребёнка, все термины, которые нужно запоминать именно в их английском представлении, нужно уточнять в произношении и переводе. Например, если в тексте встречается тип String, я пишу в скобках его произношение и перевод («СТРИНГ»-«СТРОКА»). Также, я сделал скриншоты интерфейса Xcode и все надписи на английском снабдил комментариями с переводом и произношением. Это даёт просто потрясающий результат — ребёнок видит английский интерфейс (нет Xcode на русском) и всё понимает.

В дальнейших планах, после освоения обычного языка, прежде чем переходить ко второй книжке “iOS Programming: The Big Nerd Ranch Guide 6th Edition”, нужно будет познакомиться с основными алгоритмами. Например, сортировка «пузырёк» или создание односвязных и двусвязных списков.

Надеюсь, что мой опыт будет кому-то полезен.

Information

Rating
Does not participate
Location
Россия
Registered
Activity

Specialization

Backend Developer, Embedded Software Engineer
Lead
Java
OOP
SQL
Linux
English
Spring Boot
Hibernate
Git
C++
Programming microcontrollers