Тактирование Микроконтроллеров Atmel Samd20/21



Немного теории

Тактирование микроконтроллеров Atmel SAMD20/21

Согласно документации на микроконтроллеры Atmel серии SAMD20/21 система тактирования состоит из следующих блоков:

  • блок источника сигнала (управляется SYSCTRL)
    • Источником синхронизации являются базовые часы в системе.

      Это может быть, например, внутренний генератор 8 МГц (OSC8M), внешний генератор (XOSC), цифровая система фазовой автоподстройки частоты (DFLL48M);

  • базовый тактовый контроллер (GLCK-generic clock Controller), который управляет системой распределения тактовых импульсов и состоит из:
    • Генераторы базовой частоты (Generic Clock Generator) — это программируемый прескалер, к которому можно подключить любой источник сигнала.

      С выхода генератора 0 (GCLKGEN[0], GCLK_MAIN) сигнал поступает на Power Manager, который формирует основной тактовый сигнал;

    • Базовые тактовые сигналы (Generic Clocks) — обычно это сигналы, синхронизирующие периферийные устройства.

      Базовые тактовые сигналы с помощью базовых мультиплексоров сигналов могут использовать любые тактовые сигналы, доступные в системе.

      Разные периферийные устройства могут использовать разные тактовые сигналы.

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

      Обратите внимание, что в таком случае выходной сигнал DFLL не должен использоваться в качестве опорного сигнала для генератора, выход которого используется в качестве опорного сигнала для мультиплексора 0.

  • блок управления питанием (PM – Power Manager)
    • Блок управления питанием управляет синхронизацией системы.

      Сюда входят ЦП, шины (APB, AHB) и синхронная (с точки зрения ЦП) периферия.

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

Периферийное устройство может синхронизироваться одновременно двумя тактовыми сигналами:
  • синхронно от Power Manager (обеспечивает работу периферии с ЦП по шине APB/AHB);
  • асинхронный от GCLK (обеспечивает работу «ядра» периферии).

Синхронизация между этими двумя тактовыми сигналами реализована аппаратно.

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

Все регистры ядра требуют синхронизации при записи, а некоторые — при чтении.

Процесс синхронизации обозначается битом SYNCBUSY в регистре состояния или прерыванием.

Таким образом, теоретически для настройки тактовых сигналов необходимо:

  1. Выберите базовый источник (или несколько) опорного тактового сигнала: это может быть внешний генератор, внутренний и т. д. (блок SYSCTRL)
  2. Настройте прескалер и мультиплексор для каждого из основных сигналов (блок GCLK).

  3. Выберите основной тактовый сигнал (выход генератора 0).

  4. Настройте периферийные часы (общие часы).

Для корректной работы с тактовыми сигналами нужно смотреть электрические характеристики в конце даташита, там много интересного.

В частности:

  • Опорный тактовый сигнал для DFLL может быть:
    • минимальное значение: 0,732 кГц
    • типичное значение: 32,768 кГц
    • максимальное значение: 35,1 кГц
  • Выходной сигнал DFLL: от 47 до 49 МГц
  • Внешний генератор должен быть: не более 32 МГц.



Как работает код А.

С.

Ф.

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

С.

Ф.

.

Рассмотрим только то, что касается тактирования.

При создании проекта в Atmel Studio создается файл main.c , который уже содержит system_init() .

Прототип этой функции находится в файле src/asf/sam0/system/system.c :

   

/** * \brief Initialize system. * * This function will call the various initialization functions within the * system namespace. If a given optional system module is not available, the * associated call will effectively be a NOP (No Operation).

* * Currently the following initialization functions are supported: * - System clock initialization (via the SYSTEM CLOCK sub-module) * - Board hardware initialization (via the Board module) * - Event system driver initialization (via the EVSYS module) * - External Interrupt driver initialization (via the EXTINT module) */ void system_init(void) {

Теги: #Atmel #samd20 #samd21 #cortex #cortex-m0 #cortex-m0 #atmel Arm #DFLL48M #Программирование микроконтроллеров
Вместе с данным постом часто просматривают: