Перейти к содержанию

Система тактирования STM32

В этой заметке приводится краткое описание системы тактирования на примере микроконтроллеров STM32F103 и STM32F411.

Основные сведения

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

Как явствует из названия, речь пойдет о системе - некотором множестве элементов, находящихся в отношениях и связях друг с другом, которое образует определенную целостность. Что это значит, зачем требуется знать и причем здесь "тактирование"?

Тактирование - это применение специального сигнала для согласования операций одной или более цифровых схем.

Действительно, как несколько устройств могут взаимодействовать между собой?

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

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

Можно заметить, что сам по себе сигнал тактирования не определяет порядок приема и передачи сигналов. Он лишь обеспечивает синхронную обработку разными устройствами, а правила обмена конкретными сигналами описывают протоколы - наборы соглашений, которых должны придерживаться устройства для определения самих сигналов и их назначения.

Рассмотрение протоколов выходит за рамки данной заметки.

Элементы системы тактирования

Как любая система, RCC по определению состоит из элементов. Из сказанного выше можно заключить, что элементами системы тактирования являются, по-крайней мере, все периферийные устройства, т.к. они - потребители сигнала тактирования.

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

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

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

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

Документация

Необходимо сказать несколько слов о документации, которая потребуется для лучшего понимания материала. Прежде всего - это документы datasheet и Reference Manual. Для каждого микроконтроллера эти документы - свои.

Обращайте внимание на заголовки документов. Они отражают принадлежность данного документа к определенному множеству устройств. Например, если в заголовке используется STM32F103XX, то этот документ касается модификаций только STM32F103. С другой стороны, если указано STM32F4XX, то этот документ касается моделей 411 и 401, и других микроконтроллеров серии 4.

Так же не нужно исключать массу статей, которые можно легко найти в Интернет. Теперь приступим к рассмотрению элементов системы тактирования.

Источники

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

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

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

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

К внутренним (Internal) относятся так называемые генераторы частоты или (RC oscillator), встроенные непосредственно в микроконтроллер. Внешние (External), чаще всего кварцевые резонаторы, можно подключить к микроконтроллеру дополнительно. Одномоментно можно использовать только один высокочастотный и один низкочастотный источник генерации тактового сигнала.

Почему источников по два? Дело в том, что каждый из них обладает определенной частотой генерации. Один из них - более высокой (High-Speed), другой - более низкой (Low-Speed). Высокочастотные источники чаще всего используются для тактирования основной массы периферийных устройств, а также ядра, памяти и т.д. Низкочастотные обычно применяются для тактирования таймера времени (Real Time Clock) и некоторых других целей.

Для получения более точной информации, потребуется документация. Одним из важнейших источников является схема тактирования (Clock tree). Для STM32103 ее можно найти в datasheet, а для STM32F411 - в Reference Manual. Кроме этого, схема тактирования (причем, интерактивная) доступна в среде разработки STM Cube IDE или приложении Cube MX.

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

HSE

LSE

Состав пинов у этих двух микроконтроллеров отличается, но есть и сходства. Например, у обоих устройств есть пины OSC_IN, OSC_OUT, OSC32_IN и OSC32_OUT, а также MCO (пусть у STM32F411 их два: MCO1 и MCO2). К этим пинам можно подключить внешние источники тактирования. К OSC_IN и OSC_OUT подключают высокочастотный внешний источник (High-Speed External) или HSE, а к OSC32_IN и OSC32_OUT - низкочастотный внешний источник (Low-Speed External), или LSE. Внутри контура микроконтроллера (по правую сторону от "границы") указаны, в виде блоков, допустимые диапазоны частот внешних источников тактирования.

Пин MCO используется для подачи на него базовой частоты (Main Clock Output) в целях диагностики. Это можно использовать для проверки действующего сигнала тактирования при помощи осциллографа. Использование этого пина подробно в этой заметке не рассматривается.

Теперь найдите на схемах блоки HSI RC и LSI RC. Это внутренние источники тактирования - генераторы частоты. В блоках указаны их частоты. Как было сказано выше - эти генераторы встроены в микроконтроллер.

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

