Инструменты пользователя

Инструменты сайта


chibios:experience:clock-tree

Дерево синхронизации

Информация заимствована с easyelectronics.ru

Как можно увидеть из данной схемы, практически все блоки микроконтроллера затактовываются от линии SYSCLK, что расшифровывается как System Clock (в моем вольном переводе это будет звучать как «системная тактовая частота@). Исключение составляют блоки USB, RTC и IWDG. Так как системная тактовая частота очень важна, то разберемся сначала с ее генерацией.

Для определения частоты SYSCLK могут быть использованы три источника синхронизации:

  • Генератор HSI — внутренний высокоскоростной источник;
  • Генератор HSE — внешний высокоскоростной источник;
  • Внутренний PLL — система фазовой автоподстройки частоты (ФАПЧ). В нашем случае можно сказать, что это умножитель частоты с управляемым коэффициентом умножения.

Встроенный RC генератор (HSI)

Встроенный в микропроцессор генератор HSI вырабатывает тактовую частоту 8 МГц. Генератор автоматически запускается при появлении питания Vcc и при выходе в нормальный режим работы выставляет флаг HSIRDY в регистре RCC_CR. Первоначально процессорное ядро запускается на тактовой частоте HSI.

К преимуществам относятся быстрое время начала генерации тактовой частоты после подачи питания и отсутствие необходимости в использовании дополнительных электронных компонентов для работы микроконтроллера.

Недостаток – низкая стабильность частоты генерируемого сигнала, а при умножении на PLL погрешность тоже умножается. Например, частота HSI при разных температурных условиях плавает от 7.3 до 8.7МГц. При множителе в 9 на выходе будет разброс уже от 65.7 до 78.3 МГЦ.

Производитель гарантирует стабильность частоты в 1% при температуре ядра 25C, для чего в процессе производства в регистр RCC_CR записываются биты HSICAL[7:0], отвечающие за его калибровку. Если этого недостаточно или необходимо откалибровать микроконтроллер для работы при другой температуре, то можно воспользоваться битами HSITRIM[4:0] этого же регистра. После ресета там находится число 16, т.е. середина диапазона регулировки.

Изменение одного младшего бита дает подстройку приблизительно в 40кГц. Тактовая частота с генератора HSI может подаваться напрямую как источник системной частоты, либо поступать в блок умножителя частоты предварительно деленная на 2.

Генератор HSI может быть включен/выключен управлением бита HSION регистра RCC_CR.

Внешний генератор (HSE)

В качестве внешнего генератора могут выступать:

  • Внешний тактовый сигнал, не превышающий 25МГц, поданный на ножку OSC_IN в то время, как нога OSC_OUT находится в высокоимпендансном состоянии.
  • Внешний кварцевый резонатор подключенный на ножки OSC_IN и OSC_OUT. Внешний кварцевый резонатор должен быть в диапазоне от 4 до 16МГц и при его использовании достигается очень высокая стабильность частоты работы генератора.

Внешний генератор HSE по умолчанию выключен и его включение/выключение управляется битом HSEON регистра RCC_CR. После включения HSE и его выхода в рабочий режим устанавливается бит HSERDY, кроме этого, может быть сгенерировано прерывание. Также как и сигнал с генератора HSI, сигнал HSE может быть подан напрямую в качестве системного тактового сигнала, либо поступать в блок умножения. Но в отличие от HSI в блок умножения он может поступать напрямую, либо пройдя через делитель на 2.

ФАПЧ (PLL)

Внутренний умножитель частоты может умножать вошедший тактовый сигнал с одного из трех источников, на выбор:

  • HSI/2;
  • HSE;
  • HSE/2.

на множитель от 2-х до 16-ти. По-умолчанию умножитель выключен и его включение/выключение управляется битом PLLON регистра RCC_CR. После включения PLL и его выхода в рабочий режим устанавливается бит PLLRDY, кроме этого может быть сгенерировано прерывание.

Работа умножителя конфигурируется через регистр RCC_CFGR.

Все манипуляции над его режимами работы должны проводиться только при выключенном PLL!

В данном регистре:

  • Бит PLLSRC задает источник умножения, либо HSI либо HSE.
  • Бит PLLXTPRE задает будет ли сигнал с HSE предварительно делиться на 2 или нет.
  • Биты PLLMUL[3:0] задают коэффициент умножения от 2-х до 16-ти.

С источниками системной тактовой частоты вроде разобрались. Теперь, прежде чем пройти дальше, куда там эта частота подается, отойдем немного в сторону и посмотрим, что у нас есть еще… :-)

А есть у нас, во-первых, блок USB. Особенностью его является то, что работать он может только на частоте 48МГц! Если частота будет отличной от 48МГц, то другие устройства на шине USB нас не поймут, а мы их. Из схемы видно две вещи:

  • Тактовые сигналы на блок USB идут с PLL.
  • Перед блоком USB стоит делитель с управляемым коэффициентом деления 1 или 1.5.

Из этого следует, что если нам нужна работа USB, то обязательно должен работать PLL и его выходная тактовая частота должна быть либо 48 (при делителе USB=1), либо 72 (при делителе USB=1.5) МГц! И все! Больше никаких вариантов.

