Дек 252011
 

В микроконтроллерах серий STM32L151xx, STM32L152xx система тактирования позволяет использовать различные источники для формирования системной тактовой частоты и синхросигналов для периферийных устройств.

Система довольно гибкая и разветвленная, ниже на рисунке можно увидеть все "дерево" системы тактирования.

STM32L_clock tree
Рисунок 1. "Дерево" системы тактирования.

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

  • HSI (high-speed internal) — внутренний высокочастотный RC-генератор.
  • HSE (high-speed external) — внешний высокочастотный генератор.
  • PLL — система ФАПЧ. Точнее сказать, это вовсе и не генератор, а набор из умножителей и делителей, исходный сигнал он получает от HSI или HSE, а на выходе у него уже другая частота.
  • MSI (multispeed internal) — внутренний RC-генератор с возможностью выбора частоты из нескольких предопределенных вариантов. По дефолту это основной источник для формирования всех тактовых сигналов при включении питания (аппаратной перезагрузке через Reset), а также при "пробуждении" из режимов пониженного потребления STOP и STANDBY

Также имеются 2 вторичных источника тактового сигнала:

  • LSI (low-speed internal) — низкочастотный внутренний RC-генератор на 37 кГц
  • LSE (low-speed external) — низкочастотный внешний источник на 32,768 кГц

Далее более подробней рассмотрим каждый из возможных вариантов формирования тактовой частоты.

Основные генераторы тактовой частоты

HSE
Высокочастотный внешний сигнал может быть получен двумя способами:

  • От внешнего источника тактового сигнала (до 32 МГц) — режим HSE bypass. Форма сигнала может быть не только прямоугольной, но и синусом или треугольником. Коэффициент заполнения при этом (duty cycle) должен быть равен 50%, то есть для прямоугольного импульса это "меандр".
  • С использованием внешнего кварцевого/керамического резонатора от 1МГц до 24 МГц.

Источники HSE
Рисунок 2. Варианты использования HSE/LSE.

HSI
Сигнал формируется внутренним RC-генератором, настроенным на частоту 16 МГц, других вариантов тут нет. Точность этого генератора конечно не такая, как при использовании HSE с кварцем. Преимущество здесь в отсутствии внешних элементов, когда не требуется высокая стабильность частоты. Заводская калибровка производится с допустимой погрешностью в 1% при температуре 25°С. Калибровочное значение находится в битах HSICAL [7:0] регистра RCC_ICSCR — Internal Clock Sources Calibration Register. Пользователю эти биты доступны только для чтения. Если есть необходимость в подстройке частоты этого генератора, например, при работе с другими значениями питающего напряжения или температуры, то для этого предоставлены биты HSITRIM в том же регистре. Еще одна особенность в том, что АЦП можно тактировать только от этого генератора!

MSI
Также как и HSI физически представляет собой RC-генератор. Отличие в том, что он может работать не на одной частоте, а имеется возможность выбора из следующих семи вариантов:
65,536 кГц
131,072 кГц
262,144 кГц
524,288 кГц
1,048 МГц
2,097 МГц
4,194 МГц
Рабочую частоту можно выбрать программированием бит MSIRANGE [2:0] все того же регистра RCC_ICSCR. Еще один важный нюанс: при включении питания (или перезапуске через Reset), а также при пробуждении из режимов пониженного потребления Stop и Standby, именно этот генератор запускается по умолчанию и формирует тактовую частоту до тех пор, пока не будут выбраны другие источники тактирования. Заводская установка частоты по дефолту — 2,097 МГц с погрешностью не более 1% при Т = 25°C. Заводские калибровки находятся в битах MSICAL [7:0] регистра RCC_ICSCR (и также доступны только для чтения). Пользовательская подстройка частоты возможна с помощью бит MSITRIM [7:0]. Как видим из рисунка 3, регистр RCC_ICSCR позволяет настраивать частоты внутренних генераторов HSI и MSI.

RCC_ICSCR
Рисунок 3. Регистр RCC_ICSCR

