2017-02-03 7 views
0

SAMD21のクロックを可能な限り速く設定しようとしています。だから私は一般的なクロックジェネレータ0(私のメインクロック)を供給するデジタル位相ロックループを供給するための汎用クロックを生成するために、汎用クロックジェネレータ1(プリスケーラ8) CPUをクロックする必要がありますが、マイクロは非常にゆっくりと実行されていますが、どこでミスをしましたか? このガイドhttp://borkedlabs.com/2014/08/21/asf-samd21-dpll-for-internal-clock-from-internal-8mhz/に従っていますが、動作しません。ここに私のコードです:私は(これらのマクロは、これだけの場合には、どこかで参照されている場合、私は知らない)の変更を反映するためにconf_clocks.hヘッダーを更新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); 
} 

と私はだsystem_clock_init()関数を変更system_init()から呼び出されます。

答えて

0

AtmelのASFを使用するファンは決してありませんでした。あなたが本当に必要なことを行うことは決してありません。 データシートをもっと見てみると、このコストはあなたの仕事を終わらせる時間が少なく、ASFで潜んでいるからです。 Atmelのデータシートには、「初期化」の章もあり、これは何をすべきかについてのステップバイステップの説明です。

/* 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; 

残りのステップのみだけ少ないコード行で既に有効OSC8Mを用いてDPLLレジスタを設定するためである。OSC8を有効

は、基本的に5つのコードのラインです。 (GCLK.GENDIV/GENCTRLレジスタとCLKCTRLレジスタへの書き込みとSYSCTRL.DPLLレジスタへの書き込み

関連する問題