Настройка vscode под разработку для arm на примере отладочной платы stm32f429i-disco

Передмова

Бібліотека для роботи з дисплеєм 240х320 з чипом ILI9341 за допомоги інтерфейсу FSMC.
Колись придбав таку плату розробника з чипом STM32F407VET6 для дослідження 4хх серії. Плата якісна. Має на борту роз’єм для радіомодуля 2.4 ГГц NRF24L01, роз’єм для дисплею FSMC, модуль SD-CARD, тримач батарейки 3В для модуля RTC. Пам’ять FLASH. Два вбудованих світлодіода та дві користувацькі кнопки. Досить пристойний кандидат для серйозної розробки. Почнемо з дисплею.

STM32F407VET6 Black Board

До цієї плати продають сумісні по роз’єму дисплеї з резистивним тачскріном. Цей дисплей достатньо просто вставити «бутербродом» в роз’єм плати розробника.

3.2 inch TFT LCD Resistive Touch Screen 320 * 240 ILI9341 Display Module

Є варіант плати з дисплеєм в одним лотом на aliexpress.

Что это вообще такое?

Микроконтроллер – это специализированная микросхема, объединяющая микропроцессор, память и периферийные устройства в одном корпусе. В отличие от «большого» компьютера имеет ограниченные объемы собственно этой самой памяти: типовые значения и для RAM, и для ROM – десятки-сотни килобайт.

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

В связи с перечисленным, код под микроконтроллеры разрабатывается особым образом, в специализированных IDE, а операционные системы вообще выделены в особый класс. Основной функцией ОС для микроконтроллера является реализация многозадачности, а бонусом обычно идут разные стеки сети, файловых систем и т.д. Ни о каком окружении и вспомогательных утилитах, как в настольных ОС, здесь речи не идет. Так, например, в ОС для микроконтроллеров нет процессов, есть только задачи = нити = потоки, а сама ОС, как правило, компонуется с пользовательским кодом в единую микропрограмму («прошивку»). Для понимания особенностей таких ОС рекомендуем статью. Отметим, что в ThreadX, несмотря на прямое отсутствие процессов, есть их аналог — модули.

Впрочем, ограниченные объемы ресурсов никак не мешают использовать микроконтроллеры для решения узкоспециализированных задач. Более того, по меркам микроконтроллера, 128 КБ ROM и 64 КБ RAM – уже довольно внушительные цифры. Микроконтроллер, несмотря на отсутствие «большой» ОС, успешно может записывать файлы на USB флешку, обмениваться данными по сети, а некоторые реализации содержат специальные инструкции для цифровой обработки сигналов, то есть могут решать достаточно «тяжелые» задачи.

Все изложенное описывает картину достаточно укрупненно, так как везде есть исключения и оговорки. Например, на микроконтроллерах без MMU можно запустить ucLinux – порт «большого» Linux специально для микроконтроллеров без MMU (без защиты памяти, естественно, со всеми вытекающими последствиями). Как правило, для этого потребуются дополнительные микросхемы памяти, так как встроенной хватит только для загрузчика этой самой ucLinux.

Поддержать

Знания должны быть свободными. По этой причине все материалы находится в открытом доступе. Однако, была проделана не малая работа и потрачено очень много времени, чтобы изложить все в сжатой, но информативной форме. Маржа с набора не такая большая (меньше стоимости среднестатистического сертификата на coursera), а область весьма специфична и не популярна. Я буду рад любой поддержки данного сайта: вы можете купить набор, приобретя текст курса в виде книги (появится чуть позже), докупив книжку «Си для встраиваемых систем» или пожертвовать средства напряму. Все эти средства пойдут на еду, мотивацию создавать больше интересного материала и поддержания сайта (хостинг и домен стоят денег).

STM32L476G-EVAL

В качестве отладки более высокого уровня можно применить STM32L476G-EVAL (рис. 7) с контроллером STM32L476VGT6.