PLL
Внутренний источник PLL тактируется от внешнего или внутреннего высокочастотных генераторов (HSE либо HSI). Кроме системной тактовой частоты SYSCLK, также выдает частоту 48 МГц для интерфейса USB. При использовании USB входная частота для PLL должна быть в диапазоне от 2 МГц до 24 МГц. При этом сначала с помощью умножителя формируется частота PLLVCO = 96 МГц, а затем делится на 2, таким образом, на выходе получаем 48 МГц для интерфейса USB. При задании коэффициентов умножения/деления частоты надо обратить внимание на следующие нюансы:
Во-первых, мы имеем дело с серией L, "заточенной" под режимы малого потребления мощности и использование батарейного питания. Поэтому обратите внимание на следующую таблицу, в ней даны максимальные значения частот генераторов HSE, HSI и MSI в зависимости от диапазонов питающего напряжения. А также максимально возможная частота на выходе PLL и частота для USBPLLVCO.

System Clock Sources Frequency
Рисунок 4. Максимальные тактовые частоты в зависимости от напряжения питания

Во-вторых, не забывайте, что системная тактовая частота SYSCLK в данном случае формируется из выходной частоты PLLPLLVCO, которая может быть равна 96 МГц. А SYSCLK в данной серии может быть не более 32 МГц. Необходимо установить нужный коэффициент делителя PLLDIV (см. рисунок 1).
И, в-третьих, при включенной системе PLL, настроить коэффициенты умножения/деления уже будет невозможно. Чтобы их поменять, необходимо деактивировать PLL очисткой бита PLLON в регистре RCC_CR. Затем дождаться очистки флага PLLRDY в том же регистре, и только потом изменять параметры. Включается PLL установкой бита PLLON.

Дополнительные генераторы тактовой частоты

LSE
Здесь возможны два варианта:

  • Применение внешнего кварцевого/керамического резонатора на 32,768 кГц на входах OSC32_IN, OSC32_OUT. Высокостабильный источник, формирует тактовые сигналы для часов реального времени RTC, модуля ЖКИ, а также для таймеров TIM9/TIM10/TIM11.
  • Использование внешнего источника тактовой частоты (режим LSE bypass). Формируются тактовые сигналы для часов реального времени и ЖКИ. В этом режиме исходный сигнал поступает с генератора HSE. Входная частота может быть до 1 МГц, затем сигнал проходит через делитель с коэффициентом деления 2, 4, 8 или 16. Входной сигнал может быть прямоугольной, треугольной формы или синусоидой с 50% duty cycle.

LSI
Внутренний RC-генератор частотой около 37 кГц. Как и LSE, позволяет тактировать часы реального времени и модуль ЖКИ. Кроме этого, поддерживает работоспособность независимого сторожевого таймера IWDG в режимах Stop и Standby.

Выбор и конфигурирование источника для формирования системной тактовой частоты — SYSCLK

Как уже упоминалось, системная тактовая частота для серии "STM32L15xx" может быть до 32 МГц. Для ее формирования используются 4 основных источника — HSI, HSE, PLL, MSI. Каждый из генераторов перед выбором должен быть включен и войти в стабильный рабочий режим. Включать/выключать их можно независимо друг от друга, для экономии потребления энергии неиспользуемые генераторы рекомендуется отключать. Включение и выключение основных генераторов производится через регистр RCC_CR — Clock Control register.

RCC_CR
Рисунок 5. Регистр RCC_CR

Установка/сброс бит HSION, MSION, HSEON, HSEBYP, PLLON активируют/деактивируют соотвествующий генератор. Эти биты можно изменять программно. А вот биты HSYRDY, MSIRDY, HSERDY, PLLRDY недоступны для записи, они устанавливаются аппаратно, когда соответствующий генератор стабилизируется. Эти биты готовности (READY) дают разрешение на использование соответствующего генератора в качестве источника для формирования SYSCLK. Еще две секции регистра RCC_CR:
CSSON — отвечает за включение защиты системы тактирования CSS — Clock Security System (эта система следит за сбоями тактовых сигналов, о ней ниже)
RTCPRE — в этой секции настраивается предделитель для часов RTC и модуля ЖКИ при тактировании их от источника HSE (до 1 МГц).
После включения генераторов, необходимо выбрать один из них в качестве источника для системной частоты SYSCLK. Выбор осуществляется через регистр RCC_CFGR — Clock Configuration Register.

