Я пытаюсь настроить часы 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().