Category Archives: ARM. Учебный курс

ARM. Учебный курс. IAR EWARM. Создание проекта — часть 3. Подключение Colink: танцы с бубном и без.

В далеком 2010 году товарищ rtxonair чирканул пару статей про ARM + IAR и в какую сторону вообще копать. Статьи получились толковыми, но их было раз-два и все, а информации по IAR как было негусто, так и осталось (даже сегодня, спустя добрых пять лет). А если такая информация и появляется, то чисто обрывочно, в форме «смотрите, я тут опять диодиком помигал». Впрочем, довольно нытья, мы здесь не за этим :)

▌Водная часть
Наглым образом пропустив вопрос «А-почему-IAR?» (ответ: потому-что-не-Keil), обращу сразу внимание, что в комплекте с платой Pinboard II идет отладочный Colink-адаптер на Кокосе:

Автор статьи (DySprozin) предполагает, что вы уже ознакомились хотя бы с первой частью вышеупомянутого курса, а также внимательно прочитали в мануале быстрого старта, как правильно подключать модуль STM32 (чтобы ничего не пожечь) и как правильно его прошить. В общем, если на данный момент вы умеете «помигать диодиком», а программа Flash Loader Demo работает исправно, то вам зеленый свет, движемся дальше!


(далее…)

Read More »

Установка и конфигурация FreeRTOS

На самом деле это скорей интеграция ее в проект. С технической точки зрения выглядит как подключение библиотек. Как той же CMSIS или SPL. Добавляем инклюдники, добавляем файлы в проект и все. Можно взять готовый пример и переколхозить, но в этом случае есть шанс прозевать какие-нибудь детали и получить странные эффекты. Поэтому начну с нуля, в качестве основы будет модуль Pinboard STM32F103C8T6 и Keil uVision. Под него все мы и соберем.
 

▌Качаем ОС
Тащим архив с freertos.org. Это довольно толстая солянка где 99% занимают примеры под разные архитектуры. Вот его примерная структура:

 

Вся ОС по большей части прячется вот в этих нескольких файлах:

  • queue.c — функции очередей и мутексов
  • tasks.c — функции работы с задачами
  • timers.c — функции работы с таймерами
  • croutine.c — функции работы с сопрограммами
  • event_groups.c — функции работы с флагами
  • list.c — тут все для отладки
  • port.c — платформозависимые параметры. У каждого МК этот файл свой
  • portmacro.h — настройки платформы. Тоже индивидуальный для каждого типа МК
  • FreeRTOSConfig.h — настройки ОС. Платформозависимо, а еще зависит от целей и проекта

 
(далее…)

Read More »

FreeRTOS для чайников. Краткое описание.


Бытует мнение, что RTOS это некий хардкор для избранных. Что там все сложно, замудрено и новичкам туда соваться бестолку. Отчасти тут есть доля истины, такие системы крайне сложны в отладке, но и то лишь тогда, когда вы забиваете контроллер под завязку и работаете на пределе оперативной памяти и быстродействия. Тогда да, словить какой-нибудь dead lock или пробой стека можно на раз. И попробуй найти где это случилось в этой асинхронной системе. Но простые задачи на RTOS реализуются еще проще и с меньшим количеством мозга.
 

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

▌FreeRTOS?
Почему именно она? Она популярна, она Free и она портирована на огромное количество архитектур, под нее существуют плагины для Keil и IAR и всякие примочки для PC. При этом она довольно легкая и функциональная.
 

Я не буду вам сейчас тут расписывать все эти прототипы функций, порядок записи, технические тонкости и прочее. Это все есть в технической документации и в замечательном цикле статей Андрей Курница, что был в журнале Компоненты и Технологии в 2011 году. PDF статьи вы найдете в конце.
 

Я лишь на пальцах и псевдокоде быстро распишу те инструменты которыми владеет FreeRTOS, чтобы когда вы будете читать более подробную документацию за деревьями не потеряли лес :)
 

Ну и все сказанное тут справедливо и для большинства других RTOS. Т.к. механизмы в целом все одни и те же и никто ничего нового еще не придумал.
 
(далее…)

Read More »