RCC_CFGR
Рисунок 6. Регистр RCC_CFGR

Выбор основного источника тактовой частоты производится через биты SW [1:0] — System Clock Switch. Варианты тут такие:
00 — MSI
01 — HSI
10 — HSE
11 — PLL
Источник MSI может быть выбран принудительно (аппаратной установкой). Это происходит во время перехода в режимы Stop, Standby или инициируется защитной системой CSS — Clock Security System, если она включена.
Следующие разряды SWS [3:2] — System Clock Switch Status устанавливаются аппаратно, доступны только для чтения. Прочитав их, можно узнать о том, какой из источников тактирования назначен "главным" для формирования SYSCLK. Варианты используемых двоичных кодов тут те же, что и для разрядов SW [1:0].
Следующие секции регистра HPRE (AHB prescaler), PPRE1 (APB1 prescaler), PPRE2 (APB2 prescaler) — задают коэффициенты деления системной частоты SYSCLK, которая после предделителей поступает на матрицы шин (см. рисунок 1). Что это такое? Эти шины распределяют тактовый сигнал по всем внутренним модулям микроконтроллера. Системная тактовая частота на входе матрицы шин может делиться с помощью предделителя. Вот именно эти биты и задают коэффициенты деления для соответствующих матриц шин. А матриц шин всего три:
AHB (Advanced High Speed Busses) — матрица высокоскоростных шин. Она "доставляет" сигналы тактирования к ядру микроконтроллера, памяти (это как FLASH, так EEPROM и RAM) и модулю DMA (Direct Memory Access — модуль прямого доступа к памяти), системному таймеру. Также, в семействе STM32L на эту шину "посажены" и все порты ввода/вывода GPIO (в отличие от серии STM32F, где порты сидят на шине APB).
APB1, APB2 (Advanced Peripheral Bussess) — матрицы шин периферии. Соотвественно, к остальным периферийным модулям тактовая частота распределяется уже через эти шины.
Для всей периферии необходимо программно разрешить тактирование, иначе работать не будет! Даже порты ничего не будут выводить или читать. Такие вот "грабли" всех STM32. Делается это опять же через соответствующие регистры системы RCC — Reset and Clock Control. Посмотреть что чем управляет можно в соответствующих описаниях этих регистров в заголовочном файле stm32l1xx.h. Там есть такие секции:

**** Bit definition for RCC_AHBENR register ****/
#define RCC_AHBENR_GPIOAEN ((uint32_t)0x00000001) /*!< GPIO port A clock enable */
#define RCC_AHBENR_GPIOBEN ((uint32_t)0x00000002) /*!< GPIO port B clock enable */

или дальше

/**** Bit definition for RCC_APB1ENR register ****/
#define RCC_APB1ENR_TIM2EN ((uint32_t)0x00000001) /*!< Timer 2 clock enabled*/
#define RCC_APB1ENR_TIM3EN ((uint32_t)0x00000002) /*!< Timer 3 clock enable */

Не будем углубляться в эту тему, достаточно запомнить что подачу тактового сигнала на периферию необходимо разрешать для нормальной работы.
Давайте вернемся к рассматриваемому регистру RCC_CFGR. Следующий разряд PLLSRC [16] выбирает входной источник сигнала для PLL [0 — HSI, 1 — HSE).
В разрядах PLLMUL и PLLDIV, соответственно задаются коэффициенты умножения/деления системы PLL для формирования тактовых сигналов модуля USB (48 МГц) и системной частоты SYSCLK.
И, наконец, 2 старшие секции регистра MCOSEL, MCOPRE. В рассматриваемых микроконтроллерах на выход PA8 можно подать сигнал MCO — Microcontroller Clock Output, то есть один из тактовых сигналов
SYSCLK
HSI
MSI
HSE
PLL
LSI
LSE

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

Часы реального времени и ЖКИ

Как уже упоминалось, эти модули могут тактироваться от LSE, LSI или HSE. В последнем случае максимальная частота HSE не более 1 МГц и используется программируемый предделитель. Коэффициент деления задается битами RTCPRE регистра RCC_CR.

 RCC_CR