HSI

LSI

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

На изображениях выше, показаны примеры из datasheet на STM32F103. Посмотрите Reference Manual от STM32F411 чтобы убедиться, что там такие же источники генерации тактового сигнала, отличающиеся только частотными характеристиками.

Временно отложим схему тактирования, чтобы сделать общий обзор остальных элементов и вернемся к ней уже для рассмотрения настройки.

Шины

Шины в микроконтроллерах являются элементом системы тактирования и обеспечивают взаимодействие периферийных модулей.

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

На диаграммах рассматриваемых микроконтроллеров указаны три шины: AHB, APB1 и APB2. К шине AHB подключаются основные периферийные устройства: ядро, память, контроллер DMA и другие компоненты. Кроме этого, к AHB подключаются APB1 и APB2. В свою очередь к ним подключаются встроенные периферийные устройства (GPIO, таймеры, SPI и т.п.). В таблице ниже перечислены частотные характеристики указанных шин.

Шина STM32F103 STM32F411
AHB 48/72 MHz 100 MHz
APB1 24/36 MHz 50 MHz
APB2 48/72 MHz 100 MHz

На схемах фигурируют также AHB1 и AHB2. При этом, у STM32F103 эти две шины на схеме выглядят просто как "шлюзы" между APB1, APB2 и AHB. Но на схеме STM32F411 к AHB1 покдлючены APB1 и APB2, а вот к AHB2 подключено периферийное устройство - USB. Забегая вперед, отметим, что эта часть шины AHB используется спецаильно для ISB OTG. Таким образом, из схем тактирования очевидно, что в зависимости от модели микроконтроллера, функциональность шин может отличаться.

Частота шины определяет частоту работы периферийных устройств, подключенных к ней. Здесь можно возразить, что ведь в некоторых случаях указанные частоты могут быть недостаточны или избыточны для того или иного периферийного устройства. Действительно, в таких случаях в микроконтроллере могут быть предусмотрены промежуточные устройства (делители или умножители) частоты. Они могут быть настроены для получения нужной частоты на входе какого-либо периферийного устройства. Эти компоненты рассмотрим позднее.

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

Потребители

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

Точный перечень встроенных периферийных устройств дается в таблице features and peripheral counts. В этой таблице вы можете найти количество тех или иных устройств именно для вашего чипа. Обратите внимание, что кроме серии (вверху таблицы), здесь нужно учитывать корпус вашего микроконтроллера (внизу). Как видно из таблицы, некоторые параметры идентичны для всех устройств, а некоторые могут заметно отличаться.

Например, вот полный перечень периферии для STM32F103C8T6 и STM32F411CCU6:

Название STM32F103C8T6 STM32F411CCU6
Flash (KB) 64-128 256
SRAM (KB) 20 128
Gen. Timers 3 7
Adv. Timers 1 1
SPI 2 5
I2C 2 3
USART 3 3
USB 1 1
SDIO - 1
CAN 1 -
GPIO 37 36
ADC 2 10
CPU Freq. (MHz) 72 100
Voltage 2.0-3.6 1.7-3.6

В таблице можно заметить нюанс - объем флэш-памяти для STM32F103C8T6 указан в виде диапазона - не точно. Дело в том, что в документации есть еще одна таблица Ordering information scheme. В ней указаны расшифровки каждого значения из названия чипа. Таким образом, цифра 8 говорит о том, что на борту этого микроконтроллера 64 килобайта флэш-памяти.

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

В первую очередь обратим внимание на новый элемент - мультиплексор:

multiplexor

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

На картинке выше изображен мультиплексор с двумя входами, одним выходом и входом для управляющего сигнала. Чтобы осуществить переключение определенного входа на выход, нужно подать соответствующий управляющий сигнал.

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

Каждый из рассматриваемых микроконтроллеров имеет по четыре возможных источников генерации тактового сигнала. Будем последовательно рассматривать каждый микроконтроллер и для каждого из них - тактирование от HSE и LSE, затем от HSI и LSI. Цветом будут выделены пути прохождения сигнала.