Во-вторых, есть у нас еще RTC (часы реального времени). Что такое часы реального времени, думаю знают все. Они могут работать, от батарейного питания, при выключенном микроконтроллере. Источником тактовой частоты для них могут являться:

  • Тактовые сигналы генератора HSE, деленные на 128;
  • Тактовые сигналы генератора LSI (Low Speed Internal – внутренний низкоскоростной), который генерирует 40кГц;
  • Тактовые сигналы генератора LSE (Low Speed External – внешний низкоскоростной), для его работы нужен внешний «часовой» кварц на 32.768кГц.

Ну и в третьих, есть еще IWDG (Independent Watchdog – независимая сторожевая собака :-) Что это такое в данной статье вдаваться не будем. IWDG тактуется сугубо от LSI, описанном чуть выше.

Ну вроде всё, теперь можно перейти и к остальным блокам, которые тактуются от системной частоты SYSCLK.

Дальше системная тактовая частота попадает в делитель шины AHB, который делит её на делитель от 1 до 512, все остальные блоки получают на вход уже эту деленную частоту (некоторые блоки имеют ещё дополнительные делители). По схеме всё видно, какой блок имеет делитель, а какой нет, какие коэффициенты деления у делителей и какая периферия в итоге какую частоту получает.

Например, блоки SDIO и FSMC работают на частоте шины AHB. Шины APB1 и APB2 имеют собственные делители с коэффициентами от 1 до 16. Блок ADC имеет делитель от 2 до 8 и т.д.

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

Кроме того, на схеме это не показано, очень важно знать и помнить 2 вещи:

  • Какие блоки на какой шине сидят. Например, порты ввода вывода сидят на шине APB2, контроллеры шины I2C сидят на шине APB1, контроллера прямого доступа к памяти на шине AHB, а, например, таймеры, частью сидят на APB2, а частью на APB1.
  • Каждый блок имеет свой вход тактовых сигналов и бит управления этим входом. И по-умолчанию практически все блоки отключены от тактовых сигналов!!!

Т.е., если нужна работа какого-то блока: GPIO, DMA, ADC, DAC, таймеров и т.д., то не забываем подавать на них тактовые сигналы, т.е. устанавливать соответствующие биты! Иначе работать ничего не будет!

Зачем же нужно такое разнообразие делителей, умножителей, источников синхронизации и т.д? А нужно это всё для гибкой и точной настройки микроконтроллера под задачу, которую ему предстоит решать в том или ином проекте. Если не нужны какие-то блоки, то просто отключаем их от источников синхронизации, нечего им энергию потреблять вхолостую (что по умолчанию и сделано). Если не требуется в проекте высокая производительность, то можно сконфигурировать микроконтроллер на работу на частоте, например, 48, 36, 24 и т.д. МГц, что опять же понизит его энергопотребление и т.д.

Алгоритм ручной настройки частоты

  • Определяемся с чего будем работать (HSI или HSE) и с какой частотой.
  • Если HSE, то выбираем внешний кварц. Гнаться за частотой не надо — чем медленней кварц, тем надежней он работает, т.к. менее требователен к качеству разведения платы. Оптимально 8…12МГц. Но тут надо учитывать, что мы должны «попасть» в частоту USB (опять же если USB нужна, если нет, то пофигу).
  • Затем определяем каким путём пойдёт тактовый сигнал через все эти мультиплексоры/делители/множители попутно вычисляем нужные величины делителей.
  • Начинаем разглядывать битики в RCC регистрах, определяясь, что нам и каким образом нужно выставить.
  • Выставляем!

Но не всё так просто. Тут мало взять и навтыкать конфигураций, а вдруг мы переключились на кварц, а его нету? Или на дорожки попала влага и он не завелся? Или банально забыли включить? Есть система защиты, по правилам которой мы можем переключиться на другой источник тактирования только в том случае, когда точно знаем, что с ним все в порядке. Сделано это на флагах. Т.е. , например, включили мы PLL и ждём пока появится флаг готовности PLL и только тогда переключаемся. Иначе все повиснет нафиг.

Стоит рассказать ещё об одном блоке, который сам в генерации тактовых сигналов участия не принимает, но иногда может оказаться весьма полезным. На схеме он обозначен как CSS. Из схемы видно, что на вход ему подается тактовая частота с HSE, а выход из этого блока заведён на блок выбора источника системного тактового сигнала. Итак, что же это за блок какой-то защиты? Назначение этого блока — следить за тактовыми сигналами поступающими с HSE и если с ними случится какой-то косяк, например они пропадут (кварц там у нас отвалился или ещё что произошло), то этот блок может вмешаться в ситуацию и тогда происходит следующее:

  • Автоматически отключается HSE.
  • Посылается событие на останов работы расширенных таймеров TIM1 и TIM8.
  • Генерируется прерывание CSSI, которое внутри процессора заведено на немаскируемое прерывание NMI, т.е. пропустить его невозможно.
  • Если в качестве источника системной частоты использовался HSE напрямую либо через PLL, то источник системной частоты автоматом переключается на HSI.
  • Если PLL был активен и входом ему служил сигнал с HSE, то PLL отключается.

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

Ну и для того, чтобы эта прелесть заработала ее надо включить программно через установку бита CSSON регистра RCC_CR. По-умолчанию, он сброшен.

chibios/experience/clock-tree.txt · Последние изменения: 2014/12/09 19:47 — Ruslan Popov