- Лоботрясы

Поиск
Перейти к контенту

Главное меню:

Статьи по STM32

Читать в Яндекс.Подписках



    STM32. Система тактирования STM32F03x и STM32F05x 
Просмотров: 10505
     Помните, как легко и просто было вдыхать жизнь в микроконтроллеры AVR (если не помните или не знаете - проскакивайте дальше!) - поставил кварц на 8 или 16 МГц, и вперёд! А вот уже с вопросами подбора частоты работы сталкивались только при настройке таймеров, АЦП и чего-то там ещё. В STM32 всё гораздо веселее! Обилие различных блоков, модулей и периферии требует настройки частоты тактирования каждого из них, и связано это не с тем, чтобы разработчик задолбался, а с целью понижения общего энергопотребления микроконтроллера и гибкой настройки нужного модуля под собственные нужды. И если предыдущий, рассмотренный мной пример работы не требовал особых знаний о системе тактирования микроконтроллеров STM32, то это не значит, что сюда вообще не нужно лезть. Ещё как нужно! Ибо даже простое знание всех этих нюансов позволяет лучше понять работу микроконтроллера и перестать считать его неким "чёрным ящиком", помимо сугубо практической выгоды при применении данного набора всяких страшных битов и регистров в своих проектах!
     Ну что ж, тогда разбираемся в "сердечных" делах нашего STM32F050F4P6 (STM32F031F4P6).
     Появление системной тактовой частоты (SYSCLK), необходимой для тактирования всех узлов и модулей микроконтроллера (с учётом, естественно, различных делителей частоты), может обеспечиваться такими источниками тактового сигнала:
HSI (High-speed internal clock) – внутренний высокочастотный 8 МГц RC-генератор
HSE (High-speed external clock) – внешний высокочастотный генератор
PLL clock  – система ФАПЧ (фазовая автоподстройка частоты или phase-locked loop)
     Также имеются дополнительные (вторичные) источники тактовой частоты: 
LSI - низкочастотный внутренний RC-генератор на 40 кГц, который тактирует независимый watchdog-таймер и дополнительно RTC, который используется для выхода (Auto-wakeup) из режимов стоп/ ожидание
LSE - внешний кварц на 32,768 КГц, который дополнительно тактирует часы реального времени (RTCCLK)
HSI14 - высокочастотный внутренний RC-генератор на 14 МГц, предназначенный для АЦП.
 
     С целью повышения энергосбережения каждый источник тактовых импульсов включается и выключается отдельно (независимо). 
     Максимальная частота шин AHB (Advanced Hardware Bus - аппаратная шина для обмена данными) и APB (Advanced Peripheral Bus - шина доступа к периферии), также как и системной частоты SYSCLK, составляет 48 МГц.    
     Для обеспечения конфигурации и работы системы тактирования в микроконтроллерах типов STM32F0x1/STM32F0x2/STM32F0x8, основанных на ядре Cortex-M0, существуют такие регистры:
- Clock control register (RCC_CR– регистр управления тактированием (запуск тактовых генераторов, флаги их состояния и биты калибровки HSI-генератора)
Clock control register2 (RCC_CR2– 2-й регистр управления тактированием (запуск тактовых генераторов, флаги их состояния и биты калибровки HSI14-генератора)
Clock configuration register (RCC_CFGR– регистр конфигурации тактового сигнала (выбор источника тактовой частоты микроконтроллера, шин AHB и APB и коэффициентов умножения и деления)
Clock configuration register2 (RCC_CFGR2– 2-й регистр конфигурации тактового сигнала (выбор коэффициента деления тактовой частоты HSE-генератора при поступлении её на вход PLL)
Clock configuration register3 (RCC_CFGR3– 3-й регистр конфигурации тактового сигнала (выбор источника тактирования USART1, USART2, I2C1, CEC, USB)
Clock interrupt register (RCC_CIR) – регистр прерываний (запрет/установка прерываний при стабилизации генераторов и флаги состояний)
APB peripheral reset register2 (RCC_APB2RSTR) – 2-й регистр сброса периферии APB (TIM1, TIM15, TIM16, TIM17, ADC, USART1, SPI1)
APB peripheral reset register 1 (RCC_APB1RSTR) – регистр сброса периферии APB (TIM2, TIM3, TIM6, TIM7, TIM14, SPI2, USART2, USART3, USART4, I2C1, I2C2, USB, CAN, PWR, CRS, DAC, CEC)
AHB peripheral clock enable register (RCC_AHBENR) – регистр включения тактирования периферии AHB (DMA, SRAM, FLITF, CRC, I/O port A, I/O port B, I/O port C, I/O port D, I/O port E, I/O port F)
APB peripheral clock enable register 2 (RCC_APB2ENR) – 2-й регистр включения тактирования периферии APB (ADC, TIM1, SPI1, USART1, TIM15, TIM16, TIM17)
APB peripheral clock enable register 1 (RCC_APB1ENR) – регистр включения тактирования периферии APB (TIM2, TIM3, TIM6, TIM7, TIM14, WWDG, SPI2, USART2, USART3, USART4, I2C1, I2C2, USB, CAN, PWR, CRS, DAC, CEC)
RTC domain control register (RCC_BDCR) – регистр управления и контроля RTC (часами реального времени)
Control/status register (RCC_CSR– регистр контроля/статуса (запуск и контроль LSI, разные флаги сброса)
AHB peripheral reset register (RCC_AHBRSTR– регистр сброса периферии AHB (I/O port A, I/O port B, I/O port C, I/O port D, I/O port E, I/O port F)
 
     Вот такой вот небольшой перечень регистров. Подробно рассматривать каждый регистр, детально обсасывая каждый его бит я не буду, т.к. об этом лучше всего вам расскажет справочное руководство, а превращать свою статью в результаты XVII съезда ЦК КПСС нет никакого желания. Да и в принципе, детальное знание всей этой информации вам по большей части на первых порах и не особо-то нужно, о чём увидите далее… 
     А вот обязательно приведу систему тактирования микроконтроллеров STM32F03x и STM32F05x (соответствующую изучаемому мной STM32F031F4P6), взятую из справочного руководства, из которой можно понять, как происходит формирование тактовых сигналов для обеспечения работы как ядра микроконтроллера так и отдельных узлов его периферии (ну и для разнообразия, синим цветом добавил названия некоторых основных битов, отвечающих за настройку тактирования):
     А теперь информация об особенностях работы и настройки источников тактовых сигналов поподробнее...
     HSE-генератор. Высокочастотный тактовый сигнал (HSE) может быть получен с кварцевого или керамического резонатора (подключённого к выводам OSC_IN и OSC_OUT) или же с отдельного источника синхронизации (при этом сигнал должен поступать только на вывод OSC_IN).
     Частота внешнего кварцевого/керамического резонатора должна находиться в диапазоне 4…32 МГц.
     Существует специальный флаг HSERDY (в регистре RCC_CR), состояние которого характеризует стабильность работы HSE-генератора. После пуска и перехода HSE-генератора в рабочий режим происходит установка этого флага (бита). Также возможно вызвать в этом случае процедуру прерывания, если она разрешена в регистре RCC_CIR. А для того, чтобы включить или выключить сам HSE-генератор существует бит HSEON в регистре RCC_CR
     Также есть очень важный регистр - RCC_CFGR (Clock configuration register – регистр конфигурации тактового сигнала), который позволяет выбрать тип источника тактовой частоты и коэффициент её умножения или деления (Очччень много всяких битов настроек, при желании можно ознакомиться самостоятельно, почитав 115 страницу мануала, но подумайте – оно вам так сильно надо?! Потерпите ещё чуть-чуть – дальше будет видно, что вполне можно обойтись и без знания этой туевой кучи регистров :-) 
     И вы таки думали, что я буду в самом деле расписывать каждый бит всех 14-ти регистров системы тактирования?! Да ну, бросьте! Это только основные нюансы, которые я не могу обойти стороной и не упомянуть!
     Внешний генератор (HSE bypass)
     В этом режиме МК может тактироваться от внешнего источника тактового сигнала, который может иметь частоту до 32 МГц. Для выбора этого режима необходимо установить биты HSEBYP и HSEON регистра RCC_CR. Внешний тактовый сигнал может представлять собой как меандр, так и синусоиду и треугольник и иметь скважность 40-60%. Т.к. сигнал от внешнего генератора поступает на один вывод OSC_IN, то оставшийся свободным вывод OSC_OUT можно использовать в качестве вывода GPIO.
 
     HSI-генератор. HSIэто встроенный RC-генератор на 8 МГц, который может быть использован как напрямую в качестве источника системной тактовой частоты, так и в качестве тактового сигнала PLL (ФАПЧ). Данный генератор запускается сразу же после подачи питания на микроконтроллер, однако, как и все RC-генераторы, обладает очень маленькой точностью (даже с учётом заводской калибровки – точность 1% при 25 °C).
     При переходе HSI в установившийся режим работы устанавливается флаг (бит) HSIRDY в регистре RCC_CR. Включение HSI-генератора выполняется установкой бита HSION в регистре RCC_CR.
     В случае сбоя HSE-генератора сигнал HSI может быть использован в качестве резервного.
     Система аварийного тактирования (по крайней мере, я так перевёл Clock Security System) может активироваться программно и включается при запуске HSE (и выключается при его остановке). В случае выявления сбоя HSE устанавливается флаг CSSF (в регистре RCC_CR) и генерируется прерывание, сообщающее микроконтроллеру о необходимости начинать спасательную операцию :-) Данное прерывание будет выполняться до тех пор, пока не будет сброшен флаг прерывания CSSC в в регистре RCC_CR (ручками, естественно!).     
     PLL (ФАПЧ). А теперь небольшое лирическое отступление. До того, как начал изучать требуху STM32, даже невзирая на давнее увлечение электроникой, знать не знал что такое фазовая автоподстройка частоты (ФАПЧ) и на… оно нужно. Слыхом то слыхивал, а вот познакомиться поближе случай не представлялся. А так как я не люблю чёрных ящиков и страшные магические слова, несущие какой-то потаённый ритуальный смысл, было решено бороться с этим научно-техническим подходом. Если уже от вышесказанного поймали себя на попытке войти в ступор, то быстро перебегите до следующего абзаца, и сохраните здравый рассудок и внутримозговое давление! 
     Так вот, что такое это ФАПЧ, и что оно даёт. ФАПЧ имеет несколько применений, но раз речь о нём пошла применительно к микроконтроллерам, то и назовём именно нас и интересующие – это генерация постоянной частоты, синхронизированной с опорной частотой и (а вот это главное!) синтез частот, отличных от опорной.
     В простейшем случае в состав блока ФАПЧ входят такие блоки: фазовый детектор (он же – фазовый компаратор), фильтр низких частот (ФНЧ) и генератор управляемый напряжением (ГУН).
     Допустим, на один вход фазового детектора поступает опорный сигнал с задающего генератора (генератор на кварце, например), а на другой вход – выходной сигнал с ГУНа. Фазовый детектор сравнивает частоты и фазы этих сигналов и выдаёт на выходе напряжение, пропорциональное их разности. Если опорный сигнал и сигнал с ГУНа совпадают по частоте и фазе (или синхронизированы), то напряжение на выходе фазового детектора будет равно нулю, при этом частота, генерируемая ГУН будет равна частоте опорного сигнала. Если же выходная частота ГУНа будет отклоняться от опорной, то на выходе фазового детектора появится сигнал (напряжение), воздействующий на ГУН, который, в свою очередь, будет на выходе менять частоту, пока она не совпадет с опорной, а после этого будет происходить синхронизация по фазе (система «запомнит» некоторое значение сдвига по фазе, относительно которого и будет поддерживать частоту на выходе ГУНа постоянной).
     Если вы осилили этот набор страшных слов технической направленности, то у вас мог возникнуть резонный вопрос - а причём тут, вообще, системная тактовая частота микроконтроллера?
     А вот притом, что если в вышеприведённую схему поставить делитель, и задавать коэффициент деления, например, 2, 3, 16 и т.д., то и частота на выходе ГУНа будет во столько раз больше частоты опорного сигнала. Вот каким образом, имея кварц на 8 МГц мы можем заставить системную тактовую частоту микроконтроллера летать на частоте, например, 168 МГц (вспомнился STM32F407 на плате DISCOVERY)!
     Так что упрощённо, PLL – это умножитель тактовой частоты (на задаваемый коэффициент умножения).
     Если ещё не утомил - двигаемся дальше.

     Внутренний PLL может быть использован для умножения частоты сигналов HSI или HSE.
     ВАЖНО: Настройки PLL (выбор входного тактового сигнала, предделителя и коэффициента умножения) должны происходить только при отключенном PLL (бит PLLON регистра RCC_CR), при этом выходная частота PLL должна находиться в диапазоне 16…48 МГц. Выбор коэффициента умножения осуществляется посредством регистра RCC_CFGR (см. самый первый рисунок).
     Для изменения конфигурации PLL выполняется такой план действий:
1. Отключение PLL установкой бита PLLON в «0»
2. Ожидание сброса бита PLLRDY, что свидетельствует о полной остановке PLL
3. Изменение нужного параметра.
4. Включение PLL установкой PLLON в «1»
5. Ожидание установки бита PLLRDY в «1»
     Также, при желании, можно вызвать прерывание при готовности блока PLL (для этого опять-таки нужно залезть в справочное руководство и детально изучить содержимое регистра RCC_CIR :-)

     LSE-генератор. Данный генератор работает с подключённым к его выводам (OSC32_IN и OSC32_OUT) кварцем на 32,768 Гц и предназначен для обеспечения высокой точности тактирования модуля часов реального времени (RTC). Активация данного генератора осуществляется битом LSEON (регистр RCC_BDCR), а настройка содержимого парочки битов под общим названием LSEDRVпозволяет получить наилучший компромисс между надежным и малым временем запуска с одной стороны и низким энергопотреблением с другой. О стабилизации работы генератора свидетельствует установка флага LSERDY (регистр RCC_BDCR). 
     Внешний генератор (LSE bypass)
Также как и HSE-генератор, LSE-генератор можно тактировать от внешнего источника с частотой до 1 МГц. Для выбора данного режима необходимо установить биты LSEBYP и LSEON в регистре RCC_BDCR. Внешний тактовый сигнал (меандр, синус или треугольник) со скважностью 50% подаётся только на вывод OSC32_IN, а вывод OSC32_OUT можно использовать в качестве GPIO. 
 
     LSI-генератор. Это маломощный низкочастотный RC-генератор, который может обеспечивать работу независимого сторожевого таймера IWDG и RTC. Частота данного генератора около 40 кГц (в диапазоне 30…60 кГц). Для включения данного генератора необходимо установить в «1» бит LSION регистра RCC_CSR.
  
     HSI14-генератор (тактирование АЦП). Данный RC-генератор является одним из двух способов тактирования блока АЦП (ADC) (второй  способ – через тактовую частоту PCLK, делённую на 2 или 4, но это – уже совсем другая история…).

     Вот вроде бы и вся основная теоретическая информация о генераторах в микроконтроллерах STM32F03x и STM32F05x, а вот где она прописана в самом коде программы и как её изменить (настроить) – вот это уже представляет для нас практический интерес!
     В процессе создания программы, среди библиотек вашего проекта обязательно будет присутствовать такой файл - system_stm32f0xx_temp.c. Практически в самом начале этого файла можно найти такую картинку (ниже), представляющую собой информацию о конфигурации системы тактирования микроконтроллера, установленную по умолчанию.
     Вообще, данный файл содержит три функции: SystemInit(), SystemCoreClockUpdate() и SetSysClock(), первая из которых предназначена для сброса всех настроек тактирования и вызывает в себе третью функцию SetSysClock(), которая, в свою очередь, выполняет инициализацию системы тактирования (SYSCLK), режимов PLL и предделителей шин AHB и APB. Вторая функция позволяет пользователю обновить (установить другое значение) переменной SystemCoreClock (характеризует тактовую частоту ядра микроконтроллера - HCLK), что актуально при необходимости установки системного таймера (SysTick timer) или настройки других параметров. Для правильной работы этой функции также будет необходимо открыть файл stm32f0xx.h и изменить значение константы HSE_VALUE (по умолчанию она настроена на 8 МГц). Данная константа выглядит следующим образом:
#define HSE_VALUE     ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
     Хотя для работы вам достаточно только знать функцию SystemInit(), запуск которой в основной программе (после main(void)) обеспечивает инициализацию системы тактирования и делителей шин AHB и APB
     Но согласитесь – находить и менять самостоятельно все необходимые константы (частоты генераторов, шин и периферии, коэффициенты деления и т.д.) вкупе с необходимым знанием диапазонов изменения всех этих параметров, мягко говоря, не айс.
     Поэтому самым разумным решением является применение для своих микроконтроллерных нужд утилиты Clock configuration tool, которую можно скачать на сайте ST для микроконтроллеров следующих семейств: STM32F0xx, STM32F2xx, STM32F30x31xSTM32F37x38x, STM32F40x41x и STM32L1xx. Данная интересная программка (сделанная в Excel) позволяет вручную выбрать источник получения системной частоты SYSCLK а также подобрать все необходимые коэффициенты предделителей и умножителей (PLL), а в результате получить готовый файл system_stm32f0xx.c, которым смело можно заменить идентичный файл со старыми параметрами в папке cmsis_boot вашего проекта. Только не забудьте на всякий пожарный самостоятельно (ручками, то есть) заменить значение HSE_VALUE (см. выше!).
     Внешний вид сей программы:
     Работа с программой достаточна проста, только для начала нужно активировать свойство “макрос” в Excel (в программе всё подробно указано, что да как). Далее выбираете режим Wizard или Expert (этот естественно продвинутый!), и после манипуляций с настройками жмёте на кнопку Generate и получаете заветный файл system_stm32f0xx.c. Только в проекте (папка cmsis_boot) этот файл почему-то идёт как system_stm32f0xx_temp.c, так что измените имя полученного файла с новыми настройками на такое же! 
     В случае, если ваши вводимые параметры приводят к тому, что результат выходит за допустимые пределы – программа поставит вас в этом случае в известность (ругнётся английскими нехорошими словами), а при желании сбросить все введённые данные, просто нажмите кнопочку Reset. А вот если появится окошечко с такой надписью:
пугаться и обращать внимание на неё не стоит – просто небольшой баг программы. В общем – экспериментируйте!

Опубликовано 17.12.2014
© Igoryosha, 2014
 
 
Назад к содержимому | Назад к главному меню