gpt4 book ai didi

使用 ULPOSC32K 在 Atmel SAM L21 Xplained Pro 中配置 RTC - 频率错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:48 25 4
gpt4 key购买 nike

我正在尝试在 SAM L21 Xplained Pro B 中使用超低功耗时钟 OSCULP32K 将 RTC 配置为计数模式,使用 ASF。为了对其进行测试,我按照快速启动 RTC 计数轮询示例进行操作,该示例通过将 RTC 计数与给定周期进行比较,每 2000 毫秒切换一次 LED0。

在示例中,RTC_CLOCK_SOURCE 使用 RTC_CLOCK_SELECTION_ULP1K。当我将其更改为 RTC_CLOCK_SELECTION_ULP32K 时,LED 每 2000 毫秒切换 24 次,而不是每 2000 毫秒切换一次。

我在 conf_rtc.h 中有以下配置:

#  define RTC_CLOCK_SOURCE    RTC_CLOCK_SELECTION_ULP32K

然后,在 conf_clocks.h 中,我将主 CPU 时钟配置为 4Mhz。

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

它被初始化后,main(void) 处的代码如下:

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 配置。

但是在其他人中,例如 http://www.atmel.com/Images/Atmel-42111-SAM-RTC-Count-Driver-RTC-Count_ApplicationNote_AT03249.pdf它将 GLCK 2 定义为:

/* 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 以保持正确的计数率?

最佳答案

感谢 Ed King 的建议,以下是目前关于此事的调查结果:

来自 Atmel Studio 7 的 SAM RTC 计数驱动程序(轮询)(ATSAML21J18A) 的快速入门使用 rtc_count_is_compare_match(&rtc_instance, RTC_COUNT_COMPARE_0) 每 2000 毫秒切换一次 LED0。

为了使其在正确的 2000ms 周期内工作,并且如果您想使用超低功耗时钟源,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。我想在这个例子中使用 32kHz 的时钟源,所以我改变了

#define RTC_CLOCK_SOURCE RTC_CLOCK_SELECTION_ULP32K

并尝试了不同的预分频器,但 LED 一直切换得太快。我假设发生这种情况是因为 set_period 函数需要 1kHz 时钟源才能在 ms 中工作,尽管更清楚的解释在这里可能会有用。

总而言之,使用 OSCULP32k 的目的是降低能耗,所以我想使用 ULP32k 和 ULP1k 模式都可以达到目标。

关于使用 ULPOSC32K 在 Atmel SAM L21 Xplained Pro 中配置 RTC - 频率错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47071404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com