Как перейти с «базовых» микроконтроллеров на ARM Cortex?


22

У меня многолетний опыт работы с 8-битными ядрами разных производителей, а именно 8051, PIC и AVR, и теперь у меня есть Cortex M0, чтобы разобраться. В частности, это , но я надеюсь, что мы можем быть более общими, чем это.

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

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

Существует ли краткий обзор архитектуры Cortex, объясняющий функции вещей, которых у небольших контроллеров просто нет - например, несколько уровней шин от ЦП до периферийных устройств, каждый со своим собственным сторожевым таймером - и как они все соединяются вместе?


Из того, что вы описали, я не могу судить, получили ли вы фактические данные / руководство пользователя для процессора от производителя. Это должно дать вам хорошую общую картину и детали. С одной из картинок на сайте, на который вы ссылаетесь, он выглядит как процессор NXP. Посмотрите номер детали производителя и найдите документацию по процессору на их сайте. Также есть сайт ARM arm.com/products/processors/cortex-m/cortex-m0.php .
DigitalNinja

Извините за задержку с возвращением к этому; Я был занят другими проектами. Спасибо @Adam за голос опыта.
AaronD

И спасибо @Richard за обзор того, как об этом думать, и за примечание о печати конфигурации контактов. Я проголосовал за вас обоих.
AaronD

Вы никогда не вернетесь, если не найдете каких-то экстремальных ценовых требований. И даже тогда вы будете соблазнены, так как есть довольно много дешевых Cortex-M.
Ронан Paixão

Ответы:


40

Я работал над AVR, а также над микроконтроллерами на базе ARM Cortex-M3 / M4 / R4. Я думаю, что могу дать несколько общих советов. Это предполагает, что вы программируете на C, а не на ассемблере.

Процессор на самом деле самая легкая часть. Основные типы данных C будут разных размеров, но вы все равно используете uint8 / 16 / 32_t, верно? :-) И теперь все целочисленные типы должны быть достаточно быстрыми, с 32-битным (int) самым быстрым. У вас, вероятно, нет FPU, поэтому продолжайте избегать поплавков и удвоений.

Сначала поработайте над пониманием архитектуры системного уровня. Это означает, что операции ввода-вывода, синхронизации, памяти, сброса и прерывания. Кроме того, вам нужно привыкнуть к идее отображения периферийных устройств. На AVR вы можете не думать об этом, потому что регистры имеют уникальные имена с уникальными глобальными переменными, определенными для них. В более сложных системах принято ссылаться на регистры по базовому адресу и смещению. Все сводится к арифметике указателей. Если вы не знакомы с указателями, начните учиться прямо сейчас.

Для IO, выясните, как обрабатывается периферическое мультиплексирование. Существует ли центральный регулятор мультиплексора, чтобы выбрать, какие контакты являются периферийными сигналами, а какие GPIO? Или вы устанавливаете контакты в периферийный режим, используя периферийные регистры? И, конечно, вам нужно знать, как настроить GPIO в качестве входов и выходов, а также включить режим с открытым стоком и подтягивания / понижения. Внешние прерывания обычно попадают в эту категорию. GPIO довольно универсальны, поэтому ваш опыт должен послужить вам здесь.

Часы сводятся к нескольким вещам. Вы начинаете с источника тактового сигнала, обычно кварцевого или внутреннего RC генератора. Это используется для создания одного или нескольких часовых доменов системного уровня. Чипы с более высокой скоростью будут использовать ФАПЧ, которое вы можете рассматривать как множитель частоты. Будут также делители часов в разных точках. Ключевыми моментами, которые необходимо учитывать, является то, какой должна быть тактовая частота вашего процессора и какая скорость передачи данных вам нужна для периферийных устройств связи. Обычно это довольно гибко. Когда вы станете более продвинутым, вы сможете узнать о таких вещах, как режимы с низким энергопотреблением, которые обычно основаны на стробировании тактовых импульсов.

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

Сброс довольно прост. Обычно вам нужно только следить за сторожевым таймером, который может быть включен по умолчанию. Сброс более важен во время отладки, когда вы запускаете один и тот же код снова и снова. Легко пропустить ошибку из-за проблем последовательности.

Есть две вещи, которые вы должны знать о прерываниях: как вы их включаете и отключаете, и как вы настраиваете векторы прерываний. AVR-GCC делает последнее за вас с макросами ISR (), но на других архитектурах вам может потребоваться записать адрес функции в регистр вручную.

Периферийные устройства микроконтроллера, как правило, не зависят друг от друга, поэтому вы можете изучать их по одному. Это может помочь выбрать одно периферийное устройство и использовать его для изучения части системного уровня. Периферийные устройства связи и ШИМ хороши для тактирования и ввода-вывода, а таймеры хороши для прерываний.

