2017-11-02 4 views
1

SAM L21 Xplained Pro Bの超低電力クロックOSCULP32KでカウントモードでRTCを設定しようとしていますが、ASFを使用しています。それをテストするために、私はクイックスタートのRTCカウントポーリングの例に従っていました。この例では、RTCカウントを一定の期間と比較することによって2000mごとにLED0をトグルします。Atmel SAM L21 Xplained Pro ULPOSC32KでRTCを設定する - 周波数エラー

この例では、RTC_CLOCK_SOURCEはRTC_CLOCK_SELECTION_ULP1Kを使用しています。 RTC_CLOCK_SELECTION_ULP32Kに変更すると、LEDは2000ミリ秒ごとに1回ではなく、2000回ごとに24回トグルします。

は私がconf_rtc.hで次の構成を有する:

# define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP32K 

その後、conf_clocks.hに私は4MHzの時、メインCPUのクロックを設定しました。

/* SYSTEM_CLOCK_SOURCE_OSC16M configuration - Internal 16MHz oscillator */ 
# define CONF_CLOCK_OSC16M_FREQ_SEL    SYSTEM_OSC16M_4M 
# define CONF_CLOCK_OSC16M_ON_DEMAND    true 
# define CONF_CLOCK_OSC16M_RUN_IN_STANDBY  false 

/* Configure GCLK generator 0 (Main Clock) */ 
# define CONF_CLOCK_GCLK_0_ENABLE    true 
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY  false 
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE   SYSTEM_CLOCK_SOURCE_OSC16M 
# define CONF_CLOCK_GCLK_0_PRESCALER    1 
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE   false 

、次のようにmain.cの中で、私は設定して、RTCを初期化:

それが初期化されます
/* RTC configuration*/ 
void configure_rtc_count(void); 
struct rtc_module rtc_instance; 

// [initiate rtc] 
void configure_rtc_count(void) 
{ 
    //! [set_conf] 
    struct rtc_count_config config_rtc_count; 
    //! [set_conf] 

    //! [get_default] 
    rtc_count_get_config_defaults(&config_rtc_count); 
    //! [get_default] 

    //! [set_config] 
    config_rtc_count.prescaler   = RTC_COUNT_PRESCALER_DIV_1; 
    config_rtc_count.mode    = RTC_COUNT_MODE_16BIT; 
    #ifdef FEATURE_RTC_CONTINUOUSLY_UPDATED 
    config_rtc_count.continuously_update = true; 
    #endif 
    config_rtc_count.compare_values[0] = 1000; 
    //! [set_config] 
    //! [init_rtc] 
    rtc_count_init(&rtc_instance, RTC, &config_rtc_count); 
    //! [init_rtc] 

    //! [enable] 
    rtc_count_enable(&rtc_instance); 
    //! [enable] 
} 
// [initiate rtc] 
/* End RTC configuration*/ 

一つ、メイン(無効)でコードが読み取ります

int main (void) 
{ 
    system_init(); 
    configure_rtc_count(); 

    /*test RTC - toggle LED0 each 2000 ms*/ 
    rtc_count_set_period(&rtc_instance, 2000); 

    for (;;) 
    { 
     /*test RTC - if count match, toggle LED0 each 2000 ms*/ 
     if (rtc_count_is_compare_match(&rtc_instance, RTC_COUNT_COMPARE_0)) 
     { 
      /* Do something on RTC count match here */ 
      port_pin_toggle_output_level(LED_0_PIN); 

      rtc_count_clear_compare_match(&rtc_instance, RTC_COUNT_COMPARE_0); 
     } 
     /*end test RTC*/ 
    } 
} 

私はconfig_rtc_count.compare_values [0] = 1000の意味は何かの説明を見つけることができません。私はそれを32000に変更しましたが、LEDが点滅せず、1000より下に下げると同じトグルレートを維持します...これはどういう意味ですか?

http://www.atmel.com/Images/Atmel-42471-SAM-L21-ADC-Sampling-using-Low-Power-Features_ApplicationNote_AT12705.pdfのような例では、RTCはconf_rtc.hの#define RTC_CLOCK_SOURCEでのみ設定されているようです。誰もがULP32kが正しい計数率を維持してRTCを構成する方法を知ってい

/* Configure GCLK generator 2 (RTC) */ 
# define CONF_CLOCK_GCLK_2_ENABLE true 
# define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY false 
# define CONF_CLOCK_GCLK_2_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC32K 
# define CONF_CLOCK_GCLK_2_PRESCALER 32 
# define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE false 

しかしhttp://www.atmel.com/Images/Atmel-42111-SAM-RTC-Count-Driver-RTC-Count_ApplicationNote_AT03249.pdfのような他の人にそれがようGLCK 2定義しますか?エド・キングの提案に

+0

メインクロックの周波数は何ですか? RTCは、通常、32768Hzのクロック/クリスタルで駆動されます。 –

+0

私が理解する限り、メインクロックソースは4Mhzでプリスケーリングされた内部16Mオシレータとして設定され、RTCクロックソースは内部ULP32Kオシレータである必要があります。それらは2つの別々のクロックソースですが、メインクロックがクロッククロックフリークエンシーに干渉するかどうかわかりません。 –

+0

GCLKジェネレータ2(RTC)の設定をコードに追加してください。あなたのRTCがどのようにクロックされているのかははっきりしていません。 –

答えて

0

おかげで、ここではこの問題について現在調査結果を行く:ドライバをカウントSAM RTC用

クイックスタート(ポーリング)(ATSAML21J18A)、アトメルメーカー7から、LED0ごと2000msのをトグルrtc_count_is_compare_match(&rtc_instance, RTC_COUNT_COMPARE_0)を使用してください。これは2000ミリ秒の右周期で動作するためには

、あなたは超低消費電力クロック・ソースを使用したい場合は、RTCのクロックソースはとしてconf_rtc.hで定義する必要があります。

# define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP1K 

プリスケーラはRTC_COUNT_PRESCALER_DIV_1;でなければなりません(質問の設定を参照)

conf_clocks.hでGLCK2を定義する必要はありません。

compare_values[0] = 1000;は、選択されたトグル期間よりも低い場合に、解像度カウンタのように見えます。LEDはトグルします。それが高い場合(たとえば2001年、2000年の期間)、比較は真実ではないようですので、LEDはトグルしません。いずれの場合でも、トグル周波数は変更されません。

rtc_count_set_period(&rtc_instance, 2000);の値を変更すると、トグル期間が変更されます。

OSCULP32kオシレータには、32kHzと1kHzの2つのモードがあります。私は、この例では32kHzの時のクロックソースを使用していたので、私は

# define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP32K

を変更し、別のプリスケーラを試しますが、LEDは速すぎトグル続けました。これは、set_period関数が1kHzのクロックソースをmsで動作させる必要があるためですが、ここではより明確な説明が役に立ちます。

結論として、OSCULP32kを使用する目的はエネルギー消費を減らすことです。そのため、目的はULP32kモードとULP1kモードの両方を使用して完全に満たされていると思います。