ARM. Учебный курс. Внешние прерывания

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

У STM32 за внешние прерывания отвечает EXTI контроллер. Его основные возможности:
 

До 20 линий прерываний (в реальности несколько меньше, зависит от контроллера)
Независимая работа со всеми линиями. Каждой линии присвоен собственный статусный бит в спец регистре
Улавливает импульсы длительность которых ниже меньше периода частоты APB2
 

EXTI Может генерировать:

  • Прерывания — это когда происходит переход на обработчик
  • События — когда обработчик не вызывается, просто поднимается флажок. Может разбудить проц или пнуть какую периферию, АЦП, например.
  • Софтверные прерывания — то же самое, что и обычные прерывания, но мы их вызываем вручную, записью бита в регистр.

 
(далее…)

Read More »

ARM Учебный курс. USART

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


 

Вот и у STM32 он есть. Да не один, а целых дофига. В том контроллере, что стоит на Pinboard II в модуле STM32 — STM32F103C8T6 — их три. Обычно хватает и одного. Но три это же лучше! :)
 

Вообще у STM32 сей девайс навороченный и умеет не только байтики в терминалку слать в классических режимах (асинхронном, синхронном, мультипроцессорном), но и кое чего еще. В частности он может работать в
 

  • Однопроводном полудуплексном режиме
  • В режиме SmartCard — т.е. на том же языке на котором общаются с телефоном SIM карты. Вообще там вроде бы протокол отличается только таймингами немного
  • В режиме IrDA — помните на старых телефонах была такая фиговина? Вот это оно. Отличается от обычного протокола тем, что тут данные передаются краткими импульсами. Этакими вспышками. А 0 и 1 ловятся по паузам между ними. Так себя фотоприемники видать лучше чувствуют.
  • Также есть LIN режим. LIN это автомобильная сеть, этакий CAN для бедных. Вон во всяких приорах стекла и сигналки на LIN шине сидят.

 

В общем, полный фарш. Расписывать все не буду. Только самое основное. Иначе это книгу написать можно.
 
(далее…)

Read More »

ARM. Учебный Курс. SysTick — Системный таймер

Продолжаем потрошить кортексы М3. Есть у них у всех, вне зависимости от производителя, такая штука как системный таймер — SysTick. Это часть ядра. Тупейший и примитивный таймер. Он ничего не умеет кроме как генерировать прерывание в заданном промежутке времени. Используется обычно во всяких RTOS для проворачивания диспетчера. К тому же его прерывание имеет высокий приоритет.
 

Краткое описание
Сам таймер 24 разрядный. И тикает вниз от предзагруженного значения до нуля, после чего перезагружается вновь и генерирует прерывание. Управляется он четырьмя регистрами:

 
Таблица из ARM Cortex M3 Reference Manual
 
(далее…)

Read More »

ARM. Учебный Курс. Прерывания и NVIC — приоритетный контроллер прерываний

Стандартной плюхой ядра Cortex M3 является NVIC — контроллер приоритетных векторных прерываний. Сейчас я разжую что это такое и с чем это едят.
 

Прерывания и события
Вообще, если пошерстить мануал, то везде при разборе периферии рассматриваются interrupt/event. Может сложиться ощущение, что это одно и то же. Но это не так.
 

Interrupt — это прерывание. При прерывании обычно программа пакует регистры в стек и бросается по вектору, а оттуда через JMP сигает уже в обработчик прерывания. В кортексах все немного не так. Тут вектора прерывания это просто вектор-адреса лежащие в нужном месте. В виде констант. А при прерывании прога не прыгает на вектор, а берет этот вектор-адрес и сразу же пихает его в програмный счетчик, тем самым переходит сразу на обработчик. Так быстрей, исчезает лишняя операция по переходу на вектор.
 

Event — это аппаратное событие. Опустел буфер UART — держи event, натикал таймер — еще один event. Событие может вызвать прерывание, может запустить какую-либо периферию, например пнуть DMA, чтобы оно выгрузило данные. Но событие далеко не всегда может вызвать прерывание. Каждое прерывание вызывается событием, но не каждое событие вызывает прерывание. Вот. Так что надо отличать.
 

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