Особенности платы:

  • Рис. 7. Отладочная плата STM32L476G-EVAL

    контроллер ST STM32L476ZGT6 с 1 Мбайт Flash и 128 кбайт ОЗУ;

  • выполненный на плате программатор/отладчик STLINK/V2-1 с поддержкой USB;
  • LCD-дисплей на 320 сегментов;
  • TFT LCD-панель диагональю 2,8 дюйма с разрешением 320240 и сенсорным экраном;
  • два цифровых MEMS-микрофона;
  • слот для microSD-карт с поддержкой SD, SDHC, SDXC;
  • установленные микросхемы памяти: 16-Mbit (1Mx16 bit) SRAM, 128-Mbit (8Mx16 bit) NOR Flash, 256-Mbit QuadSPI Flash, RF-EEPROM;
  • IrDA-передатчик;
  • комплект микросхем STPMS2 для демонстрации возможностей построения счетчиков электроэнергии и работы со встроенным цифровым фильтром, применяемым при подключении внешних сигма-дельта-модуляторов;
  • кнопки сброса и пробуждения контроллера из спящего режима;
  • джойстик с кнопкой выбора;
  • возможность питания платы от USB либо от внешнего источника 5 В;
  • штыревые разъемы для доступа к выводам контроллера.

Семейство STM32L4

Рис. 1. Структурная схема микроконтроллеров STM32L4

Основные характеристики нового семейства (рис. 1):

  • ядро ARM Cortex-М4 32 бит;
  • частота тактирования 80 МГц;
  • поддержка DSP-инструкций;
  • до 1 Мбайт Flash-памяти;
  • до 128 кбайт SRAM-памяти;
  • напряжение питания 1,71…3,6 В;
  • внутренние RC-генераторы на 16 МГц и 32 кГц (для RTC);
  • внешний источник тактирования 4…48 МГц и для RTC — 32,768 кГц;
  • модули отладки SWD/JTAG, модуль ETM;
  • три 12-битных SAR АЦП;
  • два 12-битных ЦАП;
  • четыре цифровых фильтра для сигма-дельта АЦП;
  • два низкопотребляющих компаратора;
  • DMA-контроллер на 14 каналов;
  • 16 таймеров (16 и 32 разряда);
  • два сторожевых таймера (WWDG и IWDG);
  • коммуникационные интерфейсы: I2C, USART (ISO 7816, LIN, IrDA), SPI, I2S;
  • CAN 2.0 B Active;
  • USB OTG full speed 2.0;
  • аппаратное вычисление CRC;
  • LCD-контроллер 8х40 или 4х44 с повышающим преобразователем;
  • обычный или расширенный температурный диапазон –40…125 °C.

В настоящий момент производитель вывел на рынок 19 новых микроконтроллеров линейки STM32L4, условно разделенных на два семейства: STM32L476 и STM32L486 (рис. 2). Особенность семейства STM32L486 заключается в наличии встроенного модуля шифрования AES (Advanced encryption standard hardware accelerator). Разработчику доступны как небольшие бюджетные микроконтроллеры в корпусах LQFP64, так и более солидные модели с 1 Мбайт Flash-памяти в корпусах LQFP144.

Рис. 2. Линейка микроконтроллеров STM32L4

В ближайшее время компания STMicroelectronics планирует значительно расширить данную линейку. В частности, для высокопроизводительных приложений потребителю будут предоставлены микроконтроллеры с объемом SRAM-памяти, увеличенным до 288 кбайт, а для задач, предусматривающих небольшой бюджет или требования по минимизации размеров, будут предложены контроллеры в UFQFPN-корпусах на 32 ножки. Таким образом, при сочетании высокой производительности, сверхнизкого потребления и доступной цены специалисты получат настоящий бестселлер для портативных устройств.

Підєднуємо бібліотеку до проекту

Запускаємо свій засіб розробки. Я використовую, або «CubeIDE for STM32», або «Atolic True Studio for STM32». Обидві IDE абсолютно безкоштовні. Відкриваємо проект згенерований CubeMX або CubeIDE і додаємо файли бібліотеки до проекту. Файли з розширенням *.h до теки INC проекту, а файли з розширенням *.c до теки SRC проекту. 

Бібліотека містить такі файли:

  • colors.h — визначення кольорів
  • fonts.h — структура шрифтів та перелік шрифтів
  • ili9341.h — визначення, макроси, прототипи функцій бібліотеки
  • image.h — структура для зображень, та перелік зображень
  • registers.h — визначення регістрів дисплею
  • STLogo.c — приклад картинки 240X240 для демонстрації
  • font12.c — шрифт 12 пікселів у висоту
  • font16.c — шрифт 16 пікселів у висоту
  • font20.c — шрифт 20 пікселів у висоту
  • font24.c — шрифт 24 пікселів у висоту
  • font8.c — шрифт 8 пікселів у висоту
  • ili9341.c — містить всі функції бібліотеки
  • example.c — містить демо-код, додати до файлу main.c свого проекту у відповідні секції коду.