Не пугайтесь уровня сложности. Эти «базовые» микроконтроллеры уже научили вас многому из того, что вам нужно знать. Пожалуйста, дайте мне знать, если вам нужно, чтобы я что-то прояснил.


4
Хороший ответ. Другая вещь, на которую стоит обратить внимание, это периферийные устройства DMA, которые, как мне кажется, имеют сложные и недостаточно документированные интерфейсы.
Даг МакКлин

3
«И теперь все целочисленные типы должны быть одинаково быстрыми». На самом деле, из-за целочисленных правил продвижения в C, использование 8/16-битных типов может привести к значительному расширению знак / ноль и может быть проблемой, когда флэш-памяти мало. Таким образом, если есть свободное ОЗУ, может быть полезно использовать больше 32-битных типов или, по крайней мере, отдавать предпочтение int/ int_leastN_Tтипам для переменных стека.
user694733

Сделал ошибку в моем комментарии. Я хотел сказать; используйте int_fastN_tтипы, а не int_leastN_tтипы.
user694733

@ user694733: Я бы хотел, чтобы стандарт C позволял коду запрашивать целое число, которое занимает заданный размер в памяти и может работать со значениями в пределах определенного диапазона, но со слабо определенной семантикой при выходе за пределы этого диапазона. В чем-то, похожем на ARM, значение int16_tчасто будет таким же быстрым, как и int32_tдля значений, хранящихся в памяти, но стандарт требует, чтобы на платформах с int17- битным или большим значением было int16_t x=32767; x+=2;установлено xзначение -32767, часто требуя инструкции расширения знака, даже если код будет никогда не используйте поведение обтекания.
суперкат

Стандарт @supercat C требует поведения переноса только для неподписанных типов. Для подписанных типов любая упаковка - UB из-за различных возможных представлений. Таким образом x+=2, было бы законно использовать инструкцию для 16-битных типов, потому что компилятор может предположить, что значение не будет перенесено, и, следовательно, его использование не изменит наблюдаемого поведения. Но я думаю, что ARM не имеет 16-битной инструкции ADD, которая сделала бы это возможным. (Я могу ошибаться, мои знания по набору инструкций ARM не так хороши.)
user694733

8

Полезно помнить, что ARM владеет интеллектуальной собственностью для микропроцессора, но на самом деле не производит детали. Вместо этого производители лицензируют различные версии процессоров ARM и производят свои собственные уникальные детали с индивидуальным сочетанием функций и периферийных устройств.

С учетом вышесказанного, если вы новичок в архитектуре, возможно, имеет смысл начать с документации ARM, которая, по сути, является базовой документацией для всех таких микропроцессоров.

Например, Cortex-M0 описан на веб-сайте ARM .

Существует также список книг, связанных с ARM, который обслуживает широкий спектр потребностей и интересов.

Наконец, есть спецификации конкретного производителя. Для M0 Cypress, NXP и STMicroelectronics - это только три из множества производителей реальных деталей на базе Cortex-M0.

(И нет, я не работаю на ARM и никогда не работаю.)


1
Это довольно общий ответ, который делает не больше, чем ссылку на некоторые документы Cortex-M0, которые, я уверен, ОП сможет найти самостоятельно.
Джей Карлсон

1
В нем непосредственно рассматривается вопрос, который попросил помочь найти общую документацию. Этот ответ прямо отвечает на эту потребность и объясняет, почему все так, как есть.
Эдвард

8

Одно большое отличие заключается в использовании предоставленных поставщиком библиотек. Для PIC, Atmels и т. Д. Базовые библиотеки (для gpio, timers, adc и т. Д.) Не использовались большинством разработчиков. По моему опыту, люди (максимум) использовали бы их в качестве руководства при написании собственного кода.

Однако с ARM библиотеки почти всегда используются. Существует стандарт CMSIS, которому производители должны следовать. Большинство делают. Это помогает переносимости кода (между различными ARM и между производителями) и предоставляет «стандартизированный» метод для структурирования вашего кода. Люди привыкли видеть и понимать функции библиотеки.

Конечно, есть некоторые разработчики, которые обращаются к регистрам напрямую, но они являются выбросами :)

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

Чтобы использовать GPIO в качестве примера, функция инициализации обрабатывает:

  • Направление (внутри или снаружи)
  • Подтягивания / Pulldowns
  • открытый коллектор / двухтактный
  • скорость нарастания
  • и т.п.

Просматривая варианты, вы можете увидеть, что возможно. И, конечно же, вы узнаете, как передать эти опции в функцию Init!

Хорошо, теперь, когда я сказал это, я вижу, что ваш конкретный ARM не имеет CMSIS-совместимых библиотек. Вместо этого они имеют свой собственный SDK, доступный для загрузки. Я бы начал искать их SDK документы.

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

ARMs это весело! Я не оглядывался назад.


