Клоки, тайминги и шины. ARM

В последние годы 32 разрядные микроконтроллеры (МК) на основе процессоров ARM стремительно завоёвывают мир электроники. Этот прорыв обусловлен их высокой производи тельностью, совершенной архитектурой, малым потреблением энергии, низкой стоимостью и развитыми средствами программирования.

КРАТКАЯ ИСТОРИЯ
Название ARM является аббревиатурой Advanced RISC Machines, где RISC (Reduced Instruction Set Computer) обозначает архитектуру процессоров с сокращённым набором команд. Подавляющее число популярных МК, а пример семейства PIC и AVR, также имеют архитектуру RISC, которая позволила увеличить быстродействие за счёт упрощения декодирования инструкций и ускорения их выполнения. Появление совершенных и производительных 32 разрядных ARMмикроконтроллеров позволяет перейти к решению более сложных задач, с которыми уже не справляются 8 и 16 разрядные МК. Микропроцессорная архитектура ARM с 32 разрядным ядром и набором команд RISC была разработана британской компанией ARM Ltd, которая занимается исключительно разработкой ядер, компиляторов и средств отладки. Компания не производит МК, а продаёт лицензии на их производство. МК ARM – один из быстро развивающихся сегментов рынка МК. Эти приборы используют технологии энергосбережения, поэтому находят широкое применение во встраиваемых системах и доминируют на рынке мобильных устройств, для которых важно низкое энергопотребление. Кроме того, ARM микроконтроллеры активно применяются в средствах связи, портативных и встраиваемых устройствах, где требуется высокая производительность. Особенностью архитектуры ARM является вычислительное ядро процессора, не оснащённое какими либо дополнительными элементами. Каждый разработчик процессоров должен самостоятельно до оснастить это ядро необходимыми блоками под свои конкретные задачи. Такой подход хорошо себя зарекомендовал для крупных производителей микросхем, хотя изначально был ориентирован на классические процессорные решения. Процессоры ARM уже прошли несколько этапов развития и хорошо известны семействами ARM7, ARM9, ARM11 и Cortex. Последнее делится на подсемейства классических процессоров CortexA, процессоров для систем реального времени CortexR и микропроцессорные ядра CortexM. Именно ядра CortexM стали основой для разработки большого класса 32 разрядных МК. От других вариантов архитектуры Cortex они отличаются, прежде всего, использованием 16разрядного набора инструкций Thumb2. Этот набор совмещал в себе производительность и компактность «классических» инструкций ARM и Thumb и разрабатывался специально для работы с языками С и С++, что существенно повышает качество кода. Большим достоинством МК, построенных на ядре CortexM, является их программная совместимость, что теоретически позволяет использовать программный код на языке высокого уровня в моделях разных производителей. Кроме обозначения области применения ядра, разработчики МК указывают производительность ядра CortexM по десятибалльной шкале. На сегодняшний день самыми популярными вариантами являются CortexM3 и CortexM4. МК с архитектурой ARM производят такие компании, как Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Миландр, HiSilicon и другие.
Благодаря оптимизированной архитектуре стоимость МК на основе ядра CortexM в некоторых случаях даже ни же, чем у многих 8разрядных приборов. «Младшие» модели в настоящее время можно приобрести по 30 руб. за корпус, что создаёт конкуренцию предыдущим поколениям МК. МИКРОКОНТРОЛЛЕРЫ STM32 Рассмотрим наиболее доступный и широко распространённый МК семейства STM32F100 от компании STMicroelectronics , которая является одним из ведущих мировых производителей МК. Недавно компания объявила о начале производства 32битного МК, использующего преимущества индустриального
ядра STM32 в недорогих приложениях. МК семейства STM32F100 Value line предназначены для устройств, где не хватает производительности 16разрядных МК, а богатый функционал «обычных» 32разрядных приборов является избыточным. Линейка МК STM32F100 базируется на современном ядре ARM CortexM3 с периферией, оптимизированной для применения в типичных приложениях, где использовались 16разрядные МК. Производительность МК STM32F100 на тактовой частоте 24 МГц превосходит большинство 16разрядных МК. Данная линейка включает приборы с различными параметрами:
● от 16 до 128 кбайт флэшпамяти программ;
● от 4 до 8 кбайт оперативной памяти;
● до 80 портов ввода вывода GPIO;
● до девяти 16разрядных таймеров с расширенными функциями;
● два сторожевых таймера;
● 16канальный высокоскоростной 12разрядный АЦП;
● два 12разрядных ЦАП со встроенными генераторами сигналов;
● до трёх интерфейсов UART с поддержкой режимов IrDA, LIN и ISO7816;
● до двух интерфейсов SPI;
● до двух интерфейсов I2С с поддержкой режимов SMBus и PMBus;
● 7канальный блок прямого доступа к памяти (DMA);
● интерфейс CEC (Consumer Electronics Control), включённый в стандарт HDMI;
● часы реального времени (RTC);
● контроллер вложенных прерываний NVIC.