Всі шрифти запозичив у ST, які знаходяться у репозиторії CubeMX за шляхом наприклад: «C:\Users\ваш_логін\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.1\Utilities\Fonts».

Example (please unzip the app you like):

  • f103c8t_app: (stm32f103c8t HAL applications, cubemx, truestudio)
  • f103c8t_app_rtos: (stm32f103c8t HAL-FreeRtos applications, cubemx, truestudio)
  • f407vet_app: (stm32f407vet HAL-applications, cubemx, truestudio)
  • f407vet_app_rtos: (stm32f407vet HAL-FreeRtos applications, cubemx, truestudio)
  • f407vet_app_fsmc: (stm32f407vet HAL applications, FSMC, cubemx, truestudio)
  • f407vet_app_rtos_fsmc: (stm32f407vet HAL-FreeRtos applications, FSMC, cubemx, truestudio)
  • f407vet_app_fsmc16: (stm32f407vet HAL applications, FSMC 16 bit, cubemx, truestudio)
  • f407zet_app_fsmc16_extsram: (stm32f407zet HAL applications, FSMC 16 bit, external 1MB SRAM, cubemx, truestudio)

Стандартная часть

Заголовочный файл предоставляет интерфейс к ядру. Для stm32f103c8 это , так как он работает на Cortex-M3. Для Cortex-M0+ это будет файл .

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

xxxxxxxxxx
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) {
    NVIC->ISER = (1 << ((uint32_t)(IRQn) & 0x1F));
}

Вам не нужно работать с регистрами ядра напрямую.

Другие файлы нам не столь интересны, но справедливости ради упомянем их. Например файл содержит обертки инструкций, а — обертки некоторых важных системных функций.

xxxxxxxxxx
__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) {
  register uint32_t result;
  __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
  return(result);
}

Если вы не разрабатываете приложение на самом низком уровне, то заглядывать в эти файлы незачем. Тем не менее, подробное описание работы ядра можно найти в документе ARM — Cortex-M3 Devices Generic User Guide, и мы им даже воспользуемся при настройке системного таймера.

Что есть у Microsoft?

Microsoft традиционно занимается «большими» ОС, среди которых тоже есть специализированные решения в виде Windows 10 IoT Enterprise LTSC, значительно дешевле настольных систем и со специальными возможностями встраивания. Windows 10 IoT Enterprise требует практически полноценного (хоть и промышленного и малогабаритного) компьютера для запуска. Впрочем, есть редакция Windows 10 IoT Core, ориентированная только на приложения UWP, где требования к системе ниже: она успешно запускается на Raspberry Pi 2.

Здесь же нельзя не упомянуть класс операционных систем Windows Embedded Compact, которые могут работать на системах, по вычислительным возможностям находящимся где-то между полноценными компьютерами и микроконтроллерами. Compact – отдельный класс ОС, не совместимых с «настольной» Windows, требующих особых средств разработки. Последний выпуск датируется 2013-м годом, далее ОС развития не получила, но все еще продается и поддерживается, как и несколько предыдущих версий.

С развитием Интернета вещей Microsoft постепенно стал предлагать решения и для систем с ограниченными ресурсами, таких, как микроконтроллеры. Предполагается, что именно на микроконтроллерах будут создаваться именно сами устройства Интернета вещей, отправляющие данные в облако и принимающие команды от него.

На данный момент доступны и сторонние реализации среды выполнения для C#: https://www.nanoframework.net/, https://www.wildernesslabs.co/. Отметим, что последняя аппаратная платформа вполне подходит и для запуска ucLinux, так что к выбору ОС следует относиться, как к выбору инструмента для решения задачи: что удобнее, то и применяем.

В 2019 году Microsoft поглощает Express Logic, и среди решений для микроконтроллеров от Microsoft появляется Azure RTOS, которая раньше называлась X-WARE IoT Platform. В Azure RTOS входит ядро ThreadX вместе с дополнительными компонентами, а также добавлены средства подключения к Azure IoT Hub и Azure IoT Central. Само название Azure RTOS подчеркивает применение совместно с сервисами Azure для устройств Интернета вещей.