«Для PIC, Atmels и т. Д. Библиотеки мало использовались большинством разработчиков». Не уверен, откуда это взялось. Я использовал только PIC, а не AVR, но определенно не хотел бы писать свою собственную библиотеку, например, для хост-интерфейса USB, стека TCP или файловой системы SD-карты. Библиотеки Microchip для всего этого кажутся вполне адекватными.
tcrosley

Ах, @tcrosley, ты определенно прав. Я только пытался сослаться на функциональность, охватываемую основными периферийными устройствами: gpio, таймеры, АЦП и т. Д.
bitmack

Я согласен, я обычно обращаюсь к GPIO, таймерам, часам и UART R / W напрямую. Иногда я использую их библиотечные вызовы для настройки I2C, SPI, ADC и UART, но не всегда. Много регистров, говорите ли вы PIC (и в частности PIC32) или ARM.
tcrosley

Я думаю, что этот ответ является наиболее прагматичным ответом на этот вопрос, хотя он не относится к конкретному контроллеру ОП. Я думаю, что вы можете сделать немало хороших встроенных разработок, не понимая AHB или NVIC.
Джей Карлсон

@JayCarlson Спасибо! Ваше изменение к этому ответу было отклонено, потому что мы не должны так сильно изменять посты других людей. Но это была действительно хорошая информация! Я предлагаю вам опубликовать это как собственный ответ, чтобы он помог людям, а также проголосовал :)
bitmack

5

Хорошее время, чтобы двигаться; 8 бит быстро умирают; Когда вы можете купить плату за 5 долларов с (например) STM32F103, который является довольно способным 32-битным ARM микроконтроллером (даже с USB!), нет сомнений, что времена изменились.

У вас уже есть несколько отличных ответов, но в первую очередь я бы сказал «забудь сборку» и почти «забудь о том, как процессор работает на низком уровне» - однажды будет угловой случай, в который нужно будет покопаться. (особая оптимизация или для отладки), но ядра ARM хорошо работают с кодом C (по замыслу), и вам редко приходится углубляться в кишки.

Это означает, что вы потратите определенное количество времени на то, чтобы справиться с проблемами с компиляторами (и особенно с компоновщиками и make-файлами), чтобы скрыть от вас непонятные ошибки, но все они преодолимы.