Функциональная схема STM32F100 представлена на рисунке 1.

Рис. 1. Архитектура МК линейки STM32F100

Дополнительным удобством является совместимость приборов по выводам, что позволяет, при необходимости, использовать любой МК семейства с большей функциональностью и памятью без переработки печатной платы. Линейка контроллеров STM32F100 производится в трёх типах корпусов LQFP48, LQFP64 и LQFP100, имеющих, соответственно, 48, 64 и 100 выводов. Назначение выводов представлено на рисунках 2, 3 и 4. Такие корпуса можно устанавливать на печатные платы без применения специального оборудования, что является весомым фактором при мелкосерийном производстве.


Рис. 2. МК STM32 в корпусе LQFP48 Рис. 3. МК STM32 в корпусе LQFP64


Рис. 4. МК STM32 в корпусе LQFP100

STM32F100 – доступный и оптимизированный прибор, базирующийся на ядре CortexM3, поддерживается развитой средой разработки МК семейства STM32, которая содержит
бесплатные библиотеки для всей пе риферии, включая управление двига телями и сенсорными клавиатурами.

СХЕМА ВКЛЮЧЕНИЯ STM32F100C4
Рассмотрим практическое использование МК на примере самого простого прибора STM32F100C4, который, тем не менее, содержит все основные блоки линейки STM32F100. Принципиальная электрическая схема включения STM32F100C4 представлена на рисунке 5.


Рис. 5. Схема включения МК STM32F100C4

Конденсатор С1 обеспечивает сброс МК при включении питания, а конденсаторы С2-С6 фильтруют напряжение питания. Резисторы R1 и R2 ограничивают сигнальный ток выводов МК. В качестве источника тактовой частоты используется внутренний генератор, поэтому нет необходимости применять внешний кварцевый резонатор.


Входы BOOT0 и BOOT1 позволяют выбрать способ загрузки МК при включении питания в соответствии с таб лицей. Вход BOOT0 подключён к шине нулевого потенциала через резистор R2, который предохраняет вывод BOOT0 от короткого замыкания при его использовании в качестве выход ного порта PB2. С помощью соединителя J1 и одной перемычки можно из менять потенциал на входе BOOT0, определяя тем самым способ загрузки МК – из флэшпамяти или от встроенного загрузчика. При необходимости загрузки МК из оперативной памяти аналогичный соединитель с перемычкой можно подключить и к входу BOOT1.
Программирование МК осуществляется через последовательный порт UART1 или через специальные программаторы – отладчики JTAG или STLink. Последний входит в состав популярного отладочного устройства STM32VLDISCOVERY , изображённого на рисунке 6. На плате STM32VLDIS COVERY 4контактный разъём программатора – отладчика STLink – имеет обозначение SWD. Автор статьи предлагает программировать МК через последовательный порт UART1, поскольку это значительно проще, не требует специального оборудования и не уступает в скорости JTAG или ST Link. В качестве управляющего устройства, способного формировать команды и отображать результаты работы про граммы МК, а также в качестве программатора можно использовать любой персональный компьютер (ПК), имеющий последовательный COM порт или порт USB с преобразователем USBRS232.

Для сопряжения COMпорта ПК с МК подойдет любой преобразователь сиг налов RS232 в уровни логических сигналов от 0 до 3,3 В, например, микросхема ADM3232. Линия передачи TXD последовательного порта компьютера, после преобразователя уровней, должна подключаться к входу PA10 микроконтроллера, а линия приёмника RXD, через аналогичный преобразователь, – к выходу PA9.

При необходимости использования энергонезависимых часов МК, к нему следует подключить элемент питания типа CR2032 с напряжением 3 В и кварцевый резонатор на частоту 32768 Гц. Для этого МК оснащён выводами Vbat/GND и OSC32_IN/OSC32_OUT. Предварительно вывод Vbat необходимо отключить от шины питания 3,3 В.

Оставшиеся свободными выводы МК можно использовать по необходимости. Для этого их следует подключить к разъёмам, которые расположены по периметру печатной платы для МК, по аналогии с популярными устройствами Arduino и отладочной платой STM32VLDISCOVERY .


Рис. 6. Отладочное устройство STM32VLDISCOVERY


Схема электрическая принципиальная STM32VLDISCOVERY.

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

ПРОГРАММИРОВАНИЕ
Сегодня многие компании предлагают средства для создания и отладки программ микроконтроллеров STM32. К их числу относятся Keil от ARM Ltd, IAR Embedded Workbench for ARM, Atol lic TrueStudio, CooCox IDE, GCC и Eclipse IDE. Разработчик может выбрать про граммные средства по своему пред почтению. Ниже будет описан инструментарий Keil uVision 4 от компании Keil , который поддерживает огромное число типов МК, имеет развитую систему отладочных средств и может быть использован бесплатно с ограничениями размера генерируемого кода 32 кбайт (что, фактически, максимально для рассматриваемых МК).