В состав Azure RTOS входят:

  • сама ОС ThreadX, а именно, ядро, планировщик, реализующий многозадачность и синхронизацию задач;
  • стек TCP/IP NetX/NetX Duo;
  • стек FAT FileX;
  • стек USB Host/Device/OTG USBX;
  • реализация графического интерфейса GUI: GUIX и инструмент разработки (GUIX Studio);
  • реализация равномерного износа флеш-памяти для FileX: LevelX;
  • система трассировки событий TraceX;
  • SDK для Azure IoT поверх NetX Duo – готовые средства для подключения устройства к службам Azure.

Нельзя не отметить одно из специализированных решений высокой готовности: Azure Sphere. Это — безопасная платформа для приложений интернета вещей со встроенными механизмами коммуникаций и безопасности. Она представляет собой микроконтроллер (скорее даже SoC) с установленным ядром Linux, а также готовыми облачными сервисом для доставки обновлений безопасности.

АЦП ADC (Analog to digital converter)

Микроконтроллеры содержат на борту три 12-битных аналого-цифровых преобразователя последовательного приближения с возможностью подключения до 24 внешних аналоговых каналов. АЦП работают на скоростях до 5,53 мегасемпла (при разрешении 12 бит). Для увеличения скорости преобразования до 8,8 мегасемпла можно уменьшить разрешение до 6 бит. Кроме внешних каналов, на АЦП также поступают сигналы от пяти внутренних источников: температурного сенсора, выходов цифро-аналоговых преобразователей (DAC1 и DAC2), батареи и внутреннего источника опорного напряжения. Оцифровка входных аналоговых сигналов может выполняться в режиме одиночного или непрерывного преобразования. И в том, и в другом режиме количество и последовательность обрабатываемых каналов задается разработчиком.

На каждый АЦП доступно до трех аналоговых Watchdog. Аналоговый Watchdog представляет собой аналоговый компаратор с верхним и нижним программируемым порогом срабатывания. Результат преобразования сравнивается с этими величинами, и если он выходит за пределы коридора, то формируется прерывание.

Следует отметить, что в корпусе LQFP64 возможно использование только встроенного источника опорного напряжения. Для подключения своего источника необходимо взять любой другой корпус.

Операционные усилители OPAMP (Operational amplifier)

Микроконтроллеры STM32L4 имеют два встроенных операционных усилителя, которые могут быть использованы как самостоятельные усилители или как программируемый усилитель — PGA (Programmable Gain Amplifier). Выходы операционных усилителей могут быть подключены на вход АЦП или выведены наружу.

Операционные усилители имеют низкое напряжение смещения (1,5 мВ после калибровки, 3 мВ при заводской калибровке) и работают в режиме rail-to-rail. Граничная частота составляет 1,6 МГц. В режиме низкого потребления для питания необходимо лишь 30 мкА.

При использовании операционного усилителя как самостоятельного элемента усиление задается внешней цепочкой элементов, то есть мы меняем коэффициент усиления самостоятельно. Если усилитель применяется в качестве элемента совместно с PGA, усиление задается программно и выставляется встроенными резисторами. Коэффициент усиления меняется в пределах от 2 до 16.

Питание микроконтроллеров STM32L4

Питание микроконтроллера разделено на несколько доменов (рис. 3). Это позволяет более грамотно организовать питание периферии и уменьшить шумы, поступающие из одной части в другую. Для подачи напряжения в микроконтроллер и сохранения его полной функциональности необходим источник на 3…3,6 В. Рассмотрим подробнее организацию питания:

  • Рис. 3. Система питания микроконтроллеров STM32L4

    VDD = 1,71…3,6 В: внешнее питание для I/O, внутреннего регулятора и аналоговых систем, таких как сброс, управление питанием и внутреннее тактирование;

  • VDDA = 1,62 (ADC/COMP)/1,8 (DAC/OPAMP)…3,6 В: внешнее аналоговое питание для АЦП, ЦАП, операционных усилителей, компараторов и источника опорного напряжения. Питание VDDA независимо от VDD;
  • VDDUSB = 3,0…3,6 В: внешнее питание для USB-трансивера. Питание VDDUSB независимо от VDD;
  • VDDIO2 = 1,08…3,6 В: внешнее питание для 14 I/O (PG). Питание VDDIO2 независимо от VDD;
  • VLCD = 2,5…3,6 В: LCD-контроллер может быть запитан внешним источником через VLCD-пин или внутренним повышающим преобразователем;
  • VBAT = 1,55…3,6 В: питает часы реального времени RTC, внешний генератор 32 кГц и регистры восстановления, когда отсутствует основное питание.

