STM32L– Система тактирования (обзор)

Сегодня по плану обзор системы тактирования (модуль Reset and clock control (RCC)).
Согласно документации (Reference manual RM0038) в качестве источника тактовых сигналов (SYSCLK – системные тактовые сигналы) могут выступать четыре источника:
  • HSI oscillator clock – внутренний высокочастотный RC генератор
  • HSE oscillator clock – внешний высокочастотный генератор
  • PLL clock – ситема ФАПЧ
  • MSI (multispeed internal) oscillator clock – внутренний RC генератор с возможностью выбора частоты генерации
Так же имеются два вторичных источника тактовых сигналов:
  • LSI RC – внутренний низкочастотный RC-генератор (37 кГц)
  • LSE crystal – внешний низкочастотный кварцевый генератор
Функциональная схема: image
HSE oscillator clock – внешний высокочастотный генератор Источником сигналов для HSE генератора может быть как внешний тактовый генератор, так и обычный кварцевый или керамический резонатор. Для установленного на плате STM32L-Discovery микроконтроллера частота внешнего сигнала не должна превышать 32МГц, в случае если вы используете внешний тактовый генератор, а при  использовании кварцевого (керамического) резонатора его частота должна быть от 1 до 24 МГц. Внешний сигнал может иметь форму пилы, синусоиды или прямоугольных импульсов со скважностью 50%.
HSI oscillator clock – внутренний высокочастотный RC генератор HSI генератор представляет собой RC-генератор с частотой 16 МГц, он тактирует модуль АЦП, может быть источником тактовых сигналов (SYSCLK),  а так же может служить источником опорных сигналов для ФАПЧ. Данный генератор проходит калибровку на заводе и производитель гарантирует точность в 1% при температуре 25 градусов Цельсия. Калибровочное значение запрограммированное на заводе автоматически загружается в регистр ICSCR после сброса микроконтроллера (данный регистр доступен только для чтения). Дополнительно существует возможность самостоятельной подстройки генератора (регистр HSITRIM). Данный генератор может так же использоваться как авариный, в случае отказа HSE генератора (более подробно в разделе — Clock security system (CSS)).
PLL clock – ситема ФАПЧ Система ФАПЧ (фазовая автоподстройка частоты) грубо говоря производит умножение опорного сигнала (частота входного сигнала должна лежать в пределах от 2 до 24 МГц) с заданным коэффициентом, однако частота на выходе системы ФАПЧ недолжна превышать 32 МГц (если используется для системного тактового сигнала SYSCLK). К сожалению, использование модуля USB, несколько ограничивает использование системы ФАПЧ в качестве источника системных тактовых сигналов, так как источником требуемой тактовой частоты USB модуля равной 48 МГц является выход ФАПЧ (до делителя) и в этом случае SYSCLK может принимать значения 12, 16 и 24 МГц: image
MSI (multispeed internal) oscillator clock – внутренний RC генератор с возможностью выбора частоты генерации MSI генератор представляет собой RC-генератор с фиксированным набором частот: 65,536 кГц; 131,072 кГц; 262,144 кГц; 524,288 кГц; 1,048 МГц; 2,097 МГц; 4,194 МГц. Данный генератор автоматически используется в качестве источника тактовых сигналов после сброса и пробуждения из режимов пониженного энергопотребления (Stop, Standby). После сброса и выходе из режима Standby частота генератора принимает значение по умолчанию (2,097 МГц). Генератор проходит калибровку на заводе и производитель гарантирует точность в 1% при температуре 25 градусов Цельсия. Калибровочное значение запрограммированное на заводе автоматически загружается в регистр ICSCR после сброса микроконтроллера (данный регистр доступен только для чтения). Дополнительно существует возможность самостоятельной подстройки генератора (регистр MSITRIM).
LSI RC – внутренний низкочастотный RC-генератор LSI генератор представляет собой RC-генератор с частотой 37 кГц, используется для тактирования независимого сторожевого таймера (IWDG), модуля часов реального времени (RTC) и модуля ЖКИ индикатора.
LSE crystal – внешний низкочастотный кварцевый генератор Источником сигналов для LSE генератора может быть как внешний тактовый генератор (с частотой до 1 МГц), так и низкочастотный кварцевый или керамический резонатор (32,768 кГц). Внешний сигнал может иметь форму пилы, синусоиды или прямоугольных импульсов со скважностью 50%. Генератор может использоваться для тактирования таймеров общего назначения (номера 9, 10 и 11),  модуля часов реального времени (RTC) и модуля ЖКИ индикатора.
MCO – выход тактовой частоты Для контроля частот основных источников тактового сигнала и (или) синхронизации внешних устройств предусмотрен выход MCO (Microcontroller clock output). В один момент времени можно “вывести” только один сигнал:

image
Стоит обратить внимание на ограничение максимальных частот в зависимости от режима работы (напряжения питания ядра): image
Пример 1 Как мы уже знаем после сброса в качестве системной тактовой частоты используется внутренний MSI генератор, с частотой по умолчанию 2,097 МГц. Воспользуемся выходом MCO для контроля частоты. Объявим вывод:
#define PIN_MCO		A, 8, HIGH, MODE_AF_PUSH_PULL, SPEED_40MHZ, AF0


Настроим его:

PIN_CONFIGURATION(PIN_MCO);


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

image

image

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



enum rcc_cfgr_mco_select
{
	RCC_CFGR_MCOSEL_DISABLED = 0,
	RCC_CFGR_MCOSEL_SYSCLK = RCC_CFGR_MCOSEL_0,
	RCC_CFGR_MCOSEL_HSI = RCC_CFGR_MCOSEL_1,
	RCC_CFGR_MCOSEL_MSI = RCC_CFGR_MCOSEL_1 | RCC_CFGR_MCOSEL_0,
	RCC_CFGR_MCOSEL_HSE = RCC_CFGR_MCOSEL_2,
	RCC_CFGR_MCOSEL_PLL = RCC_CFGR_MCOSEL_2 | RCC_CFGR_MCOSEL_0,
	RCC_CFGR_MCOSEL_LSI = RCC_CFGR_MCOSEL_2 | RCC_CFGR_MCOSEL_1,
	RCC_CFGR_MCOSEL_LSE = RCC_CFGR_MCOSEL_2 | RCC_CFGR_MCOSEL_1 | RCC_CFGR_MCOSEL_0
};


И выберем в качестве источника MSI генератор:

RCC->CFGR &= ~RCC_CFGR_MCOSEL;
RCC->CFGR |= RCC_CFGR_MCOSEL_MSI;


После компиляции и прошивки, на выводе PA8 получил частоту 2,102 МГц.

Попробуем изменить частоту MSI генератора.

Выбор частоты производится установкой соответствующих битов в регистре RCC_ICSCR

image

image

Повышаем частоту до 4,194 Мгц:

RCC->ICSCR &= ~RCC_ICSCR_MSIRANGE;
RCC->ICSCR |= RCC_ICSCR_MSIRANGE_6;


Компилируем, прошиваем и получаем 4,206 МГц.

Внимание! Так как сейчас после сброса мы “сразу” изменяем частоту генератора MSI, а он по умолчанию используется для системной тактовой частоты, то выбор диапазона 0 или 1 приведет к невозможности программирования мк. Если вы все таки попали в данное положение, то для восстановления работоспособности достаточно вывод Boot0 подключить к Vcc и выполнить сброс мк.




Пример 2

После сброса выключены все генераторы кроме MSI.

Попробуем включить HSI генератор.

Общая процедура такова:

  • разрешить работу генератора (установка соотв. битов)
  • дождаться стабилизации работы (ожидание установки соотв. битов)
  • использовать по задумке

Разрешаем работу генератора HSI, установкой бита HSION в регистре RCC_CR:

RCC->CR |= RCC_CR_HSION;


Ожидаем окончания стабилизации работы (ожидание установки бита HSIRDY):

while(!(RCC->CR & RCC_CR_HSIRDY))
{
}


Выводим сигнал на вывод MCO:

RCC->CFGR &= ~RCC_CFGR_MCOSEL;
RCC->CFGR |= RCC_CFGR_MCOSEL_HSI;


После компиляции и прошивки, на выводе PA8 получил частоту 15,91 МГц.




На этом обзорная часть заканчивается.

Ещё раз обращаю внимание, что после сброса в качестве системной тактовой частоты используется внутренний MSI генератор (2,097 МГц).




Исходный код

Примеры базируются на проекте приведенном ранее:

2011-08-15-STM32L-GPIO — [74.52 kB] [ Версия 2011-08-15 ]

с исправлениями в макросах для работы с линиями ввода-вывода:

http://ziblog.ru/2011/12/07/stm32l-linii-vvoda-vyivoda-chast-2/
  • +4
  • 09 декабря 2011, 11:16
  • ZiB

Комментарии (27)

RSS свернуть / развернуть
у меня одного картинки обрезаны справа ??..
Может добавите в тег
<img width="450">
например?
0
У меня все нормально.
0
Руками аттрибут добавлять не нужно.
Сейчас у посетителей с разрешением монитора начиная от 1600 пикселей в ширину картинка отлично вписывается в монитор.

Стоило бы написать небольшой скрипт, который бы устанавливал max-width для img в соответствии с размером окна в браузере.
0
да, посмотрел на широкоформатном экране… все влазит. наверное, я уже из последних могикан, которые «квадрат» пользуют…
0
считать моник с 1280 пикслеями в ширину устаревшим — ну, знаете ли… я даже в 1024 всегда стараюсь укладываться. И да, у меня 1280х1024, картинки не влазиют.
0
у меня тоже 1280. Правда не квадрат, а один из первых ноутных широкоформатников… Если что-то не влазит — жму Ctrl + колесико мыши на себя (как штурвал истребителя ;) и все помещается… ;)
0
Да просто те кто делает применяет движки )) в своих сайтах должны пока еще задумываться о разрешении не то что 1280 а 1024 как у айпад например и соответствующе подбивать правилами CSS вывод на экран.
0
А статья хорошая. Тактирование и прерывания самые неудобоваримые элементы в армах, по сравнению с аврами. По крайней мере для меня:)
0
  • avatar
  • PRC
  • 09 декабря 2011, 12:18
Хорошая статья. Плюсанул…
0
А с какой максимальной частотой в итоге можно тактитровать таймеры? И какая на этих таймерах частота ШИМ получится? Я так понимаю в данном случае 32МГц — это максимум что может придти на таймер? Получается что 32МГц/(2^16) будет ~488 Гц. Этого как-то мало.
0
если нужна бОльшая частота, то можно и камень без буквы L использовать. Основная задача серии — именно пониженное энергопотребление…
0
А что мешает уменьшить разрядность шима либо использовать восьмибитный таймер?
0
Так в том и вопрос, в принципе, сколько максимум?
И нельзя ли как-то от PLL-ки напрямую затактировать какой-нибудь таймер? Хотя из схемы видать что нельзя.
0
если без USB то 32 МГц, если с USB — то 24 МГц. Таймера такируются только от системной шины, по другому никак. Так что надо смотреть возможность использования таймера в 8-ми битном режиме или ставить STM32F103 на 72 МГц.
0
При 72 МГц получается частота шим ~280 кГц, ага ок.
От AVR не большая разница…
0
гм… у AVR на 16-ти битном таймере вроде такую частоту не получить… ;)
0
Зато получить при 8-ми битном таймере и наличии PLL… :)
0
У меня плата Stm32VLDiscovery и на ней стоит внешний резонатор 8Mhz. Правильно ли я понял, что можно запустить контроллер на 24 МГц, если установить множитель PLLMUL=6 и делитель PLLDIV=2?
0
Вообще сможете. Но учитывайте, что на плате STM32_VL_Discovery установлен контроллер из мэйнстримового семейства STM32F100, а не контроллер из lowpower семейства STM32L15x (об этом семействе и идет речь в этой статье). Системы тактирования разнятся, но умножитель и делитель тактовой частоты присутствуют и там, и там.
0
Статья хорошая, да только картинки не отображаются(
0
Да, есть такое. Пока руки не доходят :( В ближайшее время постараюсь устранить.
ziblog.ru/2016/02/01/oshibka-v-rabote.html
0
Картинки так и не заработали.
0
Да, получилось не всё как хотелось :(
Пришлось переносить блог на другую платформу, точнее в «статику».
Большая часть ссылок похерилась :( Часть восстановил, а часть так и потерялась.
0
Доброго всем дня!
А подскажите пожалуйста, кто знает, возможно ли изменение частоты тактирования в процессе работы контроллера.
Использую MSI источник. Необходимо переключаться между 1МГц и 65кГц.
0
  • avatar
  • Zov
  • 06 октября 2016, 14:13
возможно ли изменение частоты тактирования в процессе работы контроллера.
Конечно возможно: нужно перевести ядро на тактирование от какого-то другого источника, настроить MSI по-новой и потом перейти на него.
0
Понял.
Нашел в HAL либах следующую возможность изменения частоты
__HAL_RCC_MSI_RANGE_CONFIG(RCC_MSIRANGE_0);

Проверил — частота меняется.
Чем ее плохо использовать?
0
/**
  * @brief  Macro to configures the Internal Multi Speed oscillator (MSI) clock range.
  * @note     After restart from Reset or wakeup from STANDBY, the MSI clock is 
  *           around 2.097 MHz. The MSI clock does not change after wake-up from
  *           STOP mode.
  * @note    The MSI clock range can be modified on the fly.
  * @param  RCC_MSIRange: specifies the MSI Clock range.
  *   This parameter must be one of the following values:
  *     @arg RCC_MSIRANGE_0: MSI clock is around 65.536 KHz
  *     @arg RCC_MSIRANGE_1: MSI clock is around 131.072 KHz
  *     @arg RCC_MSIRANGE_2: MSI clock is around 262.144 KHz
  *     @arg RCC_MSIRANGE_3: MSI clock is around 524.288 KHz
  *     @arg RCC_MSIRANGE_4: MSI clock is around 1.048 MHz
  *     @arg RCC_MSIRANGE_5: MSI clock is around 2.097 MHz (default after Reset or wake-up from STANDBY)
  *     @arg RCC_MSIRANGE_6: MSI clock is around 4.194 MHz
  */
#define __HAL_RCC_MSI_RANGE_CONFIG(__RCC_MSIRange__) (MODIFY_REG(RCC->ICSCR,\
        RCC_ICSCR_MSIRANGE, (uint32_t)(__RCC_MSIRange__) ))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.