Простой и быстрый старт с CooCox CoIDE.

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

CooCox CoIDE — среда разработки, на базе Eclipse, которая помимо STM32 поддерживает кучу других семейств микроконтроллеров: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro и др. С каждой новой версией CoIDE список МК постоянно пополняется. После успешной установки CoIDE запускаем:

Появится стартовое окно Step 1, в котором необходимо выбрать производителя нашего микроконтроллера. Нажимаем ST и переходим к Step 2 (выбор микроконтроллера), в котором необходимо выбрать конкретную модель. У нас STM32F100RBT6B, поэтому нажимаем на соответствующую модель:

Справа, в окне Help отображаются краткие характеристики каждого чипа. После выбора нужного нам микроконтроллера переходим к третьему шагу Step 3 — к выбору необходимых библиотек для работы:

Давайте создадим простейший проект для мигания светодиодом, как это принято для изучения микроконтроллеров.

Для этого нам понадобится библиотека GPIO, при включении которой, CoIDE попросит создать новый проект. На это предложение нажимаем Yes, указываем папку где будет храниться наш проект и его название. При этом, CoIDE подключит к проекту 3 другие, необходимые для работы библиотеки, а также создаст всю необходимую структуру проекта:

Чем еще хорош CoIDE, это тем, что в нем есть возможность загружать примеры прямо в среду разработки. В вкладке Components вы можете видеть, что почти к каждой библиотеке есть примеры, нажимаем на GPIO (with 4 examples) и видим их:

Туда можно добавлять и свои примеры. Как видно на скриншоте выше, в примерах уже присутствует код для мигания светодиодом GPIO_Blink. Можно нажать кнопку add и он добавиться в проект, но как подключаемый файл, поэтому мы сделаем по другому просто скопируем весь код примера в файл main.c. Единственное, строку void GPIO_Blink(void) замените на int main(void). Итак, нажимаем F7 (или в меню выбираем Project->Build), чтобы скомпилировать проект и… не тут то было!

Среде нужен компилятор GCC, а у нас его нет. Поэтому идем на страничку GNU Tools for ARM Embedded Processors , справа выбираем тип вашей ОС и качаем последнюю версию тулчайна. Затем запускаем файл и инсталируем gcc toolchain. Далее, в настройках CoIDE укажем правильный путь к тулчайну:

Опять нажимаем F7 (Project->Build) и видим, что компиляция прошла успешно:

Осталось прошить микроконтроллер. Для этого при помощи USB подключаем нашу плату к компьютеру. Затем, в настройках дебаггера необходимо поставить ST-Link, для этого в меню выбираем Project->Configuration и открываем вкладку Debugger. В выпадающем списке выбираем ST-Link и закрываем окно:

Попробуем прошить МК. В меню выбираем Flash->Program Download (или на панели инструментов щелкаем по соответствующей иконке) и видим, что МК успешно прошит:

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

Также, в CoIDE работают различные режимы отладки, для этого нажимаем CTRL+F5 (или в меню Debug->Debug):

На этом все. Как видите, настройка среды CoIDE и работа с ней очень проста. Надеюсь данная статья подтолкнет вас в изучении очень перспективных и недорогих микроконтроллеров STM32.

Отладочная плата STM32 Discovery предназначена для изучения возможностей и принципов программирования 32-разрядных ARM микроконтроллеров серии STM32 от фирмы STMicroelectronics . На плате установлены все необходимые элементы для начала работы с данными микросхемами. Структура платы разделена на две части – отладчик ST-Link и непосредственно сам микроконтроллер.

Микроконтроллер

На плате STM32 Discovery установлен микроконтроллер STM32F100RBT6B, являющийся одним из наиболее простых в серии STM32. STM32F100RBT6B представляет собой 32-разрядный процессор с ядром ARM, серии Cortex-M3. Объем встроенной памяти составляет 128кБ Flash-памяти и 8кБ ОЗУ. Микросхема выполнена в 64 выводном корпусе LQFP для поверхностного монтажа.

Из периферийных устройств в STM32F100 реализованы:

  • 5 портов ввода вывода
  • 12-битный АЦП
  • 2 12-битных ЦАП
  • 3 интерфейса USART
  • интерфейс SPI
  • два интерфейса I2C
  • таймеры

Обвязка микроконтроллера

Помимо микроконтроллера на плате STM32 Discovery специалистами STMicroelectronics предусмотрены следующие устройства:

  • два пользовательских светодиода
  • пользовательская кнопка
  • кнопка сброс
  • кварцевый резонатор на 8 МГц
  • резонатор на 32768 Гц для работы часов реального времени и сторожевого таймера