Для поддержания правильной работы при подаче, снятии или колебаниях напряжения микроконтроллер имеет несколько встроенных супервизоров питания. Супервизор BOR (Brown out Reset) обеспечивает сброс контроллера при включении питания, пока его уровень не достигнет определенного порога. Это избавляет от необходимости использования внешних супервизоров питания. BOR имеет гистерезис, поэтому можно не опасаться дребезга напряжения. В дополнение к BOR возможен сброс по схемам POR (Power On Reset) и PDR (Power Down Reset).

Для оптимизации энергопотребления в микроконтроллерах STM32L4 применена динамическая адаптация напряжения внутреннего понижающего регулятора в зависимости от рабочей частоты контроллера: для обеспечения высокой производительности напряжение увеличивается, для сохранения энергии частота и, следовательно, потребление уменьшается.

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

  • Режим Sleep. В этом режиме только ядро останавливает свою работу. Вся периферия продолжает действовать и пробуждает процессор при наступлении определенного прерывания или события.
  • Режим Low power run. Устанавливается ограничение на максимальную частоту ядра в 2 МГц. Питание ядра осуществляется от низкопотребляющего регулятора напряжения. Выполнение кода происходит из SRAM- или Flash-памяти. Тактирование можно реализовать через HSI16.
  • Режим Low power Sleep. Ядро остановлено, большая часть периферии активна. При появлении прерывания или наступлении события система переходит в Low power run.
  • Режим Stop (с активным RTC или без него). Все тактирование в домене VCORE, PLL, MSI, HSI и HSE отключено. LSE и LSI продолжают функционировать. Данные SRAM и контекст регистров сохранен. Часы реального времени RTC могут продолжать работать. Периферия с возможностью пробуждать контроллер остается доступной.
  • Режим Standby (с активным RTC или без него). Режим позволяет добиться ультранизкого энергопотребления. Внутренний регулятор напряжения выключен, и питание всех элементов ядра прекращено. PLL, MSI RC, HSI16 RC и HSE также отключены. Супервизор BOR (Brown out Reset) остается активным. Во время работы в режиме Standby можно задавить подтяжку каждой ножки I/O к питанию/«земле» или оставлять плавающей. Это весьма удобно при необходимости обеспечить нужный уровень внешних сигналов при неработающем микроконтроллере. После вхождения в режим Standby содержимое памяти SRAM1 и регистров теряется, за исключением данных в зоне Backup. При необходимости содержание SRAM2 может быть сохранено при запитке от низкопотребляющего регулятора. Микроконтроллер выходит из этого режима при наступлении одного из следующих событий: внешний сброс (вывод NRST), появление фронта на одном из выводов WKUP, сигнал от RTC.
Рис. 4. Режимы питания микроконтроллеров STM32L4

Как устроен Zephyr?

Система во многом схожа с Linux. Как и Linux, Zephyr содержит menuconfig или guiconfig (то же самое, но с отдельным GUI, а не в консоли), которые конфигурируют программные части системы на основе файлов Kconfig. Это могут быть различные драйверы, поддержка сетевых функций и т.д. Для описания же аппаратной части используется структура device tree. С помощью неё конфигурируются диапазоны адресов регистров в памяти, периферия, линии прерываний и др.

В качестве системы сборки Zephyr иcпользует CMake. Поэтому каждое приложение должно иметь CMakeList.txt в качестве точки входа системы сборки. Сборка проекта осуществляется с помощью West. Команды west упрощают настройку приложения. Например, написав программу, собрать её под STM32F746G-Discovery надо командой:

Не меняя исходный код, программа под NUCLEO-F207ZG собирается командой:

Подробнее про доступные команды можно узнать, вызвав подсказку:

Для использования определенной версии Zephyr и подключения сторонних модулей используется файл манифеста west.yml.

Выводы

Стоит ли пробовать Zephyr? Кратко – да. Zephyr действительно поддерживает много фишек «из коробки». Достаточно сделать пару кликов в guiconfig и вот в проекте появляется поддержка UART, SPI, Ethernet. Посмотрел пример, повторил, изменил, оно ещё и работать будет. Возможность не переписывать исходный код при переезде на другую плату тоже подкупает.

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

Оцените статью:
Оставить комментарий