Куда пропали процессоры stm32

Обновлено: 06.07.2024

STM32 vs MDR32 – счет не в нашу пользу.

В соответствии с программой импортозамещения, введенной в России с 2014 года, предполагалось по возможности заменить ЭРИ иностранного производства на отечественные аналоги. Выпущенная АО «ПКК Миландр» серия ИМС 1986ВЕ9х – ARM микроконтроллеров на базе ядра Cortex M3 является ближайшим аналогом микроконтроллера STM32F10x европейской фирмы ST Microelectronics, и поэтому должна существовать возможность применить с некоторыми доработками российский аналог там, где уже успешно работает STM32. Именно этой задачей я и занялся, а именно начал внедрять ИМС К1986ВЕ92QI в устройство силовой электроники в качестве управляющего контроллера. Изначально устройство разрабатывалось на микроконтроллере STM32F10x, программное обеспечение было написано на GNU ARM Assembler, так как требовалось большое быстродействие, а встроенный «сишный» компилятор Keil этого не обеспечивал. Из периферийных блоков использовались TIMER, ADC, DMA, UART, NVIC и EXTI. Далее будут рассмотрены все сложности, которые возникли в процессе адаптации устройства к ИМС К1986ВЕ92QI, а также описаны основные отличия периферийных узлов.

Ядро, что у одного, что у другого – Cortex M3, RISC ядро ARM архитектуры, разработанное британской корпорацией ARM Limited. АО «ПКК Миландр» приобрело лицензию на данное ядро в 2008 году, и впоследствии реализовало его в серии микроконтроллеров 1986ВЕ9х. ST Microelectronics выпускает микроконтроллеры на базе Cortex M3 с 2007 года, в том числе серию F1, и является лидером по соотношению цена/качество.

Если в STM32F10x реализовано три вида 16-битных таймеров: самые простые (Basic Timers), таймеры общего назначения (General Purpose Timers) и таймер с расширенными возможностями (Advanced Control Timers), то разработчики АО «ПКК Миландр» пошли иным путём – они сделали три таймера с расширенным функционалом, хотя и назвали их «Таймеры общего назначения». По сравнению с другими периферийными устройствами таймеры в 1986ВЕ9х довольно неплохие. Не получилось реализовать в проекте только синхронный запуск двух таймеров по событию третьего таймера и самостоятельную перезагрузку при захвате фронта для организации циклической работы, так, чтобы отслеживать периодичность фронтов сигнала, и, в случае если фронт не успел, уходить в прерывание счетчика при CNT равном ARR. Вдобавок обнаружилась проблема с прерываниями таймера MDR_TIMER1, но винить в этом только таймер неправильно, поскольку проблема может быть на стороне NVIC, подробнее об этом я напишу ниже. Также к таймерам относятся SysTick и Watchdog, первый входит в состав ядра и является простейшим вычитающим счетчиком, а вторые (IWDG и WWDG) ничем не отличаются от STM32F10x.

АЦП в обоих вариантах сдвоенное и имеет одинаковую скорость преобразования – 512 тысяч выборок в секунду, но по функциональности и удобству отечественному периферийному блоку далеко до иностранного аналога. Возможность запускать преобразование АЦП от внешних событий в STM32F10x позволяет синхронизировать несколько периферийных блоков без отрыва ядра от текущей задачи и производить выборку в нужный момент на кривой измеряемого сигнала. Это во многом облегчает и упрощает работу с STM32 и является его большим плюсом. В 1986ВЕ9х по каким-то причинам это не реализовали. Иностранный аналог имеет возможность объединять измеряемые каналы в группы (инжектированные или регулярные) и измерять их в разных последовательностях, при том, если применять инжектированную группу (в которую входит до 4 каналов), то каждый результат будет находиться в своём регистре. Таким образом, результаты преобразований не перезатираются внутри группы, как это происходит при использовании регулярной группы, где регистр результата один на все каналы. В 1986ВЕ9х сделали подобие регулярной группы, при том, что синхронно разные каналы измерять невозможно. Синхронно можно измерять только одни и те же каналы для увеличения скорости преобразования.