Тактирование периферии STM32F103C8T6

На изображении ниже показано, как выглядят пути прохождения сигнала тактирования от внутренних источников. Первое, что бросается в глаза - это гораздо более сложная схема для тактирования периферийных устройств от высокочастотного источника HSI (подсвечено красным) и более простая от источника LSI (подсвечено синим) - для тактирования RTC и IWDGCLK (их мы здесь рассматривать не будем; достаточно напомнить, что RTC - это Real Time Clock - часы реального времени).

stm32f103 clock internal

Подробно рассмотрим схему тактирования периферийных устройств. Проще всего дело обстоит с низкочастотным генератором: его сигнал тактирования на частоте 40KHz без всяких преобразований поступает на RTC и IWDG.

Немного сложнее с высокочастотным сигналом тактирования, здесь он одновременно попадает к трем разным элементам.

Непосредственно от генератора сигнал поступает к интерфейсу программирования флэш-памяти FLITFCLK и системному мультиплексору SW. До этих элементов сигнал доходит на частоте 8 MHz.

К мультиплексору PLLSRC сигнал проходит через делитель на 2, так что на выходе мультиплексора будет 4MHz. После этого, сигнал попадает в модуль умножителя PLLMUL, где мы можем установить один из коэффициентов умножения: от 2 до 16, получая таким образом частоту от 8 до 64 MHz. Далее, сигнал поступает к периферийному устройству USB и параллельно на все тот же системный мультиплексор, где, если мы выбираем использование PLL (об этом дальше), формируется SYSCLK.

Отметим важную деталь. Сигнал, далее называемый SYSCLK - это сигнал базовой частоты, будет подаваться на все задействованные периферийные устройства, с учетом делителей и умножителей, имеющихся на шинах AHB, APB1 и APB2.

Обобщая сказанное сделаем вывод о том, что при тактировании от HSI есть два возможных варианта получения SYSCLK:

  1. Прямое использование HSI, что даст частоту 8MHz.
  2. Использование мультиплектора PLLSRC и, затем, умножителя PLLMUL, что может дать частоты SYSCLK в диапазоне от 8 до 64 MHz.

Также отметим, что использование USB при тактировании от HSI невозможно, т.к. в datasheet сказано: "Для доступности функции USB должны быть включены HSE и PLL, при этом USBCLK работает на частоте 48 МГц." (примечание 2 к схеме тактирования).

Полученная частота SYSCLK используется для тактирования шины AHB, от которой, как мы помним, тактируются шины APB1 и APB2, и от которых в свою очередь непосредственно тактируются все периферийные устройства. У нас есть возможность использовать модуль делителя шины AHB, что позволяет применить коэффециенты 1, 2, 4, 8, 16, 64, 128, 256 или 512 для получения соответствующей выходной частоты.

Рассматривая схему далее, можно заметить, что AHB непосредственно тактирует ядро (core), контроллер DMA (в этой статье не рассматривается) и системный таймер (Cortex System timer). Максимальная частота для тактирования ядра не должна превышать 72MHz, а для системного таймера предусмотрен делитель на 1 или 8.

Кроме ядра, от AHB тактируются APB1 и APB2, для каждой из которых имеется свой делитель с возможными коэффициентами 1, 2, 4, 8 или 16. Заметим, что максимальная частота для APB1 не должна превышать 36MHz, а для APB2 - 72MHz. Также каждая из этих шин формирует отдельный тактовый сигнал для таймеров, которые подключены к данным шинам. Здесь необходимо описать нюанс, связанный с тактированием таймеров. Если делитель шины, APB1 или APB2 соответственно, равен 1, то умножитель таймеров также будет равен 1. При иных значениях коэффициента делителя, коэффециент умножителя будет равен 2.

Таким образом, шины APB1 и APB2 могут иметь выходную частоту от 36 до 4 MHz и от 72 до 4 MHz соответственно, а частоты их таймеров от 64 до 8 MHz.

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

2 AND

