Меню

Системный тактовый генератор микроконтроллера

Микроконтроллеры

Тактовая частота микроконтроллера это количество тактов в секунду которые выполняет микроконтроллер. Получается чем больше тактовая частота МК тем большее количество операций он может выполнить за 1 секунду.

К примеру тактовая частота в 8 МГц означает что МК за 1 секунду выполнить 8000000 различных операций таких как сложение, вычитание, запись данных в регистры и чтение данных т.д. Такая частота кажется довольно большой но как показывает практика это далеко не так, к примеру частота тактирования современных процессора компьютера составляет уже от 2 ГГц, а некоторые модели уже имеют частоту в 4 ГГц.

Существует 4 способа тактирование микроконтроллера:

  • использовать внутренний RC-генератор;
  • использовать внешний кварц;
  • использовать внешний генератор;
  • использовать RC-цепочку.

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

Тактирование микроконтроллера от внутреннего RC генератора

При этом способе нам не нужно подключать какие либо внешние детали. Тактирование осуществляется от RC генератора который находится внутри и который может работать на частотах 1,2,4,8 МГц. А если вам требуется какая нибудь другая частота, то этот способ не подходит. Так же этот способ не подойдет если вам нужны точные интервалы времени, дело в том что задающая частота RC генератора плавает в зависимости от температуры.

Тактирование микроконтроллера от внешнего кварцевого резонатора

Этот способ несколько сложнее, для того чтобы его подключить нам нужно знать расположение выводов микроконтроллера и их название, далее находим выводы «XTAL1» и «XTAL2».

Схема подключения кварцевого резонатора к микроконтроллеру

Емкость конденсаторов должана быть в интервале от 15 до 22 пФ, один вывод подсоединятеся к резонатору а другой к земле.

Тактирование микроконтроллера от RC-цепочки

В представленной схеме тактирования конденсатор берется емкостью не менее 22 пФ, а резистор от 10 Ом до 100 кОм. Внешний RC генератор так же как и внутренний имеет нестабильную частоту которая «плавает » в зависимости от температуры. Но если в проектах не нужна стабильная частота то можно использовать эти два способа.

Частота тактирования рассчитывает по формуле

R- номинал сопротивления в Ом;

C — емкость конденсатора в Фарадах.

По дефолту все МК AVR (за исключением страх AT90S2313 и AT90S8535 и другие) настроены так чтобы испольщовать внутренний тактовый генератор. Получается как только мы подаем на него напряжение то МК сразу начинает работать.

За выбор источника тактирования отвечает биты CKSEL

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

CKSEL3. 0=0000 — это внешний источник тактового синнала.

CKSEL3. 0=0100 — внутренний RC генератор 8 МГц.

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

  • CKSEL3. 0=0101 — частота менее 0.9 МГц;
  • CKSEL3. 0=0110 — от 0.9 МГц до 3 МГц;
  • CKSEL3. 0=0111 — от 3 МГц до 8 МГц;
  • CKSEL3. 0=1000 — от 8 МГц до 12 МГц.

Источник

Выбор правильного генератора для вашего микроконтроллера

Внутренний или внешний? Кварц или керамика? Кварцевый генератор или кремниевый генератор? Так много вариантов тактовой синхронизации. какой из них подойдет для вашего проекта?

Варианты генерирования тактового сигнала

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

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

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

Итак, давайте начнем со списка, а затем обсудим каждый вариант:

  • внутренний:
    • обычно (насколько я знаю, всегда) схема резистор-конденсатор;
    • петля фазовой автоподстройки частоты с дальнейшим умножением частоты;
  • внешний:
    • генератор на CMOS логике;
    • кварцевый резонатор;
    • керамический резонатор;
    • резистор-конденсатор;
    • только конденсатор.

Внутренние генераторы: принцип KIS

Я сторонник принципа KIS («Keep it simple», «не усложняй»), следовательно, я высоко ценю внутренние генераторы и призываю вас использовать внутренний генератор, когда это возможно. Внешние компоненты не требуются. Вы можете смело предположить, что частота соответствует выбранной, поскольку генератор был разработан теми же людьми, что всё остальное в микроконтроллере. Кроме того, основные технические характеристики – например, начальная точность, коэффициент заполнения (скважность), зависимость от температуры – (будем надеяться) указаны непосредственно в техническом описании.

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

По моему опыту, многие приложения могут терпеть недостатки внутреннего генератора, особенно когда частота была откалибрована на заводе. В старых микроконтроллерах частота внутреннего генератора может иметь допуск до ±20%. Однако более новое устройство может дать вам точность ±1,5% (или лучше), что достаточно точно для связи по RS-232 и даже (в сочетании со схемой восстановления тактового сигнала) для USB.

Другим способом расширения возможностей внутреннего генератора является ручная «подстройка» – если у вашего микроконтроллера есть регистр подстройки/калибровки, вы можете регулировать частоту, изменяя значение в этом регистре. Это очень практичный метод для небольших проектов: просто измерьте тактовую частоту с помощью осциллографа или частотомера, а затем, соответствующим образом, подстройте генератор.

Разновидностью внутреннего генератора является использование петли фазовой автоподстройки частоты (ФАПЧ, PLL). ФАПЧ позволяет низкокачественному высокочастотному внутреннему генератору извлекать выгоду из стабильности и точности внешнего генератора. В целом, ФАПЧ не помогает вам избежать внешних компонентов, поскольку для нее требуется эталонный тактовый сигнал, который обычно получают с помощью кварцевого резонатора. Тем не менее, если у вас где-то на плате есть высококачественный тактовый сигнал, но вы не хотите использовать его для микроконтроллера, потому что он слишком медленный, вы можете использовать PLL, чтобы умножить этот тактовый сигнал до приемлемой частоты.

Генератор на CMOS логике

Другой простой способ синхронизации – это так называемый «генератор CMOS логике», который подпадает под категорию «из-за отсутствия лучшего термина». «Генератор CMOS логике» – расплывчатый (хотя и удобный) способ обращения к любому тактовому сигналу, создаваемому каким-либо другим компонентом на плате. Генератор CMOS логике – это отличный вариант, если в вашем проекте уже есть генератор тактового сигнала с 1) подходящей частотой и 2) электрическими характеристиками, совместимыми с входной CMOS схемой тактового сигнала микроконтроллера. Однако часто это не так, поэтому давайте рассмотрим два варианта формирования тактовых импульсов на CMOS логике.

Читайте также:  Ремень генератора приора замена с эур

Во-первых, это «кварцевый генератор». Сейчас самое время указать, что кварцевый резонатор – это не генератор; скорее, это центральный компонент схемы кварцевого генератора, который может выглядеть примерно так:

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

Второй вариант – «кремниевый генератор». Этот термин относится к микросхемам генераторов, которые не основаны на кварцевых или керамических резонаторах. Эти устройства универсальны и просты в использовании, и они могут быть довольно точными. Например, для серии LTC6930 от Linear Tech требуется только один блокировочный конденсатор, а подавляющее большинство моделей таких микросхем обеспечивают точность номинальной частоты в пределах 0,05%:

Генератор тактового сигнала на микросхеме LTC6930-8.00 График распределения типового отклонения частоты

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

Кварцевые и керамические резонаторы

Если вам нужна действительно высокая точность и стабильность без дополнительных затрат на микросхему генератора на основе кварцевого резонатора, выбирайте вариант с одиночным кварцевым резонатором. На рынке широко доступны компоненты с допуском менее 20 миллионных долей (т.е. 0,002%). Схема генератора, показанная выше, частично интегрирована в микроконтроллеры, которые поддерживают конфигурацию с отдельным кварцем; вам нужно будет только обеспечить правильные нагрузочные конденсаторы. Общая емкость нагрузки (Cнагр.общ.) указывается в техническом описании на кварцевый резонатор, а нагрузочные конденсаторы выбираются следующим образом:

где Cпар. представляет любую паразитную емкость. Этот расчет на практике довольно прост: выберите разумное значение для Cпар. (скажем, 5 пФ), вычтите его из Cнагр.общ., и затем умножьте результат на два. Таким образом, если техническое описание указывает нагрузочную емкость 18 пФ, мы имеем

\[C_ <нагр.1>= C_ <нагр.2>= (18пФ — 5пФ) \cdot 2 = 26 пФ\]

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

Последний и наименее распространенный.

Существует не так много ситуаций, когда требуется генератор на внешних резисторе-конденсаторе или только на конденсаторе. Если по какой-то причине вам не подходят варианты внешних генераторов, рассмотренные выше, выбирайте микроконтроллер с внутренним генератором и используйте его. Однако, если вы полны решимости откопать один или два пассивных компонента из своей коробки запчастей, обратитесь к техническому описанию микроконтроллера за инструкциями по подключению и проектированию схемы генератора. Ниже показаны примеры подключения компонентов, взятые из технического описания на микроконтроллеры C8051F12x – 13x от Silicon Labs:

Варианты использования внешних резисторов и конденсаторов для создания схемы тактового генератора микроконтроллера

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

Заключение

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

  • используйте внутренний генератор, когда это возможно;
  • используйте кремниевый генератор, если его точность адекватна, а стоимость приемлема – в противном случае, используйте кварцевый резонатор.

Источник

Электроника для всех

Блог о электронике

ARM. Учебный курс. Тактовый генератор STM32

Нам разум дал стальные руки-крылья,
А вместо сердца — пламенный мотор.

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

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

Однако, это не так! Если внимательно посмотреть на ассемблеровский файл начальной низкоуровневой инициализации микроконтроллера (STM32F10x.s/startup_stm32f10x_hd.s или подобный, что присутствует в проекте), то можно увидеть, что перед вызовом функции main() нашей программы, идет вызов CMSIS’овской функции SystemInit():

Заголовок для Keil из поставки STM32

; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP

PUBWEAK Reset_Handler SECTION .text:CODE:REORDER(2) Reset_Handler LDR R0, =SystemInit BLX R0 LDR R0, =__iar_program_start BX R0

А вот в том файле инициализации, что создает Keil’овский визард проекта при создании нового проекта вызова SystemInit нет!

; Reset Handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__main BX R0 ENDP

И его надо вручную дернуть из main. В общем, смотри в оба что там да как 🙂 Я (Di Halt) же предпочитаю вообще выпилить CMSISовский System Init и накатать свой. А то очень уж там все заморочено и заверчено. Тем более есть с чего взять пример 😉

Наш пытливый ум, может посмотреть на исходники функции SystemInit и увидеть, что она в сообществе с дополнительными функциями вида SetSysClock / SetSysClockХХХ как раз и настраивает для нас генераторы тактовых частот. Если мы решили заниматься программированием микроконтроллеров всерьез, то нам не пристало полагаться на какие-то там готовые функции и оставаться в неведении относительно их поведения, поэтому в данной статье я и постараюсь сорвать покровы тайны со столь важной системы нашего микроконтроллера 🙂

Для лучшего усвоения информации приведу структурную схему системы формирования тактовых частот, из документации на микроконтроллер (раздел reset and clock control (RCC)).

Как можно увидеть из данной схемы, практически все блоки микроконтроллера затактовываются от линии SYSCLK, что расшифровывается как System Clock (в моем вольном переводе это будет звучать как системная тактовая частота). Исключение составляют блоки USB, RTC и IWDG. Т.к. системная тактовая частота очень важна, то разберемся сначала с ее генерацией.

Читайте также:  Генератор не возбуждается под нагрузкой

Как следует из документации и схемы, источниками для системной тактовой частоты могут служить 3 генератора:

На самом деле, IMHO, более правильно сказать, что источниками могут быть только HSI и HSE частота которых может умножаться а может и нет.
Разберемся с ними поподробнее.

Встроенный RC генератор (HSI)
Встроенный в микропроцессор генератор HSI вырабатывает тактовую частоту 8 МГц. Генератор автоматически запускается при появлении питания Vcc и при выходе в нормальный режим работы выставляет флаг HSIRDY в регистре RCC_CR. Первоначально процессорное ядро запускается на тактовой частоте HSI.
К преимуществам относится быстрое время начала генерации тактовой частоты после подачи питания и отсутствие необходимости в использовании дополнительных электронных компонентов для работы микроконтроллера.

Недостаток – низкая стабильность частоты генерируемого сигнала, а при умножении на PLL погрешность тоже умножается. Например, частота HSI при разных температурных условиях плавает от 7.3 до 8.7МГц. При множителе в 9 на выходе будет разброс уже от 65.7 до 78.3 МГЦ.

Производитель гарантирует стабильность частоты в 1% при температуре ядра 25C, для чего в процессе производства в регистр RCC_CR записываются биты HSICAL[7:0], отвечающие за его калибровку. Если этого недостаточно или необходимо откалибровать микроконтроллер для работы при другой температуре, то можно воспользоваться битами HSITRIM[4:0] этого же регистра. После ресета там находится число 16, т.е. середина диапазона регулировки.
Изменение одного младшего бита дает подстройку приблизительно в 40кГц. Тактовая частота с генератора HSI может подаваться на прямую как источник системной частоты, либо поступать в блок умножителя частоты предварительно деленная на 2.

Генератор HSI может быть включен/выключен управлением бита HSION регистра RCC_CR.

Внешний генератор (HSE)
В качестве внешнего генератора могут выступать:

  • Внешний тактовый сигнал не превышающий 25МГц, поданный на ножку OSC_IN в то время, как нога OSC_OUT находится в высокоимпендансном состоянии.
  • Внешний кварцевый резонатор подключенный на ножки OSC_IN и OSC_OUT. Внешний кварцевый резонатор должен быть в диапазоне от 4 до 16МГц и при его использовании достигается очень высокая стабильность частоты работы генератора.

Внешний генератор HSE по умолчанию выключен и его включение/выключение управляется битом HSEON регистра RCC_CR. После включения HSE и его выхода в рабочий режим устанавливается бит HSERDY кроме этого, может быть сгенерировано прерывание. Также как и сигнал с генератора HSI, сигнал HSE может быть подан напрямую в качестве системного тактового сигнала либо поступать в блок умножения. Но в отличие от HSI в блок умножения он может поступать напрямую, либо пройдя через делитель на 2.

PLL
Внутренний умножитель частоты может умножать вошедший тактовый сигнал с одного из трех источников, на выбор

на множитель от 2-х до 16-ти. По умолчанию умножитель выключен и его включение/выключение управляется битом PLLON регистра RCC_CR. После включения PLL и его выхода в рабочий режим устанавливается бит PLLRDY кроме этого, может быть сгенерировано прерывание.

Работа умножителя конфигурируется через регистр RCC_CFGR.

Все манипуляции над его режимами работы должны проводиться только при выключенном PLL!

  • Бит PLLSRC задает источник умножения, либо HSI либо HSE.
  • Бит PLLXTPRE задает будет ли сигнал с HSE предварительно делиться на 2 или нет.
  • Биты PLLMUL[3:0] задают коэффициент умножения от 2-х до 16-ти.

С источниками системной тактовой частоты вроде разобрались. Теперь, прежде чем пройти дальше, куда там эта частота подается, отойдем немного в сторону и посмотрим, что у нас есть еще… 🙂

А есть у нас во первых блок USB. Особенностью его является то, что работать он может только на частоте 48МГц! Если частота будет отличной от 48МГц, то другие устройства на шине USB нас не поймут а мы их. Из схемы видно две вещи:

  1. Тактовые сигналы на блок USB идут с PLL.
  2. Перед блоком USB Стоит делитель с управляемым коэффициентом деления 1 или 1.5.

Из этого следует, что если нам нужна работа USB, то обязательно должен работать PLL и его выходная тактовая частота должна быть либо 48 (при делителе USB = 1) либо 72 (при делителе USB = 1.5) МГц! И все! Больше никаких вариантов.

Во вторых, есть у нас еще RTC (Real Time Clock – часы реального времени). Что такое часы реального времени, думаю знают все. Они могут работать, от батарейного питания, при выключенном микроконтроллере. Источником тактовой частоты для них могут являться:

  1. Тактовые сигналы генератора HSE деленные на 128.
  2. Тактовые сигналы генератора LSI (Low Speed Internal – внутренний низкоскоростной), который генерирует 40кГц.
  3. Тактовые сигналы генератора LSE (Low Speed External – внешний низкоскоростной), для его работы нужен внешний «часовой» кварц на 32.768кГц.

Ну и в третьих, есть еще IWDG (Independent Watchdog – независимая сторожевая собака 🙂 Что это такое в данной статье вдаваться не будем). IWDG тактуется сугубо от LSI описанном чуть выше.

Ну вроде все, теперь можно перейти и к остальным блокам, которые тактуются от системной частоты SYSCLK.

Так же на схеме подписаны максимальные допустимые частоты для блоков. Все делители имеющие управляемые коэффициенты могут быть настроены, что в целом позволяет довольно гибко варьировать частоты отдельных блоков в различных пределах.
Кроме того, на схеме это не показано, очень важно знать и помнить 2 вещи:

  1. Какие блоки на какой шине сидят. Например, порты ввода вывода сидят на шине APB2, контроллеры шины I2C сидят на шине APB1, контроллера прямого доступа к памяти на шине AHB а, например, таймеры, частью сидят на APB2 а частью на APB1.
  2. Каждый блок имеет свой вход тактовых сигналов и бит управления этим входом. И по умолчанию практически все блоки отключены от тактовых сигналов. Di Halt на эти грабли уже наступал. И мы тоже, в программе моргания светодиодом разрешали вход тактовых сигналов на блок GPIOA т.е. порт А.

Т.е., если нужна работа какого-то блока: GPIO, DMA, ADC, DAC, таймеров и т.д., то не забываем подавать на них тактовые сигналы, т.е. устанавливать соответствующие биты! Иначе работать ничего не будет!

Зачем же нужно такое разнообразие делителей, умножителей, источников синхронизации и т.д? А нужно это все для гибкой и точной настройки микроконтроллера под задачу, которую ему предстоит решать в том или ином проекте. Если не нужны какие-то блоки, то просто отключаем их от источников синхронизации, нечего им энергию потреблять вхолостую (что по умолчанию и сделано). Если не требуется в проекте высокая производительность, то можно сконфигурировать микроконтроллер на работу на частоте, например, 48, 36, 24 и т.д. МГц, что опять же понизит его энергопотребление и т.д.

Алгоритм ручной настройки частоты

  • Определяемся с чего будем работать (HSI или HSE) и с какой частотой.
  • Если HSE, то выбираем внешний кварц. Гнаться за частотой не надо — чем медленней кварц, тем надежней он работает т.к. менее требователен к качеству разведения платы. Оптимально 8…12МГц. Но тут надо учитывать, что мы должны «попасть» в частоту USB (опять же если USB нужна, если нет то пофигу)
  • Затем определяем каким путем пойдет тактовый сигнал через все эти мультиплексоры/делители/множители попутно вычисляем нужные величины делителей.
  • Начинаем разглядывать битики в RCC регистрах, определяясь что нам и каким образом нужно выставить
  • Выставляем!
Читайте также:  Возможные неисправности сварочного генератора

Но не все так просто. По крайней мере в STM32. Тут мало взять и навтыкать конфигураций, а вдруг мы переключились на кварц, а его нету? Или на дорожки попала влага и он не завелся? Или банально забыли включить? Есть система защиты, по правилам которой мы можем переключиться на другой источник тактирования только в том случае, когда точно знаем, что с ним все в порядке. Сделано это на флагах. Т.е. , например, включили мы PLL и ждем пока появится флаг готовности PLL и только тогда переключаемся. Иначе все повиснет нафиг.

  1. Автоматически отключается HSE.
  2. Посылается событие на останов работы расширенных таймеров TIM1 и TIM8.
  3. Генерируется прерывание CSSI, которое внутри процессора заведено на немаскируемое прерывание NMI, т.е. пропустить его невозможно.
  4. Если в качестве источника системной частоты использовался HSE напрямую либо через PLL, то источник системной частоты автоматом переключается на HSI.
  5. Если PLL был активен и входом ему служил сигнал с HSE, то PLL отключается.

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

Ну и для того, чтобы эта прелесть заработала ее надо включить программно через установку бита CSSON регистра RCC_CR. По умолчанию он сброшен.

Код
Теперь, собственно, вернемся к коду настройки генераторов.
Вот как это сделано в CMSIS для STM32:

Сразу оговоримся, что это справедливо только для простой линейки STM32 для Connectivity Line все чуток по другому. Но очень похоже.

__IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* Конфигурацяи SYSCLK, HCLK, PCLK2 и PCLK1 */ /* Включаем HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Ждем пока HSE не выставит бит готовности либо не выйдет таймаут*/ do < HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; > while( (HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut)); if ( (RCC->CR & RCC_CR_HSERDY) != RESET) < HSEStatus = (uint32_t)0x01; >else < HSEStatus = (uint32_t)0x00; >/* Если HSE запустился нормально */ if ( HSEStatus == (uint32_t)0x01) < /* Включаем буфер предвыборки FLASH */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* Конфигурируем Flash на 2 цикла ожидания */ /* Это нужно потому, что Flash не может работать на высокой частоте */ FLASH->ACR &= (uint32_t)((uint32_t)

FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; /* Конфигурируем множитель PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ /* При условии, что кварц на 8МГц! */ /* RCC_CFGR_PLLMULL9 — множитель на 9. Если нужна другая частота, не 72МГц */ /* то выбираем другой множитель. */ RCC->CFGR &= (uint32_t)((uint32_t)

(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); /* Включаем PLL */ RCC->CR |= RCC_CR_PLLON; /* Ожидаем, пока PLL выставит бит готовности */ while((RCC->CR & RCC_CR_PLLRDY) == 0) < // Ждем >/* Выбираем PLL как источник системной частоты */ RCC->CFGR &= (uint32_t)((uint32_t)

(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Ожидаем, пока PLL выберется как источник системной частоты */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) < // Ждем >> else < /* Все плохо. HSE не завелся. Чего-то с кварцем или еще что. Надо бы както обработать эту ошибку. Если мы здесь, то мы работаем от HSI! */ >

В CMSIS@STM32 в файле system_stm32f10x.c есть штука вида:

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) /* #define SYSCLK_FREQ_HSE HSE_Value */ #define SYSCLK_FREQ_24MHz 24000000 #else /* #define SYSCLK_FREQ_HSE HSE_Value */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz 36000000 */ /* #define SYSCLK_FREQ_48MHz 48000000 */ /* #define SYSCLK_FREQ_56MHz 56000000 */ #define SYSCLK_FREQ_72MHz 72000000 #endif

Как видишь, тут уже готовые макросы для разных частот. Остается только раскомментировать нужную строку.
Надо заметить, что CMSIS для STM32 имеет все макроопределения заточенны под кварц на 8МГц. Под другой кварц уже не покатит — придется пересчитывать заново все делители.

Пример
Скреативим программку, которая будет моргать диодиком и на ходу менять значения умножителя PLL каждые десять миганий. Также там будет активирована защита от сбоев тактового генератора. Сбить с копыт кварцевый генератор несложно, достаточно наслюнявить палец и коснуться обоих выводов кварца 🙂 Ну или, например, припаять проводочки к нему и коротнуть его выводы на резистор в 100ом.

Ну вот, собственно и все, о чем мы хотели рассказать в данной статье. Если что-то упустили, или будут вопросы – пишите в комменты!

З.Ы.
На последок, хотел еще чуть чуть затронуть такую тему как «разгон» или работа на повышенных частотах. Была у меня одна задача, когда надо было получать и обрабатывать данные по одной достаточно высокоскоростной параллельной шине (порядка 40МГц). Так вот «родной» частоты в 72МГц не хватало для нормальной работы, что и не удивительно. И тогда я решил разогнать немного микроконтроллер. В общем, мой опыт показал, что частоту в 144МГц (т.е. в 2 раза. больше стандартной) они переваривают легко. Проверял на 3-х имеющихся в наличии контроллерах STM32F103RB, STM32F103RE и STM32F103VE. Все 3 работают стабильно, не греются. Частоту в 160МГц, уже не переваривают… Зависают через 10-15 секунд работы, но при этом также не греются. Для сравнения, имеющийся в наличии NXP LPC1768 с «родной» частотой 100МГц на 120 уже не завелся вообще.

Я никого ни к чему не призываю, это просто хинт, может быть кому-то когда-то будет полезен, как и мне в свое время… Ну и в даташите черным по белому написано НЕ ПРЕВЫШАЙТЕ максимально допустимых производителем частот работы блоков. Все, что выше — на ваш страх и риск, без гарантий и т.д. и т.п… Ну да на заборе тоже вон чего написано, а на самом деле там дрова 😀

Основной автор статьи — Владимир aka RtxOnAir
Редактирование и всякие дополнения уточнения — DI HALT

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

Источник

Adblock
detector