Рисунок 7. Регистр RCC_CR

Выбор входного источника сигнала осуществляется через разряды RTCSEL регистра RCC_CSR

RCC_CSR
Рисунок 8. Регистр RCC_CSR

00 — нет тактового сигнала
01 — LSE
10 — LSI
11 — HSE

А включение модуля RTC — через разряд RTCEN этого же регистра. Чтобы поменять источник тактирования для RTC или LCD модулей в процессе их работы, необходимо сделать сброс установкой бита RTCRST.
Если для часов реального времени — RTC используется низкочастотный генератор LSE или LSI, то в этом случае часы реального времени продолжат работу при переходе в энергосберегающие режимы Stop и Standby, и могут быть использованы для "пробуждения" микроконтроллера в определенное время или через заданный интервал. Точно так же и ЖКИ может работать в этих режимах, когда тактируется от LSE или LSI.

Сторожевой таймер.

Источником тактирования для независимого сторожевого таймера может быть только внутренний RC-генератор LSI с частотой 37 кГц. Если независимый сторожевой таймер включается аппаратно или программно, то автоматически принудительно запускается генератор LSI, и уже не может быть выключен. Как видно из рисунка 1, включение сторожевого таймера и принудительный запуск LSI в этом случае никак не влияют на часы реального времени и модуль ЖКИ, они могут получать тактовый сигнал и от другого источника — LSE или HSE.

Защитная система Clock Security System

Система защиты может быть активирована программно. При включенной защите контролируется наличие сигнала от внешнего высокочастотного генератора HSE. Если вдруг, в какой-то момент, тактовый сигнал с этого генератора пропадает (например, кварц неисправен или отвалился из-за плохой пайки, или же сигнал подавался от внешнего источника и с ним случился какой-то сбой), тогда система защиты деактивирует генератор HSE, а затем инициирует прерывание CSSI, чтобы сообщить о тревожном событии. Прерывание это немаскируемое, то есть реакцию вызовет всегда и незамедлительно для проведения "спасательных операций". А реакция будет следующей — система переключится на внутренний источник тактирования MSI. А в том случае, если сигнал тактирования HSE шел еще и через PLL, и вдруг "отвалился", то и PLL тоже будет отключена. Вызов прерывания осуществляется аппаратной установкой флага CSSF — Clock security system interrupt flag в регистре RCC_CIR — Clock interrupt register.

RCC_CIR
Рисунок 9. Регистр RCC_CIR

Пока этот флаг установлен, будет бесконечно долго вызываться соответствующее прерывание. "Сбросить" этот бит нужно программно, установкой другого бита CSSC — Clock security system interrupt clear в этом же регистре.
Что еще есть в этом регистре?

Регистр прерываний Clock Interrupt Register

В общем то, кроме разрядов установки/сброса флага немаскируемого прерывания системы защиты CSS, там находятся еще три секции.
В разрядах [13:8] — xxxRDIE (ready interrupt enable) разрешается или запрещается (соответственно установкой или сбросом бита) вызов прерывания, когда соответствующий тактовый генератор стабилизировался после запуска и готов к использованию. Биты разрешения прерываний доступны для программной установки пользователем.
Разряды [5:0] — xxxRDYF (ready interrupt flag). Эти флаги вызова прерываний устанавливаются только аппаратно, когда соответствующий генератор стабилизировался, и в том случае, когда прерывания разрешены в соответствующих битах xxxRDIE (разряды [13:8]).
Ну, а чтобы сбросить соответствующие флаги прерыаний xxxRDYF в разрядах [5:0] используются уже другие биты: [21:16] — xxxRDYC (ready interrupt clear). Запись "1" в эти разряды сбрасывает соответствующий флаг вызова прерывания.

Таймеры TIM9/TIM10/TIM11

Формирование независимых событий
Если в приложении задействован генератор LSE с кварцевым резонатором на 32,768 кГц, то это позволяет реализовать интересную функцию — создать полностью независимую систему для формирования событий. В данном случае используется подключение тактового сигнала LSE ко входам ETR таймеров TIM9/TIM10/TIM11.

LSE and Timers
Рисунок 10. Таймеры TIM9/TIM10/TIM11

