2017-11-02 1 views
1

SAM L21 Xplained Pro B의 초 저전력 클럭 OSCULP32K, ASF ASF를 사용하여 RTC를 카운트 모드로 구성하려고합니다. 이를 테스트하기 위해 빠른 시작 RTC 카운트 폴링 예제를 따랐습니다.이 예제에서는 RTC 카운트를 주어진 기간과 비교하여 2000m마다 LED0를 토글합니다.Atmel SAM L21 Xplained Pro ULPOSC32K에서 RTC 구성 - 주파수 오류

이 예제에서 RTC_CLOCK_SOURCE는 RTC_CLOCK_SELECTION_ULP1K를 사용합니다. RTC_CLOCK_SELECTION_ULP32K로 변경하면 LED가 2000ms마다 한 번이 아닌 2000ms마다 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에있는

, I 구성하고 다음과 같이 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*/ 
    } 
} 

I을 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로만 구성되는 것 같습니다.

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

사람이 ULP32k 올바른 카운트 속도를 유지와 RTC를 구성하는 방법을 알고 있나요 :

그러나 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 오실레이터이어야한다. 그들은 두 개의 분리 된 클럭 소스이지만, 메인 클럭이 rtc 클럭 frecuency와 간섭하는지 모르겠습니다 ... –

+0

코드에 GCLK 제너레이터 2 (RTC)의 구성을 추가하십시오. RTC가 클럭되는 시간은 명확하지 않습니다. –

답변

0

덕분에, 여기에이 문제에 대한 현재의 연구 결과를 이동 : 드라이버를 카운트 SAM RTC에 대한

빠른 시작 (폴링) (ATSAML21J18A), 아트멜 스튜디오 7에서, LED0마다 2000ms를 전환 rtc_count_is_compare_match(&rtc_instance, RTC_COUNT_COMPARE_0)을 사용합니다.

2000ms의 오른쪽 기간에 작업이 위해서는

,하고 초 저전력 클록 소스를 사용하려는 경우 RTC 클럭 소스는 다음과 같이 conf_rtc.h에서 정의해야합니다

# define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP1K 

prescaler는 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의 두 가지 모드가 있습니다. 나는이 예에서는 32kHz에서의 클럭 소스를 사용하고 싶었, 그래서 나는

# define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP32K

을 변경하고 다른 프리스케일러 실험,하지만 LED는 너무 빨리 전환 있었다. 더 명확한 설명이 여기서 유용 할 수는 있지만 set_period 함수는 1kHz 클럭 소스가 ms로 작동해야하기 때문에 이러한 상황이 발생한다고 가정합니다.

결론적으로 OSCULP32k를 사용하는 목적은 에너지 소비를 줄이는 것이므로 ULP32k 및 ULP1k 모드를 모두 사용하여 목표를 충분히 채우고 있다고 생각합니다.