Все линии портов микроконтроллера выведены на штыревые разъемы, расположенные по краям платы. Большим плюсом является доступность этих разъемов с обеих сторон.

Для питания МК используется напряжение 3.3В. Питание внешних устройств возможно от встроенного стабилизатора напряжения 5В.

Отладчик

STM32 Discovery оснащен фирменным отладчиком от STMicroelectronics, под названием ST-Link. Данная модель не совместима с изделиями от других производителей. Отладчик реализован на микроконтроллере STM32F103 и позволяет записывать программу в базовый МК и отслеживать ее работу. Для связи с компьютером используется разъем типа Mini-USB, который также позволяет питать устройства на плате. Для индикации работы отладчика используются два светодиода красного цвета. Один горит при включении питания, второй при работе отладчика.

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

Программное обеспечение

Для работы с STM32 Discovery можно использовать несколько различных IDE. STMicroelectronics предлагает собственную среду разработки под названием Atollic True STUDIO. В версии LITE данная среда поставляется бесплатно. Также микроконтроллеры STM32 поддерживают такие, широко известные пакеты, как IAR, Keil, CODE RED. Прошивку целевого микроконтроллера возможно выполнить с помощью бесплатной утилиты ST-Link Utiliuty.

You have no rights to post comments

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

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

Использовать достаточно мощный чип. Так как я длительное время использовал свою отладку на stm32f100, то по мере проектов я осознал, что хочу по максимуму использовать чипы. Так как возможностей последнего мне стало не хватать (мало ног и низкая частота 24МГц), то я решил пересесть на чуть больший чип: STM32F103 , на котором у меня уже была удачная отладка, но не получившая очень широкого применения.

Использовать аккумуляторы типоразмера 18650, которые мне так полюбились своим отношением ёмкость/цена.

Использовать встроенный контроллер питания от mini-usb на MCP73833 . Хотелось попробовать сделать заводскую плату с хорошим отведением тепла от микросхемы, и посмотреть на что получится разогнать данный контроллер заряда без внешнего радиатора.

Использовать так мною любимый TPS63000 для создания 3,3В линии. Это не очень эффективный контроллер питания с точки зрения тока холостого хода, но он работает как повышающий/понижающий преобразователь, что позволяет использовать весь заряд батареи при выходном высоком выходном токе(единицы ампер).

Сделать маркировку всех сигнальных выводов платы.

Ну и так по мелочи:

Кварцы 5032 (ни одного сбоя за всё время работы)

Smd0603+кондёры 0805 на самых маленьких футпринтах.

Разделение аналоговой и цифровой земель в устройстве

Разъёмы с шагом 2,54 тип мама(PBS20) для того, чтобы в моих макетках сделанных лутом уставлять имеющиеся у меня в большом количестве разъёмы тогоже типа, но папы(дешевле выходит).

Полностью одностороннюю пайку(за исключением разъёмов под аккумулятор).

Тестирование DC-DC преобразователя.

После этого я принялся за тестирование. Для этого специально купил резистор SQP5-4R7 чтобы протестировать контроллер DC-DC на ток ~1А. В результате тестов резистор прогревался до 110*С (узнавал по пирометру), что приводило к некоторой просадке сопротивления и росту тока до 1А.

В результате было установлено, что шумов дополнительных не появляется, а вся система работает как часы. При этом температура DC-DC преобразователя находится в диапазоне 35-40*С при температуре внешней среды +27*С. Конечно, я понимаю, что с ростом нагрузки будут рости и пульсации, но я думаю что когда будет от линии питания микроконтроллера работать и достаточная силовая нагрузка, то особая точность аналоговой части не потребуется.

Тестирование зарядного устройства.

Честно говоря это первый раз, когда я решил сделать промышленно изготовленную плату с MCP73833. В предыдущий раз я посмотрел то, что данный контроллер вообще заряжает и работать + ознакомился на практике с алгоритмом его работы. В данном случае, так как приближалась сдача диплома, а попробовать очень хотелось, я просто разобрал предыдущую плату и аккуратно перенёс все компоненты на новую. В результате, при заряде батарейки после предыдущего теста я зафиксировал, что при зарядном токе в 375мА температура контроллера заряда не достигает и 45*С. Это говорит о том, что можно смело перепаять резистор управляющий зарядом, чтобы увеличить зарядный ток. Я его подниму до 500мА, а вот дальше не пойду. Связано это не с теплом, которое будет выделятся на микросхеме, а с тем, что не все мои пяти вольтовые блоки питания для мобильников выдают более 500мА. Особых защит, в тех что я смотрел, нет, и это может привести к проблемам в электросети.

Недостатки разработанной платы.

