Тактирование Xmega и настройка внешнего генератора

Posted by Reason89 | Posted in , ,


    По сравнению с семьей Atmega, в микроконтроллерах Xmega задание частоты тактирования задается не Fuse битами, а программно. На первый взгляд это выглядит немного сложнее, но имеет в целом большое преимущество, так как вы в процессе работы можете изменять частоту тактирования, нет нужды делать отдельную аппаратную  установку и больше не заблокируете контроллер, когда установите Fuse биты не правильно. К тому же появилось такое нововведение, как в случае отсутствия внешнего сигнала тактирования. микроконтроллер по прерыванию перейдет на внутренний генератор с частотой в 2 МГц.
    Появилась возможность использовать внутренние генератор на 32 кГц, 2 МГц или 32MHz, подключать сторожевой таймер и для получения широкого спектра частот ииспользовать блок фазовой подстройки частоты PLL с множителем x1-x31. Кроме того, микроконтроллер может также работать с  внешним кварцем от 0,4МГц  до 16 МГц.
    После выбора тактовой частоты, она может делиться коэффициентом 2, 4, 8, ..., и в итоге быть уменьшена в 2048 раз. Внутренний генератор может быть откалиброван для более высокой точности в процессе работы.
    Но лучше опустить все то, что можно и так найти в документации и показать настройку на примере.
    Начнем с самого простого, настройка работы от внешнего кварца в 4МГц
    
    // 2-9 МГц  без режима сбережения и со стабильной частотой во время запуска   
    OSC.XOSCCTRL = 0x4B;
    // Разрешение работы внешнего генератора                 
    OSC.CTRL = 0x08;
    // Ожидание сигнала о включении внешнего генератора
    while((OSC.STATUS & 0x08) == 0);
    CCP = CCP_IOREG_gc;
    CLK.CTRL = CLK_SCLKSEL_XOSC_gc;  

    Программа настройки основной частоты синхронизации на 3-х кратную частоту внешнего генератора. При частоте генератора 12-16 МГц имеем частоту в 36-48 МГц.
   
   // выбор внешнего генератора с временем запуска 16 тыс. CLK и частотой 12-16 МГц
   OSC.XOSCCTRL = 0xCB;
   // разрешение работы внешнего генератора                
   OSC.CTRL = 0x08;
   // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора                   
   while((OSC.STATUS & 0x08) == 0 ) ;
   // настройка блока PLL на синхронизацию от внешнего источника и 3-х кратоное умножение
   OSC.PLLCTRL = 0xC3;
   // разрешение работы блока PLL                   
   OSC.CTRL = OSC.CTRL | 0x10;
   // ожидание появления в регистре статуса бита включения блока PLL        
   while((OSC.STATUS & 0x10) == 0 ) ;
   // включение защиты от изменения регистров ввода-вывода на время изменения синхронизации
   CCP = 0xD8;
   // настройка системной синхронизации от блока PLL                        
   CLK.CTRL = 0x04;
   // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
   OSC.CTRL = OSC.CTRL & 0xFE;       

    Как вариант можете прочесть перевод документации AVR1003
    Сам источник и архив к нему
    Он предлагает использовать библиотеку clksys_driver.h для настройки XMEGA
    Ну и соответственно не большой пример:
#include "clksys_driver.h"
... 
void init_clock( void )
{
 //Настройка источников таковых импульсов
 CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_XTAL_16KCLK_gc);
 // Включаем источник синхронизации
 CLKSYS_Enable( OSC_XOSCEN_bm );
 // Настраиваем PLL для синхронизации
 CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 2 ); 
 // Включаем ЗДД
 CLKSYS_Enable( OSC_PLLEN_bm );
 // Настраиваем делитель частоты
 CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
 // Ждем включения 
 do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
 // Выбираем новый источник для синхронизации
 CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
 // Выключаем внутренний генератор
 CLKSYS_Disable( OSC_XOSCEN_bm );
} 



Comments (0)

Отправить комментарий