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

Согласно документации (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 – внешний низкочастотный кварцевый генератор

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 МГц:

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). В один момент времени можно “вывести” только один сигнал:

Стоит обратить внимание на ограничение максимальных частот в зависимости от режима работы (напряжения питания ядра):

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


К сожалению в заголовочном файле 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


Повышаем частоту до 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
Руками аттрибут добавлять не нужно.
Сейчас у посетителей с разрешением монитора начиная от 1600 пикселей в ширину картинка отлично вписывается в монитор.
Стоило бы написать небольшой скрипт, который бы устанавливал max-width для img в соответствии с размером окна в браузере.
Сейчас у посетителей с разрешением монитора начиная от 1600 пикселей в ширину картинка отлично вписывается в монитор.
Стоило бы написать небольшой скрипт, который бы устанавливал max-width для img в соответствии с размером окна в браузере.
- build_your_web
- 09 декабря 2011, 12:19
- ↑
- ↓
да, посмотрел на широкоформатном экране… все влазит. наверное, я уже из последних могикан, которые «квадрат» пользуют…
считать моник с 1280 пикслеями в ширину устаревшим — ну, знаете ли… я даже в 1024 всегда стараюсь укладываться. И да, у меня 1280х1024, картинки не влазиют.
- ALPINE63rus
- 09 декабря 2011, 14:06
- ↑
- ↓
А с какой максимальной частотой в итоге можно тактитровать таймеры? И какая на этих таймерах частота ШИМ получится? Я так понимаю в данном случае 32МГц — это максимум что может придти на таймер? Получается что 32МГц/(2^16) будет ~488 Гц. Этого как-то мало.
Так в том и вопрос, в принципе, сколько максимум?
И нельзя ли как-то от PLL-ки напрямую затактировать какой-нибудь таймер? Хотя из схемы видать что нельзя.
И нельзя ли как-то от PLL-ки напрямую затактировать какой-нибудь таймер? Хотя из схемы видать что нельзя.
У меня плата Stm32VLDiscovery и на ней стоит внешний резонатор 8Mhz. Правильно ли я понял, что можно запустить контроллер на 24 МГц, если установить множитель PLLMUL=6 и делитель PLLDIV=2?
Вообще сможете. Но учитывайте, что на плате STM32_VL_Discovery установлен контроллер из мэйнстримового семейства STM32F100, а не контроллер из lowpower семейства STM32L15x (об этом семействе и идет речь в этой статье). Системы тактирования разнятся, но умножитель и делитель тактовой частоты присутствуют и там, и там.
Да, есть такое. Пока руки не доходят :( В ближайшее время постараюсь устранить.
ziblog.ru/2016/02/01/oshibka-v-rabote.html
ziblog.ru/2016/02/01/oshibka-v-rabote.html
Доброго всем дня!
А подскажите пожалуйста, кто знает, возможно ли изменение частоты тактирования в процессе работы контроллера.
Использую MSI источник. Необходимо переключаться между 1МГц и 65кГц.
А подскажите пожалуйста, кто знает, возможно ли изменение частоты тактирования в процессе работы контроллера.
Использую MSI источник. Необходимо переключаться между 1МГц и 65кГц.
возможно ли изменение частоты тактирования в процессе работы контроллера.Конечно возможно: нужно перевести ядро на тактирование от какого-то другого источника, настроить MSI по-новой и потом перейти на него.
Понял.
Нашел в HAL либах следующую возможность изменения частоты
Проверил — частота меняется.
Чем ее плохо использовать?
Нашел в HAL либах следующую возможность изменения частоты
__HAL_RCC_MSI_RANGE_CONFIG(RCC_MSIRANGE_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__) ))
Комментарии (27)
RSS свернуть / развернуть