Решил написать книгу …
… про реальную разработку устройств на 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. Если взглянуть на плату, то вроде да, кварцевый резонатор довольно (относительно конечно) далеко от ножек. На некоторых платах он часто его чуть ли не на ножки кладут. Но в общем и целом надо будет учесть этот момент в дальнейшем.
Да и вообще, рассматривание схем чужих, гарантированно рабочих и предназначенных для огромных тиражей плат способно сильно продвинуть в решении вопросов «как это сделано».
Продолжение следует...