Суть того, как работают ARM (то есть книги о процессорах ARM), плотна и не очень интересна до того дня, когда вам действительно нужно оптимизировать (и вы будете удивлены, как редко, когда у вас есть 32-битные регистры и ваш PLL ') d Частота процессора находится в диапазоне 100 МГц).

Набор инструкций ARM «старого skool» намного легче прочитать при разборке, чем гораздо более новый «Thumb2», который вы найдете в большинстве современных ARM уровня микроконтроллера (Cortex), но опять же внутренности инструкций языка ассемблера в основном исчезают на заднем плане; если у вас есть правильный набор инструментов (особенно приличный отладчик на уровне исходного кода с точками останова / одним шагом и т. д.), вы просто не слишком заботитесь о том, чтобы быть ARM вообще.

Когда вы попадаете в мир 32-битных регистров и 32-битных шин данных, и все, что вам когда-либо требовалось, доступно на кристалле, вы больше никогда не захотите возвращаться к 8-битному ЦП; в основном, часто нет штрафов за то, что «все было просто» и написание кода было более читабельным, чем эффективным.

Однако ... периферия ... да и есть руб.

У вас наверняка есть масса вещей, с которыми можно поиграть на современных микроконтроллерах, и многие из них довольно причудливы; Вы часто находите мир изощренности, далеко за пределами AVR, PIC и 8051 встроенных периферийных устройств.

Один программируемый таймер? Нет, есть восемь! DMA? Как насчет 12 каналов с программируемым приоритетом и пакетным режимом и цепным режимом с автоперезагрузкой и ... и ... и ...

I2C? I2S? Десятки вариантов мультиплексирования? Пятнадцать разных способов перепрограммировать встроенную вспышку? Конечно!

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

Количество встроенного аппаратного обеспечения (и его вариаций в линейке микросхем только одного производителя) в настоящее время ошеломляет. Один производитель микросхем, конечно, будет склонен повторно использовать IP-блоки, поэтому, как только вы познакомитесь с определенной маркой, это станет проще, но «в наши дни это дерьмо сделано».

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

Хорошие библиотеки и инструменты разработки (например, быстрый цикл компиляции + отладки с соответствующим отладчиком) и большой набор рабочих проектов с примерами кода абсолютно необходимы в настоящее время для выбора ARM MCU. Похоже, что большинство поставщиков сейчас имеют чрезвычайно дешевые оценочные платы (

Как я уверен, вы заметили, как только вы выходите за пределы уровня микроконтроллера с ARM и переходите на уровень SOC (например, SOC в стиле Raspberry Pi / etc), тогда правила полностью меняются, и все зависит от того, какой тип Linux вы собираетесь использовать. бежать, потому что - за невероятно немногими исключениями - вы безумно лаете, пытаясь сделать что-то еще.

В основном; независимо от процессора, который (возможно) был предварительно выбран для вас на этом выступлении, купите себе несколько очень дешевых тестовых плат на основе Cortex от нескольких разных поставщиков (TI, STM, Freescale и другие) и взломать с предоставленным примером кода.

Последний совет; как только вы найдете страницу-три в таблице данных, в которой описаны параметры мультиплексирования выводов для конкретного чипа с номером детали, с которым вы работаете, вы можете распечатать его и прикрепить к стене. Позднее обнаружение в проекте того, что определенная комбинация периферийных устройств невозможна из-за мультиплексирования контактов, неинтересно, а иногда эта информация настолько скрыта, что вы поклялись, что они пытаются ее скрыть :-)


быстрое дополнение - если ваш проект намного больше, чем самый упрощенный контроллер, подумайте об использовании ОСРВ - есть что-то вроде кривой обучения с тем, что вы выберете, но даже самые маленькие ARM в настоящее время имеют достаточно возможностей для работы с многопоточными ОС. Лично я обнаружил, что ChibiOS представляет собой отличное сочетание простоты и возможностей (особенно работает на STM32, где он поставляется с хорошей периферийной библиотекой), но есть несколько вариантов.
Ричард Аплин

4

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

  1. Получить плату с отладчиком или хотя бы разъем JTAG (а затем купить отладчик JTAG). Есть много дешевых, и вы сэкономите много времени, используя его.

  2. Получите хорошую IDE со всем включенным. Я давным- давно рекомендовал CooCox CoIDE . С тех пор он прекратил и возобновил разработку, поэтому я не уверен, как сейчас. «Хорошая IDE» позволяет быстро мигать основным светодиодом Hello World.

  3. «Хорошая IDE» должна установить заголовки CMSIS производителя. Это в основном карты регистров, которые позволяют легче писать программы на C / C ++, с именами переменных вместо простых чисел и указателей.

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

  5. В отличие от AVR чипы ARM запускаются с отключенной периферией. Вы должны включить их в первую очередь. Хорошая периферийная библиотека будет содержать примеры того, как правильно использовать периферийные устройства, и вы можете получить дополнительную информацию из таблицы данных устройства. Итак, не забудьте включить часы и периферийные устройства, прежде чем использовать их. Да, даже порты ввода / вывода считаются периферийными устройствами.

  6. Код как вы узнаете. Не пытайтесь обмануть все сразу, поскольку это действительно довольно сложно. Я бы начал с изучения дерева часов (шины APB, AHB и т. Д.) И того, как взаимодействуют часы и делители часов. Затем я посмотрю, где в среде IDE хранятся сценарии компоновщика и код запуска для вашего устройства. Сценарий компоновщика в значительной степени определяет порядок организации памяти (где находится ОЗУ, флэш-память, таблица векторов ISR и т. Д.). Скрипт запуска настраивает вашу программу (например, копирование инициализаторов глобальных переменных из флэш-памяти в RAM). Некоторые IDE имеют сценарии запуска в ASM, а некоторые - в C. Иногда вы можете выбрать Google для другого, на предпочитаемом вами языке.

  7. Получите отладчик как можно скорее. В начале довольно часто ошибаться, выполняя некоторые вещи (обычно аппаратную инициализацию) в другом порядке, чем нужно. Иногда это вызывает исключение ISR, которое приводит вас в while(1);бесконечный цикл (реализация по умолчанию для этого ISR), которое останавливает вашу программу, и ее трудно отследить даже с помощью отладчика. Представь без отладчика.

  8. Говоря об отладчике, попробуйте запустить UART, а затем используйте адаптер последовательного USB, чтобы прочитать это. printf()отладка всегда полезна :-)


3

У меня не так много работы на 8051, AVR или PIC. Но недавно я начал изучать линейку процессоров ARM Cortex MX. Поэтому я не могу рассказать вам много о переходе с 8051, AVR или PIC, но в основном с точки зрения новичка.

Процессор ARM®Cortex ™ -M4 основан на архитектуре Гарварда, поэтому имеет отдельные шины данных и команд. Ниже изображение высокого уровня.

введите описание изображения здесь

На этой неделе представители NXP посетят наш объект. Я проверю их на наличие ресурсов NXP ARM-Cortex Mx и опубликую их здесь. Freescale имеет 32-разрядный микроконтроллер (MCU) с низким энергопотреблением Kinetis на основе ядер ARM® Cortex®-M , и я понимаю, что у них также есть руководства по обучению процессоров ARM. К сожалению, я не исследовал их.


Ссылки:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.