Быстрое освоение микроконтроллеров STM32. Ёмкостный датчик касаний без внешней обвязки на STM32 Discovery Обвязка stm32 описание и инструкция по программированию
Информационный портал по безопасности
Информационный портал по безопасности » Железо » Сделай Сам » Ёмкостный датчик касаний без внешней обвязки на STM32 Discovery
Ёмкостный датчик касаний без внешней обвязки на STM32 Discovery
Автор: admin от 16-11-2011, 14:53, посмотрело: 3956
В начале этого года достойный гражданин Ariman написал статью о том, как прикрутить к микроконтроллеру ёмкостный сенсор прикосновения. Эта идея показалась мне довольно перспективной, некоторым приборам сенсорные клавиши подошли бы куда лучше механических. В этой статье я расскажу о своей реализации этой полезной технологии на основе отладочной платы STM32 Discovery.
Итак, только начав осваивать STM32, я решил в качестве упражнения добавить устройству способность определять прикосновения. Начав разбираться с теорией и практикой по вышеупомянутой статье, я повторил схему товарища Ariman’a. Она работала идеально, но мне, любителю минимализма, захотелось её упростить, избавившись от лишних элементов. Лишними на мой взгляд оказались внешний резистор и дорожка к питанию. Всё это уже есть в большинстве микроконтроллеров, в том числе в AVR и в STM32. Я имею в виду подтягивающие резисторы портов ввода/вывода. Почему бы не заряжать пластинку и наши пальцы через них? В ожидании подвоха я собрал на макетке схему, которая, к моему удивлению, заработала с первого же раза. Собственно говоря, схемой это называть даже смешно, ведь всё что нам нужно — это просто подсоединить контактную пластинку к ножке отладочной платы. Всю работу на себя возьмёт микроконтроллер.
Что же из себя представляет программа? Во первых две функции:
Первая выводит на ножку сенсора (нулевой пин регистра C) логический «0»
void Sensor_Ground (void)
<
GPIOC->CRL = 0x1;
GPIOC->BRR |= 0x1;
>
Вторая настраивает тот же вывод на вход, с подтяжкой к питанию.
void Sensor_InPullUp (void)
<
GPIOC->CRL = 0x8;
GPIOC->BSRR |= 0x1;
>
Теперь в начале цикла опроса вызовем Sensor_Ground(), и подождём некоторое время чтобы разрядить на землю весь остаточный заряд на сенсоре. Затем обнулим переменную count, которой будем считать время зарядки сенсора и вызовем Sensor_InPullUp().
Sensor_Ground();
Delay(0xFF); //простой пустой счётчик
count = 0;
Sensor_InPullUp();
Теперь сенсор начинает заряжаться через внутренний подтягивающий резистор номиналом порядка десятков КОм (30..50КОм у STM32). Постоянная времени такой цепи будет равняться считанным тактам, поэтому я поменял кварцевый резонатор на отладочной плате на более быстрый, 20МГц (кстати, я не сразу заметил, что оказывается на STM32 Discovery кварц меняется без пайки). Итак считаем такты процессора, пока на входе не появится логическая единица:
После выхода из этого цикла в переменной count будет храниться число, пропорциональное ёмкости сенсорной пластинки. В моём случае с чипом на 20МГц значение count равняется 1 при отсутствии нажатия, 7-10 при самом лёгком касании, 15-20 при нормальном прикосновении. Остаётся лишь сравнить её с пороговым значением и не забыть снова вызвать Sensor_Ground(), чтобы к следующему циклу опроса сенсор уже был разряжен.
Полученной чувствительности хватает для уверенного определения прикосновений к голым металлическим площадкам. При прикрытии сенсора листом бумаги или пластика чувствительность падает в три — четыре раза, хорошо определяются только уверенные нажатия. Чтобы увеличить чувствительность в случае, когда сенсор необходимо прикрыть защитным материалом, можно повысить тактовую частоту микроконтроллера. С чипом серии STM32F103, способном работать на частотах до 72МГц, помехой не будут и миллиметровые преграды между пальцем и сенсором.
По сравнению с реализацией Ariman’a, мой подход работает гораздо быстрее (порядка десятка тактов на опрос одного сенсора), поэтому я не стал усложнять программу, настраивая прерывания по таймеру.
Напоследок видео с демонстрацией работы сенсора.
Cпасибо пользователю ALPINE63rus за очень полезную статью ARM-микроконтроллеры STM32F. Быстрый старт c STM32-Discovery, пользователю Ariman за идею и доходчивое теоретическое описание.
Быстрое освоение микроконтроллеров STM32. Ёмкостный датчик касаний без внешней обвязки на STM32 Discovery Обвязка stm32 описание и инструкция по программированию
Решил написать книгу …
… про реальную разработку устройств на stm32. Поэтому думаю обновления если и будут, то нерегулярным и в основном в виде кусочков из книги.
Что бы не было скучно, вот вам малюсенький кусочек, можно сказать бета-версия про кварцевые резонаторы и вообще частоты.
Сами по себе микроконтроллеры работать не умеют. Им нужны всякие сопутствующие элементы. Вот к примеру, STM32L05 умеет работать с USB без всяких внешних кварцевых резонаторов, а STM32L152 — нет. Если мы планируем использовать более-менее точное время в наших проектах, то нам жизненно необходим внешний часовой кварцевый резонатор. Без него уход времени на 5-10 минут в сутки станет совершенно нормальным. И более того, он будет не постоянным и зависеть от температуры, напряжения питания и кучи других вещей.
В общем, время брать и читать описание микроконтроллера. Что ему надо, когда надо и зачем. Описание (или даташит как калька с datasheet) ищется легко прямо в интернете по коду микроконтроллера.
Но просто так читать даташиты смысла особого нет, ибо ничего в голове не откладывается. Я обычно начинаю рисовать схему, консультируясь с даташитами на предмет уровней и прочего, а с кубом — на предмет возможного назначения ножек и вообще конфигурации кристалла. Кстати о конфигурации.
Клоки, тайминги и шины
Одна из самых распространенных причин неработоспособности чего-либо — неправильная конфигурация частот и всего, что с этим связано. Наступило время раскрытия еще одной вкладки в кубе — Clock configuration. Я открыл новый проект, взял выбранный микроконтроллер, и включил rtc, usb и пару uart. Просто для примера. Открываем вкладку и видим примерно следующее
Слева «источники» тактовых сигналов, а справа — их «получатели». Пока сигнал дойдет с одного края до другого, он может пройти через умножители и делители, а может и напрямую. Для удобства красным подсвечивается то, что куб считает неправильным. Нет, вы можете нажать кнопку «сгенерировать код», скомпилировать полученное и залить (программист всегда прав!), но контроллер работать не будет.
Давайте начнем слева. У stm32 могут быть источники тактовых сигналов высокой (HS) и низкой (LS) частоты. Они могут быть внутренними (I) или внешними (E). Те, что сейчас в работе — подсвечиваются синим. Например, сейчас используется два источника — на 37 килогерц и на 16 мегагерц.
Теперь ваша задача пройти лабиринт, выставив все в нужных положениях. Задача осложняется тем, что можно выставить все в § «зеленое», но потом обнаружить, что частоту uart нельзя будет поднять больше 300бод. В общем, у программистов ST получилась этакая игрушка для взрослых. А теперь представьте, что раньше все это надо было рассчитывать руками, после неоднократного чтения документации и выяснить, будет ли это работать можно было только экспериментально.
В нашем случае все просто: изменив пару параметров в PLL (программируемый множитель), я легко добился исчезновения «красного». Почти.
Данной красной точкой авторы куба отсылают нас к документации, которая однозначно говорит, что без внешнего кварцевого резонатора не видать нам USB как своих ушей. Слишком «плавает» внутренний генератор, а использовать тактирование со стороны USB этот микроконтроллер не умеет.
Ок, идем на первую вкладку и около RCC видим такую картину
Disable — это понятно, выключено. Bypass — это прием тактового сигнала с внешнего источника. Ведь с stm можно сделать так, что бы куча микроконтроллеров работала в одном ритме, ибо это очень сильно облегчает вопросы взаимодействия чипов между собой. Например, так сделано на всех discovery платах, что я видел. Там в «программаторской» части стоит кварцевый резонатор, который «питает» чип программатора, а тот в свою очередь отдает тактовый сигнал чипу на плате. И ну последний пункт — это свой, так сказать, персональный кварцевый резонатор.
Так как у нас тестовый проект «на побаловаться», включаем оба на «резонатор» и смотрим, что получилось.
Как видно, частоту «часового» резонатора нам менять не дают, а вот частоту «быстрого» – сколько влезет. Опять придется идти в магазин и смотреть, какие есть, почем дают и подойдут ли нам.
Открываем даташит (я его на всякий случай положил в 02_switch) и ищем требования к кварцам. У кварцевых резонаторов, кроме частоты, есть еще два параметра – емкость и частота увода. Емкость в pF, нужна для расчета «запускающих» конденсаторов, а с ppm немного сложнее
Аббревиатура ppm означает parts per million или количество миллионных частей от основной частоты. Говоря иначе, погрешность 100 ppm для 100 МГц означает уход частоты на 100/1000000 часть от 100 МГц. Таким образом, частота может уйти на 100000000 * 100 / 1000000 = 10000 Гц (10 кГц, или 0.01 МГц), то есть финальная частота может быть любой в диапазоне 99.99 . 100.01 МГц. Или говоря другими словами чем меньше ppm, тем лучше. Итак, смотрим в даташит и находим следующую табличку
Согласно ей у нас «высокоскоростной» кварц может быть от 0 до 32 мегагерц. Куб считает, что только до 24 можно (да и в других местах тоже идет речь про максимальную частоту в 24 мегагерца). Но я искренне рекомендую использовать параметры из Typ(ical) или «типичного» столбца. Как показывает моя практика, это наиболее беспроблемные цифры.
Говоря же про кварцы, то можно поиграться «соседними» по степени двойки частотами. То есть посмотреть на 2, 4, 8 и 16 мегагерц. Поиск осуществляем по уже описанной методике: дешевле, лучше и можно запаять руками.
Как видно, там нужны с нагрузочной емкостью 20pF. А вот мне попадались либо 16, либо 32. Чего делать? Как обычно, читать даташит и смотреть на строчку «AN2867 “Oscillator design guide for ST microcontrollers”» (можно взять там же, где и остальные дополнительные файлы к книге).
Если кратко, то там есть следующая схема
и вот такая вот сложная формула
Cs — это паразитная емкость на плате. Обычно берут в диапазоне 3-5pF.
СL — это берем из даташита на резонатор. У меня 16
Воспользовавшись знаниями математики за 5 класс среднеобразовательной школы (хотя могу и ошибаться), решим это сложнейшее уравнение:
16 = (Х*X)/(X+X)+3
16-3=X*X/2*X
13=X/2
X=26
Итак, ответ ответ – конденсаторы CL1/2 должны быть 26pf. Таких в природе нет, зато есть 27pF, что нам более чем подходит.
Теперь надо подсчитать, запустится ли генератор. Там чуть дальше есть формула
Считаем
G=4*60*(2*3.14*(8*(10^6))^2*((7+16)*10^(-12))^2)
Возведение в степень я обозначил как ^, её же использует и excel.
Запутаться очень легко, поэтому я сделал простую считалку в excel (файл называется resonator)
Туда подставляем найденные значения и смотрим на значение в ячейке Gain. Согласно документации, оно должно быть больше 5. И чем больше, тем лучше. У меня вот получилось. Хотя если брать резонатор с нагрузочной в 32pF, то будет меньше. Аналогичную процедуру надо будет проделать и с «часовым» кварцем. Возвращаемся к кубу и выставляем значения, попутно щелкая переключателями, что бы нигде красного не было.
Как видим, везде все стало хорошо и микроконтроллер будет работать на максимальной для него частоте — 32 мегагерца.
А проверить?
Но вот гложет меня, правильно ли я подсчитал все. Надо провериться. Достаю описание на stm32l-discovery и открываю там схему. Нахожу часть с резонатором
Как видим, около резонатора стоят конденсаторы по 20pF. Как видно, инженеры из ST решили перестраховаться и взяли паразитную емкость платы в 5pF. Если взглянуть на плату, то вроде да, кварцевый резонатор довольно (относительно конечно) далеко от ножек. На некоторых платах он часто его чуть ли не на ножки кладут. Но в общем и целом надо будет учесть этот момент в дальнейшем.
Да и вообще, рассматривание схем чужих, гарантированно рабочих и предназначенных для огромных тиражей плат способно сильно продвинуть в решении вопросов «как это сделано».
STM32 – микроконтроллер для начинающих после Arduino
Микроконтроллер STM32 – популярная и очень востребованная платформа, позволяющая создавать профессиональные решения для автоматизации в самых различных областях. В отличие от доступного Arduino, STM32 требует более глубокого погружения в детали, она сложнее для начинающих, для нее меньше учебников на русском. В этой статье мы постараемся дать базовую информацию о платформе, ее истории, подскажем, где можно скачать программы и библиотеки, как написать первый скетч.
Что такое STM32
STM32 – это платформа, в основе которой лежат микроконтроллеры STMicroelectronics на базе ARM процессора, различные модули и периферия, а также программные решения (IDE) для работы с железом. Решения на базе stm активно используются благодаря производительности микроконтроллера, его удачной архитектуре, малом энергопотреблении, небольшой цене. В настоящее время STM32 состоит уже из нескольких линеек для самых разных предназначений.
История появления
Серия STM32 была выпущена в 2010 году. До этого компанией STMicroelectronics уже выпускались 4 семейства микроконтроллеров на базе ARM, но они были хуже по своим характеристикам. Контроллеры STM32 получились оптимальными по свойствам и цене. Изначально они выпускались в 14 вариантах, которые были разделены на 2 группы – с тактовой частотой до 2 МГц и с частотой до 36 МГц. Программное обеспечение у обеих групп одинаковое, как и расположение контактов. Первые изделия выпускались со встроенной флеш-памятью 128 кбайт и ОЗУ 20 кбайт. Сейчас линейка существенно расширилась, появились новые представители с повышенными значениями ОЗУ и Flash памяти.
Достоинства и недостатки STM32
- Низкая стоимость;
- Удобство использования;
- Большой выбор сред разработки;
- Чипы взаимозаменяемы – если не хватает ресурсов одного микроконтроллера, его можно заменить на более мощной, не меняя самой схемы и платы;
- Высокая производительность;
- Удобная отладка микроконтроллера.
- Высокий порог вхождения;
- На данный момент не так много литературы по STM32;
- Большинство созданных библиотек уже устарели, проще создавать свои собственные.
Минусы STM32 не дают пока микроконтроллеру стать заменой Ардуино.
Сравнение STM32 с Arduino
По техническим характеристикам Ардуино проигрывает STM32. Тактовая частота микроконтроллеров Ардуино ниже – 16 МГц против 72 МГц STM32. Количество выводов GRIO у STM32 больше. Объем памяти у STM32 также выше. Нельзя не отметить pin-to-pin совместимость STM32 – для замены одного изделия на другое не нужно менять плату. Но полностью заменить ардуино конкуренты не могут. В первую очередь это связано с высоким порогом вхождения – для работы с STM32 нужно иметь базис. Платы Ардуино более распространены, и, если у пользователя возникает проблема, найти решение можно на форумах. Также для Ардуино созданы различные шилды и модули, расширяющие функционал. Несмотря на преимущества, по соотношению цена/качество выигрывает STM32.
Семейство микроконтроллеров STM32 отличается от своих конкурентов отличным поведением при температурах от -40С до +80 С. Высокая производительность не уменьшается, в отличие от Ардуино. Также можно найти изделия, работающие при температурах до 105С.
Обзор продуктовых линеек
Семейство STM32 имеет широкий ассортимент изделий, различающихся по объему памяти, производительности, потреблению энергии и другим характеристикам.
Серии STM32F-1, STM32F-2 и STM32L полностью совместимы. Каждая из серий имеет десятки микросхем, которые можно без труда поменять на другие изделия. STM32F-1 была первой линейкой, ее производительность была ограничена. Из-за этого по характеристикам контроллеры быстро догнали изделия семейства Stellaris и LPC17. Позднее была выпущена STM32F-2 с улучшенными характеристиками – тактовая частота достигала 120 МГц. Отличается высокой процессорной мощностью, которая достигнута благодаря новой технологии производства 90 нм. Линейка STM32L представлена моделями, которые изготовлены по специальному технологическому процессу. Утечки транзисторов минимальны, благодаря чему приборы показывают лучшие значения.
Важно отметить, что контроллеры линейки STM32W не имеют pin-to-pin совместимости с STM32F-1, STM32F-2 и STM32L. Причина заключается в том, что линейку разрабатывала компания, которая предоставила радиочастотную часть. Это наложило ограничения на разработку для компании ST.
STM32F100R4
Микросхема STM32F100R4 имеет минимальный набор функций. Объем флэш памяти составляет 16 Кбайт, ОЗУ – 4 Кбайт, тактовая частота составляет 12 МГц. Если требуется более быстрое устройство с увеличенным объемом флэш-памяти до 128 Кбайт, подойдет STM32F101RB. USB интерфейс имеется у изделия STM32F103RE. Существует аналогичное устройство, но с более низким потреблением – это STM32L151RB.
Программное обеспечение для работы с контроллером
Для ARM архитектуры разработано множество сред разработки. К самым известным и дорогостоящим относятся инструменты фирм Keil и IAR System. Программы этих компаний предлагают самые продвинутые инструментарии для оптимизации кода. Также дополнительно существуют различные системы – USB стеки, TCP/IP-стеки и прочие. Применяя системы Keil, пользователь получает хороший уровень технической поддержки.
Также для STM32 используется среда разработки Eclipse и построенные на ней системы Atollic TrueStudio (платная) и CooCox IDE (CoIDE) (бесплатная). Обычно используется последняя. Ее преимущества перед другими средами разработки:
- Свободно распространяемое программное обеспечение;
- Удобство использования;
- Имеется много примеров, которые можно загрузить.
Единственный недостаток среды разработки CooCox IDE – сборка есть только под Windows.
STM32 Discovery
Начать изучение микроконтроллера STM32 лучше с платы Discovery. Это связано с тем, что на этой плате есть встроенный программатор. Его можно подключить к компьютеру через USB кабель и использовать как в качестве программируемого микроконтроллера, так и для внешних устройств. Плата Discovery имеет полную разводку пинов с контроллера на пины платы. На плату можно подключать различные сенсоры, микрофоны и другие периферийные устройства.
Что потребуется для подключения STM32 к компьютеру
Чтобы начать работу, потребуются следующие компоненты:
- Сама плата STM32 Discovery;
- Datasheet на выбранную модель;
- Reference manual на микроконтроллер;
- Установленная на компьютер среда разработки.
В качестве примера первая программа будет рассмотрена в среде CooCox IDE.
Первая программа
Обучение следует начинать с простейшего – с Hello World. Для начала нужно установить CooCox IDE на компьютер. Установка стандартная:
- Скачивается программа с официального сайта;
- Там нужно ввести адрес своей электронной почты и начать загрузку файла с расширением .exe;
- Нужно открыть CooCox IDE вкладку Project, Select Toolchain Path;
- Указать путь к файлу;
- Снова открыть среду разработки и нажать View -> Configuration на вкладку Debugger;
- Теперь можно записывать программу.
Когда программа установлена, ее нужно открыть. Следует перейти во вкладку Browse in Repository и выбрать ST – свой микроконтроллер.
Далее на экране появится список библиотек, которые можно подключить. Для первой программы потребуются системные CMSIS core и CMSIS Boot, библиотека для работы с системой тактирования RCC, GPIO для работами с пинами.
Сама программа пишется как и для Ардуино, нужно знать основы языка Си.
В окошке Project следует открыть main.c. В коде в самом начале следует подключить библиотеки кроме CMSIS (они уже автоматически подключены). Добавляются они следующим образом:
Затем добавляется тактирование порта в главной функции main. Какой контакт за что ответственен, можно просмотреть в даташите к микроконтроллеру.
Для настройки параметров выводов следует прописать ее название и поставить точку. Во всплывающем меню будут указаны все характеристики. Их можно исправлять.
После этого нужно сделать зацикливание в while, чтобы светодиод мигал, пока не отключится питание.
Когда программа написана, ее можно загружать в контроллер. Если есть отладочная плата, ее нужно подключить через USB кабель и нажать Download Code To Flash. Если плата отсутствует, потребуется переходник, который нужно подключить к порту компьютера. Контакт BOOT 0 подключается к плюсу питания контроллера, а затем включается само питание МК. После этого начнется прошивка.
Чтобы загрузить программу в микроконтроллер, нужно следовать указаниям от приложения. Сначала прописывается код порта, к которому подключен микроконтроллер. Также указывается скорость. Советуется брать небольшое значение, чтобы не было сбоев. Программа найдет микроконтроллер, и нужно будет нажать кнопку «далее». Во вкладке Download to device нужно в поле Download from file выбрать написанную программу и нажать «далее».
После этого нужно отключить питание контроллера STM32, закрыть Flash Loader Demonstrator, выключить переходник. Теперь можно снова включить микроконтроллер в обычном режиме. Когда программа будет загружена, светодиод начнет мигать.
Работа в других программах проходит подобным образом. Также выбираются нужные библиотеки, и прописывается код. У платных утилит функционал больше, и можно создавать более сложные проекты.
ARM. STM32 быстрый старт
Данная статья, которая является еще одним “быстрым стартом” в освоении ARM-контроллеров, возможно поможет сделать первые шаги в освоении 32-битных контроллеров ARM на базе ядра Cortex-M3 – STM32F1xxx серии. Возможно данная статья (которых на эту тему появляется как грибов после дождя) станет для кого-то полезной.
Введение
Почему ARM?
1. Есть из чего выбрать (разными производителями сегодня выпускается более 240 ARM-контроллеров)
2. Низкая цена (например за 1$ можно получить 37хI / O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).
А начнем нашу работу с контроллеров фирмы ST Microelectronics. Контроллеры на основе ядра ARM Cortex-M3 характеризуются широким набором периферии, высоким уровнем рабочих характеристик, низкой цене
P.S. В самом начале создается впечатление, что ARM’ы это какие-то страшные (в пайке, разводке, программировании) существа. Но это только на первый взгляд 🙂 и вы в этом сами убедитесь.
Итак, изучать ARMы будем на примере контроллеров STM32F1. Одновременно эта серия имеет несколько линеек:
- Value line STM32F100 – 24 МГц CPU, motor control, CEC.
- Access line STM32F101 – 36 МГц CPU, до 1 Mб Flash
- USB access line STM32F102 – 48 МГц CPU with USB FS
- Performance line STM32F103 – 72 МГц, до 1 Mб Flash, motor control, USB, CAN
- Connectivity line STM32F105/107 – 72 МГц CPU, Ethernet MAC, CAN, USB 2.0 OTG
Также существует следующая классификация:
STM32F101xx, STM32F102xx, STM32F103xx
STM32F101xx, STM32F102xx, STM32F103xx
Connectivity line devices
Придется часто лазить здесь
Еще скажу несколько слов об этом ресурсе. Ясное дело, выбираем нужный контроллер и попадаем на страницу с кучей файлов в формате. рdf. (вкладка Design support). Можно читать все, но достаточно ознакомиться с такими файлами:
1. REFERENCE MANUAL (содержит полную спецификацию на контроллер).
2. ERRATA SHEET (содержит описание ошибок, которые могут возникать при работе с периферией).
3. Остальные документы содержат примеры работы с периферией, вопросы, связанные с программированием, описание некоторых библиотек, а с самого низа страницы можно найти EVARM-проекты демоплат и подобное ПО.
Архитектура
Итак, наш контроллер STM32 содержит в себе Cortex-M3 процессор (M означает серию для бюджетных устройств). Для того, чтобы начать программировать ARMы и не пользоваться только default’ными примерам и настройками нужно иметь представление об их архитектуре. Для начала:
1) 32-битный МК, выполненный по Гарвардской архитектуре (память программ и данных разделены),
2) имеет несколько отдельных шин и 3-ступенчатый конвейер и более 10 регистров общего назначения, что позволяет выполнять операции параллельно и (большинство) – за один такт.
3) набор инструкций – Thumb-2 (смесь 16 – и 32-битных команд, ориентированный на компиляторы C / C + +).
Рассмотрим упрощенную блок-схему шинной архитектуры STM32:
Архитектура на примере линейки Connectivity devices
Итак, давайте коротко пройдемся по основам основ:
Матрица шин (bus matrix) – контроллер высокоскоростных шин, обеспечивающий независимую связь и арбитраж (в случае одновременного доступа к одному ресурсу) между системной шиной и шиной данных ядра, DMA, Ethernet (masters) и периферией – SRAM, FLASH, AHB (slaves) .
Шины ядра:
ICode bus – 32-битная шина инструкций — обеспечивает связь ядра с интерфейсом инструкций Flash.
DCode bus – шина данных — обеспечивает связь ядра с интерфейсом данных во Flash.
System bus – системная шина ядра — обеспечивает связь ядра и периферии
Flash interface (FLITF) интерфейс Flash-памяти — обеспечивает чтение, запись, стирание, чтение с буфером предварительной выборки, защиту памяти (от записи или чтения).
AHB system bus (Advanced High-performance Bus) — шина, которая связывает матрицу шин и периферийные шины APB (Advanced Peripheral Bus (Bridge)). Шина AHB, предназначена для управления, например, регистрами системной периферии (GPIO ЦАП и т.п.). Надо сказать, что шины APB1,2 работают на разных частотах: так APB2 может работать на частоте ядра, а быстродействие APB1 ограничено 36 МГц. Поэтому, на APB2 и висит скоростная периферия (АЦП, некоторые таймеры порты ввода / вывода и т.д.)
DMA (Direct Memory Access) — обеспечивает прямой доступ к памяти в обход ядра (нужно лишь задать что, откуда и куда передать, а DMA сам все возьмет и передаст кому надо через матрицу шин)
Reset & Clock Control (RCC) — обеспечивает тактирование ядра и периферии (которая по дефолту отключена от тактового сигнала) и сброс контроллера.
Стандартная схема подключения
И здесь для начинающих возникает вопрос в чем и как рисовать и разводить печатные платы для, например, 144-ногого микроконтроллера (48-ноги еще куда не шло). Однако ничего страшного в рисовании схемы, разводке и пайке данных контроллеров нет. Для этого можно пользоваться программой Eagle (она содержит библиотеку компонентов ST или в крайнем случае можно поискать в Интернете или скачать внизу статьи), можно попробовать рисовать платы в старом добром Sprint-е (хотя, первый вариант мне кажется более надежным). Ниже приведены стандартные схемы включения контроллеров семейства Value line STM32F100С4 и Connectivity line STM32F105
Привожу базовую схему подключения контроллеров STM32F1 и некоторые их нюансы:
- Корпус: контроллеры STM32 помещены в корпусах LQFP с числом лапок от 48 до 144, при этом распиновка ножек контроллеров в одинаковых корпусах – совпадает, что не может не радовать.
- Питание:
- Контроллер питается от источника в 3.3 В (хотя можно подключать 2-3.6 В).
- Хотя напряжение питания равно 3.3В, много ножек контроллера толерантны к 5В сигналов (см. в спецификации лапки с пометкой FT).
- Vbat – используется для подключения резервного источника питания. Если в схеме резервный источник не используется, то Vbat надо посадить на общий источник питания.
- Vdd_1 . 4 подтягиваем к «+», Vss_1 . 4 сажаем на «-» источника питания.
- Спецификация на контроллер советует поставить параллельно источнику питания 5 конденсаторов в 100нФ (поближе к контроллеру) и один на 4.7мкФ (ближе к Vdd_3). Во многих схемах авторы часто не ставят их, думаю, если контроллер питается от чистого стабилизированного источника их можно не ставить.
- Питание АЦП (он питается напряжением 2,4-3,6 В) и цифровой части схемы в STM32 разделены (для большей надежности, очевидно) и если мы не используем отдельный источник для АЦП, Vdda / Vssa сажаем на соответствующие выводы общего источника, иначе схема может работать некорректно и непредсказуемо. В 100-пиновых корпусах есть еще дополнительные лапки опорного источника АЦП Vref + / Vref-. Vref- нужно повесить на Vdda, а на Vref + можно бросить от 2,4 В до Vdda.
- Резонатор. STM32 может тактироваться от:
- Внутреннего высокочастотного генератора на 8 МГц (HSI).
- Внутреннего низкочастотного источника тактовых импульсов 40 кГц (LSI).
- Внешнего высокочастотного осциллятора (HSE).
- Внешнего низкочастотного осциллятора на 32,768 кГц (LSE-генератор может работать вместе с HSE или синхросигналом и обеспечивает синхронизацию часов реального времени и работу оконного сторожевого таймера).
- Внешнего сигнала синхронизации (его частота должна быть целым делителем максимальной рабочей частоты контроллера).
- Сброс контроллера можно провести:
- «заземлив» лапку NRST. Стоит сказать, что разработчик постарался и уже включил подтягивающий резистор этой лапки. (external reset)
- С помощью одного из сторожевых таймеров независимого или оконного (IWDG или WWDG reset).
- С помощью схемы слежения за низким напряжением (low-power management reset)
- при входе в режим Standby
- при входе в режим Stop
- Программно – установкой определенного бита
Для удобства пайки LQFP корпусов, существуют переходники. Продаются на eBay, бывают универсальные и под фиксированное количество ножек. Средняя цена: 1$ за штуку, посмотреть можно здесь.
Использование модулей CAN на STM32 для разных целей
В последнее время, к сожалению, выросла цена на многие импортные радиодетали, в том числе и на отладочные платы с микроконтроллерами. А потребность в изготовлении разных поделок к счастью не пропала. Волей случая у меня в руках оказалось несколько интересных модулей от компании Starline, которая выпускает автомобильные сигнализации и много других полезных вещей (Можете поспрашивать у установщиков сигнализаций, или на сайте производителя). Целей раскрыть секреты работы этих модулей не стояло. Но ввиду их хорошего изготовления и оснащения оставить пропадать их без дела наше время тоже нехорошо.
Вкратце о модулях:
Модуль CAN — STM32F103RBT8 + SST25V016 + TJA1042, силовые ключи, микросхемы питания.
Модуль 2CAN — STM32F105RBT8 + SST25V032 + TJA1048, микросхемы питания.
(процессоры STM32F103 и STM32F105 (7) друг от друга функционально отличаются блоками тактирования, USB и CAN, надо обратить на это внимание далее)
Вооружившись тестером, разрисовал схемы модулей, возможно с ошибками. Наиболее интересным естественно оказывается модуль 2CAN, он позволяет одновременную работу USB FS и двух приемопередатчиков CAN. У первого модуля либо CAN, либо USB.
Скриншот схемы модуля CAN:
для поделок организация ввода вывода неплохая, но модуль 2CAN для интеграции в автомобиль интереснее, схема:
Так как на некоторых компонентах была неизвестная мне маркировка, то соответственно, я рисовал своё видение схемы.
Из модуля CAN на досуге сделал два полезных устройства – блок управления ходовыми огнями, и блок тестирования шаговых двигателей. Причем управление этими блоками осуществлялось как с внешних датчиков, так и по шине USB. Со стороны компьютера, подключенные блоки виделись как устройства с последовательным портом RS232. Причины изготовления блока управления ходовыми огнями – установленные китайские жгут чрезмерным током свои же светодиоды, от любой импульсной помехи выгорают с дымом. Блок их управления, не защищены от влаги, нет защиты от помех по питанию, нет экранировки. На CAN модуль была возложена функция управления логикой работы ходовых огней и дублирующих сигналов поворота, управление силовым транзистором повышающего преобразователя напряжения (на линейки светодиодов требуется порядка 24В), управление силовыми транзисторами, подающие питание на 4 линейки светодиодов, задержка выключения света в течение заданного времени после выключения зажигания.
Вот внутренности фонарей:
В вот так выглядят внутренности драйвера после непродолжительной работы:
Помехи от проводов от китайского ксенона погасили ходовые огни :). Ну а если делать с большим запасом надежности, и использовать модуль CAN, получается примерно так (еще без корпуса на этапе настройки под капризы заказчика):
Схема обвязки для модуля довольно простая (скриншот):
Устройство тестирования шаговых двигателей, применяемых в автомобиле, задавать режим работы можно с компьютера (через терминал), и с кнопок тоже:
Это все конечно баловство, но работает. Вот подключится к блокам управления автомобиля уже интереснее. Модуль 2CAN решил подключить к центральному блоку управления легкового автомобиля, и по USB подключить его к персональному компьютеру, чтобы иметь возможность видеть какими данными обмениваются многочисленные блоки управления в автомобиле (оснащенного CAN шиной), и по необходимости самому посылать произвольные команды. Для начала, чтобы потренироваться пересылать данные по CAN шине между собой (двумя интегрированными на модуле блоками CAN), желательно сделать вот такую схему:
Хотя бы так:
С другой стороны:
Но если вы подключаетесь уже к готовой функционирующей сети CAN, то это делать нет необходимости. К модулю допаяны светодиоды и кнопка, для отладки и наблюдения за работой модуля. И контакты для программирования по SWD. Что и куда подробно написано в комментариях в проекте. Модуль также при подключении к компьютеру по USB и будет определяться как последовательный порт (с использованием драйвера от ST). На что надо обратить внимание, блоки CAN микроконтроллера будут инициализироваться если:
Выводы микроконтроллера правильно сконфигурированы.
Выводы подключены к микросхемам – драйверам CAN шины.
На CAN шине выставлено правильное напряжение.
форма сигналов должна быть примерно такой:
Небольшая проблема возникла при приеме сигналов в модуль CAN2 (Sleave), нет смысла искать ответа в интернете и на форумах, в большинстве случаев будет лишняя трата времени, да и примеры готовые то в eclipse, то Iar, или вообще на ассемблере. А Я вот пишу в Keil (можно скачать бесплатно, немного обрезанную функционально версию). Оказывается, надо любить внимательно читать комментарии в стандартной библиотеке от STM. Необходимо просто правильно настраивать фильтр приема сообщений, и вот как раз на CAN2 (CAN Sleave) там отдельная процедура дополнительная. Для примера и приведу инициализацию CAN Sleave:
И фильтр сообщений:
Обработчик прерываний CAN Sleave:
Добавлю и тактирование процессора stm32f105 (у stm32f103 все проще):
Все подробно можно посмотреть будет уже в проекте (KEIL).
Что в итоге получилось:
Слева направо: плата STM32L в качестве программатора, модуль 2CAN, центральный блок управления автомобиля с двумя шинами CAN (высокоскоростная и низкоскоростная).
Вид без корпуса на процессор блока управления:
После того как запрограммировали модуль (прямо из KEIL, ST-Link SWD), через пару секунд после подключения USB кабеля в micro-USB разъем модуля 2CAN в компьютере определяется последовательный порт. Добавляем драйвера по необходимости, настраиваем номер порта, запускаем терминал, подаем команду “?”+«Enter», модуль отвечает своим меню:
Подаем питание на блок управления автомобиля (в соответствии с документацией производителя), и видим сообщения, в которых блок управления пытается понять где сам автомобиль:
Сигнал CANH на приборе(CANL зеркален по горизонтали и немного смещен):
В остальном все заработало без проблем. Данные с блока управления автомобиля по его шинам CAN High Speed (500) и CAN Low Speed (250) сыпались в терминал без ошибок и пропусков. Более глобальной цели на данный момент я не ставил. В проекте часть кода заимствована из выложенных проектов других людей, часть написал, конечно сам. Добавлял комментарии на русском. Так как управление модулем происходило по виртуальному последовательному порту, через программу «Терминал», в микроконтроллере постоянно работает процедура, принимающая данные от компьютера, разбирающая их на команды и аргументы. Нажав в терминале «?» и «Enter», получим от микроконтроллера список доступных команд и аргументов. По крайней мере, можно наверняка найти и другие недорогие способы использования для подобных вещей. В остальном, думаю разберетесь. Если что, можно задавать вопросы. Попробую выложить заодно файлы проектов, схем и документации, как появится возможность на этой страничке. Или если есть куда выложить мег. 70 полного архива, включающего полную документации и библиотеки. Извиняюсь за стиль кода и изложение, так как программирование не моя основная работа, делал все урывками, и ушло на все времени две недели.
Или спрашивайте тут, постараюсь ответить (статья начала 2015 года).
Далее, на примере данного блока напишу работу с автомобилем.
(в связи с кончиной сайта, где я раньше публиковался, ветка общения со специалистами пропала к сожалению)
С уважением, Астанин Сергей.
ICQ 164487932
Проект приложен.
схемы в лучшем разрешении в pdf в архивах.
Программирование STM32. Часть 3: Система тактирования
Первое, с чем необходимо разобраться перед дальнейшим изучением микроконтроллеров STM32, является система управления тактированием и сбросом, именуемая RCC. В этой статье мы рассмотрим, как правильно настроить микроконтроллер на работу от внешнего кварцевого резонатора на 8 МГц. Все статьи цикла можно посмотреть тут: http://dimoon.ru/category/obuchalka/stm32f1
Система тактирования в STM32 в сравнении с микроконтроллерами AVR выполнена довольно замысловато. Давайте разбираться.
Содержание:
- Шины
- Генераторы
- Тактирование периферии
- Источники сигнала SYSCLK
- HSE и PLL
- Что еще?
- Заключение
У микроконтроллеров STM32 все периферийные устройства (порты ввода-вывода, таймеры, интерфейсы SPI, и т.д.) подключены к так называемым шинам, через которые периферия получает тактовый сигнал и обменивается данными с ведущими устройствами шины (например, с процессором).
В STM32F103x8 три основных шины: AHB, APB1 и APB2. На каждой из шин висит определенная группа устройств:
- AHB: процессорное ядро, память и DMA;
- APB1: USART2, USART3, I2C1/2, CAN, таймеры TIM2..4;
- APB2: порты GPIO, АЦП, USART1, TIM1, SPI1.
В даташите на STM32F103x8 есть блок-схема, в которой указано, какая периферия куда подключена:
Рис. 1. Блок-схема микроконтроллеров STM32F103x8 и STM32F103xB
Схема на рис. 1 поначалу может казаться сложной и непонятной, это нормально, со временем все в голове уложится и ощущение непонимания исчезнет.
А еще есть вот такая таблица, в которой так же указаны периферийные устройства и шины, к которым они подключены:
Рис. 2. Таблица шин и периферийных устройств
Можно заметить, что на рис. 2 возле названия шины (AHB, APB1 и APB2) в скобках указана ее максимальная частота. Так как периферийные устройства получают тактовый сигнал от шины, ее частота задает скорость работы подключенных к данной шине устройств. Далее мы рассмотрим, как настроить частоту каждой из шин микроконтроллера.
Еще одной особенностью системы тактирования STM32 является то, что после сигнала сброса микроконтроллера вся периферия находится в отключенном состоянии и на нее не подается тактовый сигнал. Это сделано с целью снижения энергопотребления всего микроконтроллера. Перед началом работы с любым периферийным устройством необходимо разрешить подачу на него тактового сигнала. Как это сделать рассмотрим далее.
Итак, вот основные тезисы, которые необходимо запомнить:
- Все периферийные устройства в микроконтроллерах STM32 подключены к шинам (AHB, APB1 и APB2), через которые производится взаимодействие с устройствами и подача на них тактовых сигналов;
- Шины микроконтроллера STM32 могут иметь разные частоты тактирования;
- Перед началом работы с периферийным устройством необходимо разрешить подачу на него тактового сигнала.
Генераторы
В микроконтроллерах STM32F103x8/B присутствует несколько генераторов тактового сигнала:
Рис. 3. Блок-схема системы тактирования, красными прямоугольниками выделены генераторы тактовых сигналов
Первый из них — встроенный RC-генератор на 8 МГц, который называется High-speed internal (HSI) RC oscillator. После сброса микроконтроллер по-умолчанию тактируется как раз от этого генератора. Основным его плюсом является то, что для работы генератора не нужны ни какие дополнительные внешние компоненты. Однако его минус — плохая стабильность генерируемой частоты: при изменении температуры окружающей среды его частота в 8 МГц будет немного плыть. Для нетребовательных ко временнЫм интервалам устройств это может быть не критично, но в некоторых случаях данная особенность является недопустимой.
Следующий — High-speed external (HSE). Этот генератор является альтернативой HSI. Для его работы нужен внешний кварцевый резонатор на частоту 4-16 МГц. Его главным преимуществом в сравнении с HSI является стабильность генерируемой частоты. Так же, при определенной настройке, вывод OSC_IN можно подключить к источнику готового прямоугольного тактового сигнала без использования резонатора.
Далее Low-speed external (LSE). Этот генератор так же требует внешнего кварцевого резонатора, но только на 32768 Гц. LSE используется только для тактирования встроенных часов реального времени RTC, с помощью которых можно вести отсчет текущего времени, если это нужно.
Последний генератор — это Low-speed internal (LSI) RC oscillator. Это встроенный RC-генератор на 40 КГц. Он не отличается особой точностью, однако у него есть очень важная задача: генерация тактового сигнала для сторожевого таймера МК, который перезапустит систему в случае зависания. А еще от LSI можно тактировать RTC, но скорее всего это ни кто делать не будет
Тактирование периферии
Процессорное ядро и основная часть периферии использует тактовый сигнал SYSCLK.
Рис. 4. Распределение тактового сигнала SYSCLK
После делителя AHB Prescaler тактовый сигнал распределяется между шинами микроконтроллера. Сигнал HCLK поступает в процессорное ядро, память и периферию шины AHB. FCLK так же идет в ядро. Через фиксированный делитель на 8 тактирование подается на системный таймер Cortex System timer. Делитель APB1 Prescaler формирует сигнал тактирования устройств шины APB1, а APB2 Prescaler для устройств APB2.
Тут правда есть небольшая особенность формирования тактового сигнала для таймеров и АЦП.
Рис. 5. Распределение тактового сигнала шины APB1 между устройствами
Рис. 6. Распределение тактового сигнала шины APB2 между устройствами
Тактовый сигнал на таймеры подается следующим образом. Если делитель шины (APB1 Prescaler или APB2 Prescaler) установлен в единицу, то частота тактирования тактирования таймеров (TIMXCLK или TIM1CLK) будет равна частоте шины. Но, если делитель не равен единице, то частота тактирования таймеров будет в 2 раза больше частоты шины (см. рис. 5, 6). Вот так А для АЦП есть свой собственный делитель, который из частоты тактирования шины APB2 формирует сигнал ADCCLK (рис. 6).
Думаю, следует еще обратить внимание на вот эти элементы блок-схемы:
Это есть ни что иное, как устройства подачи тактового сигнала на конкретную периферию (логические элементы 2И). Попробую перерисовать один из них так, чтоб было понятнее, что это и как оно работает:
У каждого периферийного модуля в специальном регистре есть свой бит (SPI1EN, IOPAEN, IOABEN и так далее), при установке которого в единицу разрешается подача на него тактового сигнала. На рис. 8 я привел пример только для тактового сигнала PCLK2 шины APB2, для остальных сигналов (HCLK, PCLK1, TIMXCLK, TIM1CLK) все то же самое.
Источники сигнала SYSCLK
Итак, теперь мы знаем, что основным тактовым сигналом в микроконтроллерах STM32 является SYSCLK. Давайте теперь разберемся, как его получить. В нашем распоряжении 3 варианта: генераторы HSI, HSE и модуль PLL:
Рис. 9. Источники сигнала SYSCLK
После сброса микроконтроллера в качестве источника сигнала SYSCLK по-умолчанию устанавливается встроенный RC-генератор HSI. Прохождение тактового сигнала для этого случая представлено на рис. 10, значения по-умолчанию всех делителей обвел кружочком:
Рис. 10. Конфигурация системы тактирования по-умолчанию
А теперь давайте посчитаем значения всех частот в конфигурации по-умолчанию. Частоты HCLK, FCLK, PCLK1, TIMXCLK, PCLK2, TIM1CLK будут равны 8 МГц, частота Cortex System timer равна 1 МГц, а ADCCLK 4 Мгц.
Если мы хотим задействовать HSE-генератор, то картина будет следующей:
Рис. 11. Выбор генератора HSE в качестве источника тактирования SYSCLK
При использовании кварцевого резонатора на 8 МГц все системные частоты будут такими же, что и в предыдущем случае. Разница только в одном: при использовании генератора HSE стабильность частот лучше, чем при использовании HSI. Однако, если мы хотим получить максимальную производительность всей системы, то нужно в качестве источника SYSCLK использовать блок умножения частоты PLL.
HSE и PLL
В микроконтроллерах STM32 модуль PLL может тактироваться как от HSI генератора, так и от HSE. Существует огромное количество вариантов настройки тактирования системы от PLL. Мы остановимся только на одном, в котором используется HSE и все коэффициенты настроены на максимальную производительность системы:
Рис. 12. Схема прохождения тактового сигнала при использовании PLL совместно с HSE
Кварцевый резонатор выбираем на 8 МГц. Далее, сигнал с HSE без деления (настраивается битом PLLXTPRE) поступает на селектор PLLSRC и потом на PLL. Для того, чтобы из 8-и МГц получить 72 МГц, коэффициент умножения PLL должен быть равен PLLMUL=9. Далее, сигнал с PLL частотой 72 МГц через селектор SW поступает на SYSCLK. Так как процессорное ядро мы хотим тактировать максимальной частотой в 72 МГц, AHB Prescaler устанавливаем равный единице (без деления). Для получения частоты шины APB1, равной 36 МГц, APB1 Prescaler ставим равным 2. Шина APB2 имеет максимальную частоту 72 МГц, следовательно, APB2 Prescaler можно установить в 1.
- Кварц HSE на 8 МГц
- PLLXTPRE: без деления
- PLLSRC: HSE генератор
- PLLMUL = 9
- SW = PLLCLK
- AHB Prescaler = 1
- APB1 Prescaler = 2
- APB2 Prescaler = 1
Что еще?
Здесь мы не рассмотрели еще некоторые блоки системы тактирования, о которых хочется упомянуть.
Clock security system (CSS) — переводится примерно как «система безопасности тактирования». Если, при использовании генератора HSE в качестве источника тактового сигнала для SYSCLK или PLL, произойдет срыв генерации HSE, то CSS автоматически переключит всю систему на работу от встроенного RC-генератора HSI. Таким образом, если что-то случится с кварцем, система не зависнет намертво в неопределенном состоянии, а сможет выполнить какие-то действия, например, перевести объект управления в безопасное состояние (закрыть все вентили, отключить силовые установки, и т.д.)
Модуль часов реального времени RTC может тактироваться от встроенного LSI генератора на 40 КГц, от HSE через делитель на 128, либо от LSE с внешним кварцем на 32768 Гц. Источник тактовых импульсов выбирается с помощью RTCSEL.
Модуль USB получает тактовый сигнал от PLL, причем при частоте на выходе PLL равной 72 МГц есть возможность активировать USB Prescaler с коэффициентом деления 1.5 для получения необходимой частоты 48 МГц.
Microcontroller clock output (MCO) — вывод микроконтроллера, на который можно вывести частоту от одного из источников сигнала: SYSCLK, HSE, HSI либо сигнал с выхода PLL, поделенный пополам. Нужный источник выбирается с помощью битов MCO.
Заключение
Итак, мы рассмотрели основные моменты в системе тактирования микроконтроллеров STM32 на примере STM32F103x8 и STM32F103xB. В других микроконтроллерах STM32 примерно все то же самое, за исключением некоторых нюансов. В следующей части мы познакомимся с регистрами системы тактирования и сброса RCC и рассмотрим пример инициализации RCC.