Это элемент (2AND), то есть логическое И c двумя входами. Это классический пример логического элемента, на выходе которого получается значение 1 только если оба входных значения равны 1. Таким образом, эти элементы реализуют некие "выключатели" периферийных устройств, включая их только если подан сигнал тактирования и также подан некий управляющий сигнал (на рисунке выделен красным цветом).

Как можно видеть на схеме тактирования, такими "выключателями" оснащены ядро, контроллер DMA, шины APB1 и APB2. То есть тактирование этих устройств необходимо включать. Как именно включаются устройства, будет показано далее, а на этом рассмотрение тактирования периферийных устройств от внутренних источников можно завершить.

А так выглядят пути прохождения сигнала тактирования от внешних источников:

stm32f103 clock external

Внешний низкочастотный источник должен генерировать сигнал частотой 32.768 KHz и от него тактируется RTC без всяких преобразований.

Аналогично тактированию от внутренних источников, схема для внешнего высокочастотного источника немного сложнее. Максимальная частота источника 16MHz. Далее, получить SYSCLK можно либо через PLLSRC и PLLMUX, и после этого через мультиплексор SW, либо сразу через этот же мультиплексор. В первом случае исходную частоту можно сначала умножить в PLLMUL, а во втором случае она будет равна частоте источника.

После получения SYSCLK схема полностью идентична описанной для случая тактирования от внутренних источников, поэтому повторяться не будем. Остается добавить только, что при использовании HSE через мультиплектор SW автоматически включается механизм CSS *(Clock Security System), который контролирует частоту внешнего источника и в случае ее срыва автоматически переключит систему на тактирование от внутреннего источника.

Тактирование периферии STM32F411CCU6

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

На следующем изображении показаны пути прохождения сигнала тактирования от внутренних источников. Как и с STM32F103C8T6 более сложной является схема тактирования от высокочастотного источника HSI (подсвечено красным), от источника LSI (подсвечено синим), для тактирования RTC и IWDGCLK - более простой.

stm32f103 clock internal

И так же, как в случае STM32F103C8T6, проще всего дело обстоит с низкочастотным генератором: его сигнал тактирования на частоте 32KHz без всяких преобразований поступает на RTC и IWDG.

Высокочастотный сигнал тактирования, частотой 16MHz можно сразу получить на системном мультиплексоре SW, что даст частоту SYSCLK равную 16MHz, а можно при помощи этого же мультиплексора получить измененную частоту сигнала через PLLSRC и PLLMU. В этом случае частота SYSCLK будет получена с помощью умножителя PLL и может достигать 100MHz. Этот вариант дает очень много вариантов настройки частоты AHB.

Однако, на схеме мы видим еще два варианта прохождения высокочастотного сигнала, именованные как PLL48CK и PLLI2CCLK. Что это за варианты? Поиск ответа в datasheet ничего не дает, но в Reference Manual мы находим следующее:

Тактирование всех периферийных устройств основано на SYSCLK за исключением:

  1. USB OTG FS и SDIO, тактовая частота которых (48 MHz и до 48 MHz соответственно), поступающая с выхода PLL - PLL48CLK.
  2. Тактовый сигнал устройства I2S (в данной статье не рассматривается). Для достижения высококачественного звука тактовый сигнал I2S может быть получен либо от PLLI2SCLK, либо из внешнего источника на пин I2S_CKIN.

Тактирование ядра, контроллера DMA, системного таймера, а также шин AHB, APB1, APB2 и таймеров осуществляется с применением делителей и условий, аналогичных таким же в STM32F103C8T6.

И совсем кратко придется сказать о тактировании от внешних источников, т.к. оно аналогично такому же для STM32F103C8T6. Отличия касаются только значений частот.

stm32f103 clock internal

Остается лишь сказать несколько слов о том, что в STM32F411CCU6 предусмотрена гораздо более гибкая настройка MCO, но т.к. работа с этим элементом в данной статье не рассматривается, мы ее опускаем.

Практическая настройка

В этом параграфе рассматривается настройка RCC при помощи кода на языке C и библиотеки LL.

подумать, как подвести к тому, что регистры - это логичный элемент написать про регистры: что это такое и где находится и зачем применяется