Вот здесь у 1986ВЕ9х начинается “мрак”. Этот блок после многоразового прочтения документации и анализа его работы поверг меня в уныние. Один вопрос гложет меня до сих пор: «Зачем городить такой DMA, если он не может работать без участия ядра?». Из всего описания DMA в документации самое нужное написано в глубине раздела, цитирую: «После выполнения контроллером N передач, контроллер устанавливает значение поля cycle_ctrl в b000, делая тем самым channel_cfg данные “неправильными”. Это позволяет избежать повторения выполненной передачи DMA». Из этого следует, что, перед приходом запроса DMA, например, от любого периферийного блока, коих там не много, cycle_ctrl должен содержать значение «Режим работы при выполнении цикла DMA» не равное b000, а, так как после выполнения предыдущего цикла данные в том месте обнулились, то для нормального функционирования нужно останавливать ядро в текущей задаче и успевать вносить данные (b001 – основной режим, b010 – режим авто-запрос или b011 – режим пинг-понг) в то самое поле cycle_ctrl. Преклоняюсь перед “гениальностью” разработчиков данного DMA! В STM32F10x все просто, доступно и легко, переправляешь данные куда душе угодно по запросам DMA без участия ядра.

Проблем не возникло, все работало, как надо. Это единственный периферийный блок в творении АО «ПКК Миландр», который у меня не вызвал нареканий. Из плюсов можно отметить: у STM32F10x имеется режим SmartCard и поддерживается сеть LIN; у 1986ВЕ9х присутствуют буферы FIFO, как на передачу, так и на приём. В остальном все примерно одинаково, кроме того, что в микроконтроллерах ST Microelectronics число блоков UART от двух до пяти, а в серии 1986ВЕ9х их только два.

NVIC реализован в ядре Cortex M3 и предназначен для организации прерываний, как от внутренних блоков, так и от внешних линий (EXTI). В зависимости от конкретной реализации он может поддерживать до 240 линий запросов прерываний. В микроконтроллерах STM32F10x из 240 задействовано 60 прерываний, а у ИМС 1986ВЕ9х их всего 32. Это явный показатель того, что развитость периферийной инфраструктуры отечественного микроконтроллера отстаёт от зарубежного аналога.

В микроконтроллерах 1986ВЕ9х такого блока в принципе нет, у них четыре линии с NVIC напрямую идут на ножки микроконтроллера, поэтому он может различать только присутствие или отсутствие логического уровня. Если этот уровень установился (логическая ‘1’), то вызывается обработчик прерывания, и если к моменту выхода из обработчика прерывания уровень не изменится (станет логическим ‘0’), то мы тут же опять попадем в тот самый обработчик прерывания. Совсем по-иному сделали в STM32F10x, где прерывания возможны почти с любой ножки, и отслеживаются не уровни, а фронты и/или срезы сигналов. Зачастую в программе нужно отследить изменение сигнала и вызвать при этом обработчик прерывания только один раз, а не так, как нам это предлагает АО «ПКК Миландр». На весь блок EXTI в иностранном аналоге отведено 7 линий в NVIC, поэтому несколько выводов микроконтроллера сгруппированы и прерывания с них попадают в один обработчик.