(далее…)

Read More »

Определение текущей тактовой частоты при отладке

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

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

То в STM32, где описание системы RCC занимает 35 страниц убористого текста, схема не влезает на экран, а куча библиотек, вроде CMSIS и SPL или визардов, наподобие того что есть в CoIDE, генерируют стартовый код, определить текущую тактовую частоту превращается в непростую задачу. Ее и будем решать.
 

Как же понять, что у нас получилось на SYSCLOCK после всех этих HSI, HSE, делителей, мультиплексоров и PLL умножителей?
  (далее…)

Read More »

Работа с STM32F10x Standard Peripherals Library

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

Как это выглядит
Если вы пыталисьи курить STM32, то наверняка смотрели чужие исходники. И наверняка часто видели в них шнягу вида:
 

1
2
3
4
5
6
7
8
9
  /* GPIOD Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
 
  /* Configure PD0 and PD2 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 
  GPIO_Init(GPIOD, &GPIO_InitStructure);

 
Вот это и есть пример работы с STM32 Standard Peripherals Firmware Library, а точнее конфигурация вывода контроллера посредством стандартных функций этой библиотеки.
 
(далее…)

Read More »

ARM. Учебный Курс. Порты GPIO

Над портами инженеры STM поубивались знатно. Такой прорвы настроек и возможных режимо я, честно говоря, даже не ожидал. Порты у STM32F1xx могут работать в режиме*:
 

  • Вход Hi-Z
  • Вход с подтяжкой вверх
  • Вход с подтяжкой вниз
  • Аналоговый вход (для каналов АЦП)
  • Выход с открытым коллектором (стоком, если быть точным)
  • Выход тяни-толкай (push-pull)
  • И альтернативные функции, т.е. работа от периферии. Тут у нас формируется выход вида вида тяни-толкай или открытый коллектор.

 
(далее…)

Read More »

Прошивка ARM Cortex M3 на примере STM32 и LPC1300

Готовую программу надо каким-либо образом запихать в контроллер. Для этого существует множество способов.

JTAG/SWD адаптер
Так как часто для отладки под ARM используется JTAG, то этот метод получается наверное самым популярным. Для этой цели используется какой-либо адаптер. Например я использую CoLinkEX так что показывать буду на его примере. Там все просто — подключаешь адаптер к контроллеру стандартным SWD или JTAG шлейфом. Через линии NRST/TDI/TDO/TCK/TMS для JTAG или через SWO/SWOCLK/SWDIO/NRST для SWD режима. На адаптере моей верси CoLinkEX оба эти разьема выведены на одну колодку, так что получается как бы сразу и JTAG и SWD соединение. А там какое надо такое и выбираешь. Особой разницы в отладке/прошивке между ними нет.

И прошиваешь либо из среды Keil.

Либо используя утилитку CoFlash oт CooCox.com (далее…)

Read More »

ARM. Учебный курс. Тактовый генератор STM32

Нам разум дал стальные руки-крылья,
А вместо сердца — пламенный мотор.

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

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

Read More »

ARM. Учебный курс. IAR EWARM. Создание проекта часть 2. CMSIS и Standard Peripherals Library

Каждый выбирает для себя
женщину, религию, дорогу.

Итак, создавать проекты и настраивать их параметры, в минимально необходимом объеме, мы научились, и руки так и чешутся попробовать свои силы в программировании микроконтроллера. Не буду оригинальничать, и предложу вам попробовать свои силы на классическом примере – поморгать светодиодом, да и название проекта из прошлой статьи недвусмысленно на это указывало :-)

Сей, кажущийся тривиально простым пример (который на самом деле таким и является), на самом деле все-таки несет в себе некий глубинный смысл, т.к. на нем мы научимся подключать в свой проект CMSIS (что это такое, уже рассказал уважаемый Di Halt в своей статье про создание проекта в Keil ) и узнаем о существовании Standard Peripherals Library (стандартной библиотекой работы с периферией), вещью весьма полезной и часто упрощающей жизнь программиста.
(далее…)

Read More »

ARM. Учебный курс. IAR EWARM. Создание проекта.

Если ничего нет, но очень хочется… :-)

Не Keil’ом единым…
Есть такая компания, называется она IAR Systems. Делает много вещей, в том числе и среды разработки и компиляторы для различных архитектур, список которых довольно обширен. Также в числе продуктов компании есть отладчики, наборы разработчиков и т.д. Более подробно со всем этим разнообразием можно ознакомиться на их родном сайте iar.com

Нас же сейчас интересует среда для разработки приложений для архитектуры ARM, в частности Cortex-M3. Есть в их ассортименте и такой продукт и называется он EWARM, что является сокращением от Embedded Workbench for ARM, что в свою очередь, в моем вольном переводе на великий и могучий, звучит примерно как «Среда разработки для встроенных систем на архитектуре ARM», впрочем, за точность я не ручаюсь…

Данная среда поддерживает большое количество микропроцессоров и микроконтроллеров построенных на базе архитектуры ARM разных версий. Полный список можно посмотреть на их сайте Т.к. это серьезная среда разработки, то она поддерживает различные отладочные интерфейсы и средства сопряжения как производства самой IAR так и сторонних компаний, имеет встроенный отладчик, симулятор и т.д.

Но по причине отсутствия у меня какого либо девайса для внутрисхемной отладки рассказать я про все это не могу. А пользоваться симулятором как-то в голову даже не приходило. Я по старинке, пишу, заливаю в контроллер и смотрю что происходит. (Зато их есть у меня. И я вам скоро выдам пример того, какой это рулез. прим. DI HALT)

Есть мнение, что компилятор С/С++ у IAR один из самых лучших, но за это я не ручаюсь, хотя кое какие мои сравнения с Keil uVision v3 показали его превосходство.

В общем, это мощнейшая полноценная среда для разработчика. Кому интересно, изучайте описания на официальном сайте Есть ли версия для линукса я на сайте нигде не углядел, поэтому точно не скажу. (Боюсь, что как всегда ;) Впрочем, там есть могучий и универсальный GCC и обязательно есть поддержка ARM. Так что если есть желающие показать старт проекта под линухом — ждем с распростертыми обьятьями. Пишите на dihalt@dihalt.ru прим. DI HALT)
(далее…)

Read More »

ARM. Учебный Курс. Keil + CMSIS. Создание проекта

Хотел вначале толкнуть речугу за ядро, но потом подумал, что этой то инфы на каждом углу, да и рано пока еще. А вот создать простейший проект будет полезней. Также я решил краешком поддерживать и описывать не только STM32F103, но и LPC1343. LPC я буду уделять меньше времени, скорей показывать различия и аналогии. Но, думаю, проблем в освоении не возникнет.

Среда разработки
Я тут однозначно остановился на Keil uVision 4. Эта IDE, пожалуй, является одной из самых мощных и самых массовых не только на ARM, но и на С51 и ряде других камней.
Собственный, весьма неплохой, Си компилятор. Весьма продвинутая и функциональная IDE, плюс в нагрузку там идет мощный симулятор, в том числе с поддержкой периферии, а также всяких виртуальных приборов.
Не как в Proteus, конечно. Схему там не нарисуешь, но вот поглядеть на виртуальный логический анализатор или UART можно запросто. Плюс удобная система создания мастеров кода на ровном месте (всякие визарды аля CVAVR тут дружно пьют йад).
А также Keil поддерживает огромное число разных отладочных систем и JTAG адаптеров. В том числе и ColInkEx, который юзаю я.

Недостатки тоже есть. Во-первых, Keil uVision идет только под винду. Так что линухоиды либо извращаются с виртуалками (но не факт что получится), либо обламываются и корячат из подручного материала что то свое. Впрочем, им не привыкать к геморою со спец софтом :)
Во-вторых, Keil платный. И стоит он весьма неслабых денежек.
Кряки, конечно же, валяются на каждом углу. Но! Мы же честные и на наше счастье в Keil есть демо режим, дающий нам ограничение в 32кила. Под наши заморочки с Cortex M3 хватит вполне (а в LPC1343 больше и нету, кстати ;) ).
(далее…)

Read More »

ARM. Учебный Курс. Подключение контроллера и демоплата

Выбор контроллера
Контроллеров на ядре ARM Cortex множество. И мне пришлось поломать голову чтобы выбрать и взять за основу. В народ уверенно идут две линейки это LPC1xxx от NXP и STM32 от ST. Остальные дорогие и/или труднодоставаемые, либо в неадекватных для домашнего применения корпусах. Решил если брать, то из этой серии. Но какую именно? В результате поковырял и те и другие.
 

И вот мои соображения:
 

NXP
Берут низкой ценой. Реально многие из них продаются рублей по 50-80р за микруху. И это в розницу! Может это, конечно, маркетинговая акция и скоро все изменится. Но ситуация такая есть. С другой стороны, у NXP три линейки процов. LPC1000, LPC1300, LPC1700 (про LPC2xxx речь не идет, там ARM7 TDMI ядро).
 

  • LPC1000 закастрированные донельзя (но дешевые). Там от всех вкусняшек ARM ядра только таймер да 32 разряда. Корпуса от 33 до 48 выводов. Есть даже PLCC, но обычно LQFP.
  • LPC1300 уже интересней, но тоже нет ряда полезных фич вроде DMA или быстрого доступа к портам. Корпус от также от 33 до 48 выводов. Самый адекватный LQFP.
  • LPC1700 уже как в лучших домах — есть полный фарш, но камни там с 80ю и более ногами. И куда их такие здоровые?

 

Причем все три линейки весьма сильно отличаются друг от друга. Т.е. код с LPC1300 копипастой хрен перетащишь на LPC1700. Будут отличаться и имена регистров, и способы доступа к периферии. По разному будет выполняться конфигурация портов. В общем, хочешь перелезть на линейку послабже — изучай даташит с нуля. Конечно библиотека CMSIS сильно все сглаживает, но тем не менее от лишнего чтения доков не избавляет. Ну и документация у NXP тот еще аббадон. Давно я такой каши не видел. Бррр…
 

STM
Стоят дороже. Пока самый дешевый STM32F103C8T6 видел за 150р штука. Где найдете дешевле свистните. Но зато у них одна линейка F10x и один даташит на всех. Более того, ходят слухи, что периферия очень похожа и на STM8, так что при случае параллельно раскурим и эти камни :)
 

Процессоры в линейке отличаются только количеством ног и наличием на борту тяжелой периферии вроде USB/Ethernet/CAN. Причем в том же STM32F103C8T6 есть уже и DMA и полноценный BitBanding и все это в корпусе LQFP48 т.е. вполне компактный и паяемый в домашних условиях. Сами камни внутри выглядят более продумаными чтоль. Нет зоопарка периферии на разных линейках. Хорошо расписанные библиотеки CMSIS (о том что это такое расскажу попозже). Т.е. изучил его один раз и можешь уже смело программировать хоть 36 ногих козявок, хоть 100 выводных монстров. Плюс очень многие выводы у STM32F103 имеют 5V Tollerance т.е. их можно смело заводить на пятивольтовую периферию.
 

В общем, мне STM32 понравился больше. Хотя от применения LPC я не отказываюсь, но подробно на них останавливаться не буду, в лучшем случае вскользь упоминать.
 

(далее…)

Read More »

ARM. Учебный Курс. Вводная

Intro
Потихонечку, дабы не выпадать из модных течений, решил я запилить обучалку по ARM контроллерам.

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

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

Также, по дефолту, буду считать, что читатель, раз освоился на PIC/AVR/C51, умеет читать даташиты и ковырять инфу сам.
Это не значит, что я не буду отвечать на вопросы в комментариях. Буду, но знайте, что для этого мне придется вместо вас лезть в даташит и разбираться. Я могу это делать — знаете как быстро в таком режиме идет самообразование! Метод «Я гуру и вам щас все вжую» пинает круче любой сессии, т.к. в отличии от сессии не кончается никогдааа :) А могу не делать. В зависимости от моего свободного времени и желания общаться :) Да, у меня есть преимущество — освоив несколько разных архитектур я уже задницей чую где и что надо искать в даташите, но свою голову никто не отменял :)
(далее…)

Read More »