Информация заимствована с easyelectronics.ru
Как можно увидеть из данной схемы, практически все блоки микроконтроллера затактовываются от линии SYSCLK
, что расшифровывается как System Clock
(в моем вольном переводе это будет звучать как «системная тактовая частота@). Исключение составляют блоки USB
, RTC
и IWDG
. Так как системная тактовая частота очень важна, то разберемся сначала с ее генерацией.
Для определения частоты SYSCLK
могут быть использованы три источника синхронизации:
HSI
— внутренний высокоскоростной источник;HSE
— внешний высокоскоростной источник;
Встроенный в микропроцессор генератор 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
.
В качестве внешнего генератора могут выступать:
OSC_IN
в то время, как нога OSC_OUT
находится в высокоимпендансном состоянии.OSC_IN
и OSC_OUT
. Внешний кварцевый резонатор должен быть в диапазоне от 4 до 16МГц и при его использовании достигается очень высокая стабильность частоты работы генератора.
Внешний генератор HSE
по умолчанию выключен и его включение/выключение управляется битом HSEON
регистра RCC_CR
. После включения HSE
и его выхода в рабочий режим устанавливается бит HSERDY
, кроме этого, может быть сгенерировано прерывание. Также как и сигнал с генератора HSI
, сигнал HSE
может быть подан напрямую в качестве системного тактового сигнала, либо поступать в блок умножения. Но в отличие от HSI
в блок умножения он может поступать напрямую, либо пройдя через делитель на 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
. По-умолчанию, он сброшен.