Проведя эти тесты, а также представляя как я буду работать в дальнейшем с этой платой, выяснился ряд факторов, которые я не учёл в данном проекте:

У меня не хватило опыта в трассировке для того, чтобы установить в данной печатной плате выключатель on/off на батарейку. Конечно, я это отлично умею делать путём выдёргивания 18650 из разъёма или установкой специальной пластиковой пластины. Но это же костыль друзья мои. Хорошо бы было доделать выключатель.

Нет BMS у аккумулятора на плате, хотя он нужен. Чисто технически TPS63000 работает в диапазоне входных напряжений 1,8-6В. Это возможно при глубоком разряде аккумулятора будет приводить к его порче. Это проблема решается некоторой модификацией самой батарейки и установлением в неё дешёвого bms прямо на батарейку со впихиванием/подрезанием одного из контактов. Опять же не критично, но с костылями.

В разъёме USB по цифровым линиям ничего не подключено. В этом котроллере есть встроенный USB интерфейс, но я его не вывел на разъём. Связано это с тем, что в текущих проектах это не нужно и поставить нормальную обвязку usb интерфейса на плате(с защитными диодами и микросхемой согласования уровней мне как то не доводилось).

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

Недостаточная компактность платы. Текущие габариты платы 34х80 мм. Всегда хочется решение компактнее. Может и получится. Хотя с другой стороны, на обратной стороне печатной платы не так много и места.

Некоторым не очень удобный разъём для программирования и кнопка резет. Дотянутся до неё когда внутри плата сложно, но опять же можно отвёрткой (костыли).

Достаточно высокая цена устройства. Я делал прототипным производством в панели, по этому цена снижена, но один чёрт далека от китайской ардуинки/стмки за 200 руб.

Всем желающим такую штуку себе.

В настоящее время есть 2 таких платы, так что все желающие могу её приобрести за 1700 руб без доставки и аккумулятора 18650. Почему я не высылаю аккумулятор? – дело в почте России. Я был бы счастлив, если бы они пересылали аккумуляторы, хотя первому заказавшему я постараюсь отправить одну 18650 банку сразу с устройством бесплатно.

Связаться со мной можно по почте: [email protected]

С моей точки зрения о цене: сейчас за эти деньги можно купить оригинальное ардуино или дискавери с Китая. Но ни то, ни другое вы не сможете взять с собой на целый день без внешнего обвеса и аккумуляторов. А тут вы получается готовую штуку, в которую можно вставить свою плату и получить очень жёсткую конструкцию, которую можно спокойно носить с собой не переживая, что где-то отойдёт пайка или устройство испытает короткое замыкание.

Рисунок 1. Схема элементов STM32F103RC_board

Некоторая доработка. Версия 1.0.

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

С первого взгляда бросаются следующие вещи:

Нет «гребёнки» PBS-30 для вставки в печатную плату. К моему сожалению тут работает 2 фактора (они у меня закончились и заказчик попросил их не ставить.

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

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

Но дьявол часто кроется в деталях, так оказывается и тут. На данной плате я пробовал разные резисторы в управлении зарядным током. В итоге было выявлено, что микросхема MCP73833 на данной плате нормально держит ток в 800мА и при заряде с 2,5В Li-Ion батареек прогревается до 65-70*С. Конечно, по даташиту она работает с токами до 2А, но я честно пока не представляю как их реализовать на корпусе msop-10. Может быть в следующем корпусе, в котором эта проблема решается лучше, получится вытянуть 2А.

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

Предосторожность.

Во время проведения полной диагностической проверки я спалил один STM32F103RCT6. Как я это сделал:

Я взял обычный мультиметр и ткнулся им в резистор обратной связи. Пр этом TPS63000 видит просадку напряжения на обратной связи и начинает быстро повышать напряжение на своём выходе. В итоге, по проведённому тесту с отпаянным контроллером: напряжение в импульсе вырастало до 7В. При этом контроллер испытывал перенапряжение и умирал.

Забавно происходило потом: по входу на 3,6В контроллер начинал потреблять 0,6А. Это связано с тем, что в TPS63000 встроена защита по току в 2А, Именно данный ток и протекал через убитый микроконтроллер. При этом работоспособность всей оставшейся схемы сохранялась.

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

Упаковка отправленной платы

Отсылая данную плату моему коллеге , я решил её упаковать получше, чтобы Почта Р. не сломало всё. В итоге получилось так:





В последнее время на хабре появилось много статей по STM32 (). В комментариях неоднократно упоминается сложность STM32 по сравнению с AVR. Эта тема особенно влияет на новичков, которые хотят начать изучение микроконтроллеров, и, видя такое мнение, выбирают для изучения AVR. Давайте разберемся, так ли сложен этот зверь - STM32?

Для этого выберем недорогой вариант платы и напишем прошивку в десяток-другой байт (да-да, мигание светодиодом в 2 килобайта сродни «Hello world» в сотни килобайт x86 для неумех). Также научимся писать программы на любом языке программирования для STM32.

Вступление

Какой тип микроконтроллеров изучать? Этот вопрос, по-моему, аналогичен вопросам типа «Какой язык программирования изучать?», «Какой иностранный язык учить?». ИМХО, изучать нужно тот, который нужнее в данную минуту, для данной задачи. Когда знаешь что-то одно, изучение второго дастся намного легче, а на счет третьего и не задумаешься.

Итак, в чем же сложность STM32? Наиболее часто звучит мнение о сложности программирования его периферии. Количество и тип периферии STM32 и AVR примерно одинаков. Конфигурирование ее также не сильно отличается. Так в чем же сложность? В микроконтроллерах STM32 всю периферию нужно предварительно включать. Вот и вся сложность.

Я сравниваю AVR с общественными зданиями: все двери нараспашку, везде мониторы сверкают рекламой и свет горит, а STM32 с личным домом: хочешь телевизор посмотреть - включи сначала, потом переключай каналы, захотел пи-пи - открой дверь и включи там свет, руки помыть - открой воду, и так далее. Не верите? Убедимся вместе.

Обзор платы

Я выбрал самую дешевую плату из предложенных на aliexpress (рисунок выше). Чуть дороже $2, 180 рублей в декабре 2015. На борту минимальная обвязка: два кварцевых резонатора - высокочастотный на 8МГц и часовой на 32.768Гц, кнопка «сброс», два джампера выбора режима загрузки, пара светодиодов - на питание и на ножке PC13 и набор разъемов: microUSB, отладочный, две гребенки для всех выводов микроконтроллера.

Дешевле только купить все детали, сделать самому плату и спаять. Чем шить и отлаживать? Если есть ST-LINK, то лучше им, нет - не беда, есть еще несколько вариантов, например через USB-USART переходник, нет и его - можно напрямую через USB, правда нужно самому написать драйвер для такого случая, никто пока не озаботился. ST-LINK достаточно дешев, да и входит во все платы серии DISCOVERY. Вот и я воспользовался таким.

Подключаем питание, светодиод весело мигает, плата исправна. Скачиваем и устанавливаем программу-программатор (масло-масляное) «STM32 ST-LINK Utility» (все программы и документы берем на сайте производителя). Пытаемся считать прошивку… Программа защищена от чтения. Видимо, недаром все говорят о сложности написания программ для STM32, даже китайцы защитили эту сверхсложную программу от взлома. Или там спрятана закладка-вирус? Разбираться не будем, снимаем защиту и получаем девственно чистый микроконтроллер STM32F103C8T6.

Первая программа

Давайте тоже помигаем светодиодом, сделаем, так сказать, реверс-инжиниринг в уме родной прошивки. Чем? Чтобы не городить споры по выбору среды разработки, я это сделаю в родной Visual Studio Community. Мне кажется, для Windows лучше для мужчины нет.

Как там программа мигания для ардуины? Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно.
А как будет выглядеть она же для STM32? Намного сложнее. Сначала включим свет в комнате конфигурации ножек микроконтроллера, а затем «Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно». Я понимаю, сложно… Но мы справимся.

В документе «RM0008. Reference Manual» на наш микроконтроллер посмотрим карту памяти для нужных нам регистров.

- Пойдем простым и логическим ходом.
- Пойдем вместе.

1. Включим тактирование порта C (наш светодиод висит на ножке 13 порта C). Смотрим документ. Нужный нам регистр RCC_ABP2ENR (переводим: регистр сброса и тактирования - вторая низкоскоростная шина периферии). Адрес порта - 0x40021018, нужный бит IOPCEN (порт ввода-вывода C - бит разрешения) четвертый - 0x00000010.

Отступление

У микроконтроллеров все как у взрослых процессоров. Есть высокоскоростная шина AHB aka «Северный мост» и низкоскоростная APB aka «Южный мост». Сам процессор микроконтроллера умеет все для ускорения работы: имеет предвыборку команд, конвейер выполнения команд. Нет кеша, но процессор не намного быстрее памяти, и чтение-запись в память успевает выполняться за один такт. Так что, можно сказать, вся память микроконтроллера - это один большой кеш. Ладно-ладно, не один и не большой. Два маленьких кеша.
Вся периферия отображена (маппирована) на адресное пространство. По сравнению с x86 нет команд in-out, но и Intel оставил их только для совместимости, сейчас они практически не используются.


2. Сконфигурируем ножку на вывод. Смотрим документ. Нужный нам регистр GPIOC_CRH (переводим: регистр порта ввода-вывода C - конфигурационный регистр для старшей половины ножек). Адрес порта - 0x40011004, за конфигурацию каждой ножки отвечают 4 бита, значение для переключения ножки на выход - 0001b, для ножки 13 значение - 0x00100000.

3. Как переключить логическое значение на ножке. Смотрим документ. Нужный нам регистр GPIOC_ODR (переводим: регистр порта ввода-вывода C - регистр вывода данных). Адрес порта - 0x4001100С, его значение напрямую выводится в ножки микроконтроллера, для ножки 13 значение - 0x00002000. Все готово для написания программы (не забыть выложить проект на github):

Int main(void) { *((int*)0x40021018) = 0x00000010; // RCC_APB2ENR = RCC_APB2ENR_IOPCEN *((int*)0x40011004) = 0x00100000; // GPIOC_CRH = MODER_OUTPUT_13 while(1) { *((volatile int*)0x4001100C) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; } } extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVectors = { (int)&_eram, // начальное значение стека (int)main // Reset Handler };
С векторами прерываний, надеюсь все понятно? Мы используем только два из них, поэтому незачем занимать память пустышками. Все остальные прерывания включаются программно, не включали - значит они никогда не сработают. Исключение - третий вектор HardFault, если случилось - микроконтроллер неисправен или сбоит, для простых проектов (не космос-авиация, не медицина) можно не обрабатывать.

Это учебный проект, конечно следует оформить все адреса как символические константы в отдельный h-файл с большим количеством дефайнов, как это сделано в CMSIS. Можно взять их и приспособить для своих нужд. Для компиляции использую gcc, прошивка с помощью «STM32 ST-LINK Utility». Прошивка заняла 56 байт (привет, ассемблер).

Еще отступление

Еще одно утверждение о сложности STM32 - мало документации на русском языке. Спорно. Необходимы только два документа - Datasheet и Reference Manual на нужный микроконтроллер. Язык на котором он написан сложно назвать английским. Я изучал язык по непереведенным игрушкам, уровень английского остался на том же уровне, но даташиты я читаю без проблем, незнакомые термины понятны из контекста.



Вроде много получилось, тогда на сегодня все.

Во второй половине расскажу о программировании STM32 на любом языке программирования.

Теги: STM32, микроконтроллеры-это-просто, ардуино-не-надо

В последнее время на хабре появилось много статей по STM32 (). В комментариях неоднократно упоминается сложность STM32 по сравнению с AVR. Эта тема особенно влияет на новичков, которые хотят начать изучение микроконтроллеров, и, видя такое мнение, выбирают для изучения AVR. Давайте разберемся, так ли сложен этот зверь - STM32?

Для этого выберем недорогой вариант платы и напишем прошивку в десяток-другой байт (да-да, мигание светодиодом в 2 килобайта сродни «Hello world» в сотни килобайт x86 для неумех). Также научимся писать программы на любом языке программирования для STM32.

Вступление

Какой тип микроконтроллеров изучать? Этот вопрос, по-моему, аналогичен вопросам типа «Какой язык программирования изучать?», «Какой иностранный язык учить?». ИМХО, изучать нужно тот, который нужнее в данную минуту, для данной задачи. Когда знаешь что-то одно, изучение второго дастся намного легче, а на счет третьего и не задумаешься.

Итак, в чем же сложность STM32? Наиболее часто звучит мнение о сложности программирования его периферии. Количество и тип периферии STM32 и AVR примерно одинаков. Конфигурирование ее также не сильно отличается. Так в чем же сложность? В микроконтроллерах STM32 всю периферию нужно предварительно включать. Вот и вся сложность.

Я сравниваю AVR с общественными зданиями: все двери нараспашку, везде мониторы сверкают рекламой и свет горит, а STM32 с личным домом: хочешь телевизор посмотреть - включи сначала, потом переключай каналы, захотел пи-пи - открой дверь и включи там свет, руки помыть - открой воду, и так далее. Не верите? Убедимся вместе.

Обзор платы

Я выбрал самую дешевую плату из предложенных на aliexpress (рисунок выше). Чуть дороже $2, 180 рублей в декабре 2015. На борту минимальная обвязка: два кварцевых резонатора - высокочастотный на 8МГц и часовой на 32.768Гц, кнопка «сброс», два джампера выбора режима загрузки, пара светодиодов - на питание и на ножке PC13 и набор разъемов: microUSB, отладочный, две гребенки для всех выводов микроконтроллера.

Дешевле только купить все детали, сделать самому плату и спаять. Чем шить и отлаживать? Если есть ST-LINK, то лучше им, нет - не беда, есть еще несколько вариантов, например через USB-USART переходник, нет и его - можно напрямую через USB, правда нужно самому написать драйвер для такого случая, никто пока не озаботился. ST-LINK достаточно дешев, да и входит во все платы серии DISCOVERY. Вот и я воспользовался таким.

Подключаем питание, светодиод весело мигает, плата исправна. Скачиваем и устанавливаем программу-программатор (масло-масляное) «STM32 ST-LINK Utility» (все программы и документы берем на сайте производителя). Пытаемся считать прошивку… Программа защищена от чтения. Видимо, недаром все говорят о сложности написания программ для STM32, даже китайцы защитили эту сверхсложную программу от взлома. Или там спрятана закладка-вирус? Разбираться не будем, снимаем защиту и получаем девственно чистый микроконтроллер STM32F103C8T6.

Первая программа

Давайте тоже помигаем светодиодом, сделаем, так сказать, реверс-инжиниринг в уме родной прошивки. Чем? Чтобы не городить споры по выбору среды разработки, я это сделаю в родной Visual Studio Community. Мне кажется, для Windows лучше для мужчины нет.

Как там программа мигания для ардуины? Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно.
А как будет выглядеть она же для STM32? Намного сложнее. Сначала включим свет в комнате конфигурации ножек микроконтроллера, а затем «Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно». Я понимаю, сложно… Но мы справимся.

В документе «RM0008. Reference Manual» на наш микроконтроллер посмотрим карту памяти для нужных нам регистров.

- Пойдем простым и логическим ходом.
- Пойдем вместе.

1. Включим тактирование порта C (наш светодиод висит на ножке 13 порта C). Смотрим документ. Нужный нам регистр RCC_ABP2ENR (переводим: регистр сброса и тактирования - вторая низкоскоростная шина периферии). Адрес порта - 0x40021018, нужный бит IOPCEN (порт ввода-вывода C - бит разрешения) четвертый - 0x00000010.

Отступление

У микроконтроллеров все как у взрослых процессоров. Есть высокоскоростная шина AHB aka «Северный мост» и низкоскоростная APB aka «Южный мост». Сам процессор микроконтроллера умеет все для ускорения работы: имеет предвыборку команд, конвейер выполнения команд. Нет кеша, но процессор не намного быстрее памяти, и чтение-запись в память успевает выполняться за один такт. Так что, можно сказать, вся память микроконтроллера - это один большой кеш. Ладно-ладно, не один и не большой. Два маленьких кеша.
Вся периферия отображена (маппирована) на адресное пространство. По сравнению с x86 нет команд in-out, но и Intel оставил их только для совместимости, сейчас они практически не используются.


2. Сконфигурируем ножку на вывод. Смотрим документ. Нужный нам регистр GPIOC_CRH (переводим: регистр порта ввода-вывода C - конфигурационный регистр для старшей половины ножек). Адрес порта - 0x40011004, за конфигурацию каждой ножки отвечают 4 бита, значение для переключения ножки на выход - 0001b, для ножки 13 значение - 0x00100000.

3. Как переключить логическое значение на ножке. Смотрим документ. Нужный нам регистр GPIOC_ODR (переводим: регистр порта ввода-вывода C - регистр вывода данных). Адрес порта - 0x4001100С, его значение напрямую выводится в ножки микроконтроллера, для ножки 13 значение - 0x00002000. Все готово для написания программы (не забыть выложить проект на github):

Int main(void) { *((int*)0x40021018) = 0x00000010; // RCC_APB2ENR = RCC_APB2ENR_IOPCEN *((int*)0x40011004) = 0x00100000; // GPIOC_CRH = MODER_OUTPUT_13 while(1) { *((volatile int*)0x4001100C) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; } } extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVectors = { (int)&_eram, // начальное значение стека (int)main // Reset Handler };
С векторами прерываний, надеюсь все понятно? Мы используем только два из них, поэтому незачем занимать память пустышками. Все остальные прерывания включаются программно, не включали - значит они никогда не сработают. Исключение - третий вектор HardFault, если случилось - микроконтроллер неисправен или сбоит, для простых проектов (не космос-авиация, не медицина) можно не обрабатывать.

Это учебный проект, конечно следует оформить все адреса как символические константы в отдельный h-файл с большим количеством дефайнов, как это сделано в CMSIS. Можно взять их и приспособить для своих нужд. Для компиляции использую gcc, прошивка с помощью «STM32 ST-LINK Utility». Прошивка заняла 56 байт (привет, ассемблер).

Еще отступление

Еще одно утверждение о сложности STM32 - мало документации на русском языке. Спорно. Необходимы только два документа - Datasheet и Reference Manual на нужный микроконтроллер. Язык на котором он написан сложно назвать английским. Я изучал язык по непереведенным игрушкам, уровень английского остался на том же уровне, но даташиты я читаю без проблем, незнакомые термины понятны из контекста.



Вроде много получилось, тогда на сегодня все.

Во второй половине расскажу о программировании STM32 на любом языке программирования.

Теги: STM32, микроконтроллеры-это-просто, ардуино-не-надо

Понравилась статья? Поделитесь ей
Наверх