Микроконтроллеры ST Microelectronics самые распространенные из всех с ядром Cortex M3. Причин этому несколько: недорогие отладочные платы, сами микроконтроллеры дешевые, доступная и понятная документация, и т.д. Основным документом при работе с STM32F10x является RM0008 «Reference manual», где подробно и ясно, хоть и не на родном языке, описаны принципы функционирования и представлены необходимые при программировании данные. Совсем иначе дела обстоят у АО «ПКК Миландр», основным документом является «Миландр. Спецификация на серию 1986ВЕ9x, версия (на момент написания статьи) 3.14.0 от 12.10.2018» и качество его оставляет желать лучшего. Ошибки и опечатки везде, к примеру: основные таймеры сначала были 32-битные, затем нормализовались и стали 16-битными, в описании DMA, где и без того все путанно и туманно, одно и то же фигурирует под разными именами (на рисунке 131 области памяти обозначены как: Control, Destination End Pointer и Source End Pointer в тексте на следующей странице они уже фигурируют под другими именами: channel_cfg, dst_data_end_ptr и src_data_end_ptr соответственно), поэтому разработчик, который собрался применить данный периферийный блок, должен каким-то образом сопоставить эти имена. И так перечислять можно еще долго. В основную документацию для чего-то поместили раздел «Система команд» ассемблера, хотя это относится конкретно к ядру Cortex M3, и абсолютному большинству разработчиков не требуется так, как пишут на «Си». Создается впечатление, что документацию на серию 1986ВЕ9x писали студенты–практиканты, мало чего понимающие в том, что излагают, и проверить их никто не удосужился.

Программаторы и среды разработки

Так как STM32F10x широко распространены, средств программирования и отладки тоже хватает. Сама ST Microelectronics выпускает недорогой ST-Link v2, а также программаторы многих сторонних производителей поддерживают STM32, например J-LINK. Среды разработки так же в достатке: Keil, IAR, CooCox, Eclipse, Atollic, и т.д. ST Microelectronics даже выпустила специализированный софт «STM32CubeMX», который генерирует «сишный» код под конкретную конфигурацию. 1986ВЕ9x присутствуют только в Keil, а программатор в моем случае подошел только отечественный «ChipProg-481» фирмы «Phyton».

Помехоустойчивость и «баги»

В реализуемом устройстве необходимо было производить измерения АЦП в середине импульса таймера (ШИМ), в STM32F10x для этого имеется необходимая инфраструктура, а именно возможность запуска преобразования АЦП по событию обновления счетчика. По причине того, что в 1986ВЕ9x такая инфраструктура отсутствует, пришлось осуществлять запуск преобразования АЦП из прерывания обновления счетчика MDR_TIMER1, вот здесь и обнаружился «баг». Прерывания происходили, как это и требовалось, при каждом обновлении таймера, но также появлялись “блуждающие” прерывания в хаотичном порядке, когда не происходило обновления счетчика. Эти ложные прерывания могли либо в период ШИМ появляться по нескольку раз, либо вообще отсутствовать на протяжении нескольких периодов. Очевидно, что этот «баг» таймера MDR_TIMER1, либо NVIC, или вообще где-то между таймером и NVIC (линии связи). В итоге продолжительных и безрезультатных изысканий решено было прекратить адаптацию 1986ВЕ9x в устройстве и оставить STM32F10x на своем месте, где он безотказно исполняет свои функции и по сей день.

Ведущие фирмы-производители микроконтроллеров для освобождения процессорного времени внедряют разные методы коммуникаций между периферийными блоками: ST Microelectronics связывают блоки отдельными линиями; Microchip сделал специальный блок «EVENT SYSTEM» для коммутирования событий. В отечественных микроконтроллерах 1986ВЕ9x периферийные блоки существуют отдельно друг от друга, имея линии связи только с ядром. Мною было затронуто далеко не всё, что имеется на «борту» серии 1986ВЕ9x, но я уверен, что есть разработчики, которые углубились дальше и нашли больше. О причинах того, почему у АО «ПКК Миландр» такие микроконтроллеры, я могу только догадываться, ведь талантливыми инженерами всегда славилась Родина. Видимо, все они трудятся в другой сфере, либо вообще на другое государство. Ну, а мы имеем то, что имеем, поэтому нам остается только надеяться, верить и ждать, что, все-таки, состояние дел в этой высокотехнологичной области изменится в лучшую сторону.

Читайте также: