2017-02-03 3 views
0

Я пытаюсь настроить часы SAMD21 так быстро, насколько это возможно. Поэтому я использую встроенный генератор 8 МГц для подачи генератора генераторов тактовых импульсов 1 (с предварительным делителем 8) для генерирования генераторных часов для подачи цифровой фазовой автоподстройки частоты, которая, в свою очередь, питает генератор тактовых генераторов 0 (мои основные часы), которые должен цитировать процессор, но микро работает очень медленно, где я сделал ошибку? Я следил за этим руководством http://borkedlabs.com/2014/08/21/asf-samd21-dpll-for-internal-clock-from-internal-8mhz/, но он не работает. Вот мой код:Конфигурация часов SAMD21

void system_clock_init(void) 
{ 
    SYSCTRL->INTFLAG.reg = SYSCTRL_INTFLAG_BOD33RDY | SYSCTRL_INTFLAG_BOD33DET | SYSCTRL_INTFLAG_DFLLRDY; 

    /* switch off all peripheral clocks to save power */ 
    //_switch_peripheral_gclk(); 

    /* configure and enable generic clock generator 1 (GENCTRL and GENDIV registers of GCLK module) */ 
    struct system_gclk_gen_config gclk_gen_config1; 
    system_gclk_gen_get_config_defaults(&gclk_gen_config1); 
    gclk_gen_config1.source_clock = SYSTEM_CLOCK_SOURCE_OSC8M; 
    gclk_gen_config1.division_factor = 8; 
    gclk_gen_config1.output_enable = false; 
    system_gclk_gen_set_config(GCLK_GENERATOR_1,&gclk_gen_config1); 
    system_gclk_gen_enable(GCLK_GENERATOR_1); 

    /* configure and enable generic clock for DPLL (CLKCTRL of GCLK module) */ 
    struct system_gclk_chan_config gclk_chan_config; 
    system_gclk_chan_get_config_defaults(&gclk_chan_config); 
    gclk_chan_config.source_generator = GCLK_GENERATOR_1; 
    system_gclk_chan_set_config(SYSCTRL_GCLK_ID_FDPLL,&gclk_chan_config); 
    system_gclk_chan_enable(SYSCTRL_GCLK_ID_FDPLL); 

    /* configure and enable clock source: DPLL (SYSCTRL registers) */ 
    struct system_clock_source_dpll_config dpll_config; 
    system_clock_source_dpll_get_config_defaults(&dpll_config); 
    dpll_config.reference_clock = SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_GCLK; 
    dpll_config.reference_divider = 1; 
    dpll_config.reference_frequency = 1000000; 
    dpll_config.output_frequency = 30000000; 
    system_clock_source_dpll_set_config(&dpll_config); 
    system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DPLL); 

    /* set NVM wait states */ 
    system_flash_set_waitstates(2); 

    /* configure and enable generic clock 0 (GCLK_MAIN) */ 
    struct system_gclk_gen_config gclk_gen_config0; 
    system_gclk_gen_get_config_defaults(&gclk_gen_config0); 
    gclk_gen_config0.source_clock = SYSTEM_CLOCK_SOURCE_DPLL; 
    gclk_gen_config0.division_factor = 1; 
    system_gclk_gen_set_config(GCLK_GENERATOR_0,&gclk_gen_config0); 
    system_gclk_gen_enable(GCLK_GENERATOR_0); 
} 

Я обновил заголовок conf_clocks.h, чтобы отразить изменения (я не знаю, если эти макросы ссылаются где-то еще, так на всякий случай), и я изменил функцию system_clock_init(), что это вызывается из system_init().

ответ

0

Я никогда не был поклонником использования ASF Atmel, так как вы никогда не делаете то, что хотите. Я предлагаю вам больше взглянуть на лист данных, так как это стоило меньше времени для завершения вашей задачи, а затем скрывается в ASF. В листе данных Atmel даже есть глава «Инициализация», которая представляет собой пошаговое объяснение того, что делать.

Включение OSC8 в основном 5 строк кода:

/* Various bits in the INTFLAG register can be set to one at startup. 
This will ensure that these bits are cleared */ 
SYSCTRL->INTFLAG.reg = SYSCTRL_INTFLAG_BOD33RDY | SYSCTRL_INTFLAG_BOD33DET | SYSCTRL_INTFLAG_DFLLRDY; 

/* OSC8M Internal 8MHz Oscillator */ 
SYSCTRL->OSC8M.bit.PRESC = SYSTEM_OSC8M_DIV_1; 
SYSCTRL->OSC8M.bit.ONDEMAND = CONF_CLOCK_OSC8M_ON_DEMAND; 
SYSCTRL->OSC8M.bit.RUNSTDBY = CONF_CLOCK_OSC8M_RUN_IN_STANDBY; 

/* Enable OSC8M */ 
SYSCTRL->OSC8M.reg |= SYSCTRL_OSC8M_ENABLE; 

Остальные шаги являются только для настройки регистра DPLL, используя уже распознанного OSC8M, который также является всего лишь несколько кодов строк. (Запись в регистр GCLK.GENDIV/GENCTRL и CLKCTRL, а также запись в регистр SYSCTRL.DPLL.

Смежные вопросы