Используя эту возможность, можно реализовать диспетчер задач, работающий независимо от системной тактовой частоты SYSCLK, а также от режима работы ядра микроконтроллера. При этом работа микроконтроллера может быть остановлена, или выполнение программы происходить на любой из скоростей. Такой вариант тактирования таймеров позволяет создать на их основе до трех независимых систем отсчета времени, с одним или двумя дополнительными каналами сравнения, и формировать на их основе события для диспетчера задач. К примеру, таймер TIM9 может вызвать прерывание при автоматической перезагрузке через 1 сек, и при этом еще одно дополнительное прерывание через 250 мсек после основного прерывания.
Однако, при таком режиме работы необходимо быть уверенным, что соотношение частот матриц шин APB и генератора LSE как минимум равно 2. Если же частота APB будет меньше, чем удвоенная частота LSE (2хLSE = 65,536 кГц), тогда частоту LSE необходимо поделить до нужной с помощью блока внешнего триггера-предделителя на входе таймера. Этот триггер-предделитель позволяет поделить максимум на 8 частоту сигнала, поступающего на вход ETR таймера.

Измерение частоты внешних/внутренних генераторов с помощью таймеров
Еще один интересный вариант использования таймеров TIM9/TIM10/TIM11 — это возможность измерения частот тактовых сигналов, как внутренних, так и внешних. Использование LSE с внешним кварцем (который имеет очень высокую стабильность формирования частоты — несколько десятков ppm) дает возможность довольно точно измерить, а затем подстроить частоты внутренних тактовых генераторов микроконтроллера при различных напряжениях питания и температурных режимах. При этом измеряемый сигнал подается на входы TI таймеров (см. рисунок 10). Каждый таймер на входе имеет мультиплексор для выбора сигнала, частота которого должна быть измерена. Измерение частоты производится подсчетом числа импульсов на входе TI таймера между следующими подряд фронтами сигнала от LSE. Для низких частот генератора MSI можно повысить точность измерений следующими методами:

  • Суммировать результат нескольких измерений
  • Использовать внешний предделитель таймера для сигнала LSE
  • Использовать в качестве опорного выходной сигнал часов RTC_OUT = 512 Гц. Конечно, в том случае, если RTC тактируются также от LSE с кварцем!

Для тех, кто предпочитает пользоваться стандартными библиотеками, в файле "хедера" stm32l1xx.h, в разделе Reset and Clock Control (RCC) директивами #define определены битовые маски для настройки режимов системы тактирования. Загрузить стандартные библиотеки Standard Peripheral Library можно с сайта STMicroelectronics или по следующей ссылке:

Стандартные библиотеки STM32L1xx

Другие статьи:

  5 Responses to “STM32L. Система формирования тактовых частот Reset and Clock Control (RCC)”

  1. хай еще раз.
    подскажите пилз, если я использую регистр сброса/установки порта след образом:
    GPIOC->BSRR = GPIO_BSRR_BR9;
    GPIOC->BSRR = GPIO_BSRR_BS9;
    GPIOC->BSRR = GPIO_BSRR_BR9;
    будет ли в режиме симулятора отображаться изменение соответствующего ODR9. т.е. это самое атомарное опосредованное воздействие на порт ? просто у меня BSRR переключается, а ODR9 не шевелится ((((

  2. Доброго времени суток!

    А можно где-нибудь посмотреть примеры использования функций тактирования в коде?

    Регистры то описаны понятно, но далеко не везде (даже в датащите не нашел) прописаны какие значения что означают

    Например, я хочу настроить внутренний тактовый генератор ядра на 48МГц с питанием 1.8В (Кстати, а варианты 3.3 и 5 вообще отсутствуют? Вроде где-то читал, что имеется внутренний регулятор напряжения). И хочу включить некий таймер с прерыванием 20 раз в секунду с последующим обнулением таймера и стартом счетчика с нуля. Ну, как пример. В какие регистры и что следует прописать? Это формируется на уровне библиотек, или можно прописать все при инициализации в int main ?

    Спасибо!

  3. Здравствуйте! Мне кажется что в статье вместо регистра RCC_CR приведено изображение регистра RCC_CIR.