Hello.
I am trying to run an alarm clock using the RTC calendar. In the main loop I see the time being printed, but there is no response from the alarm callback, which I set for 10 seconds.
Here is part of my code with alarm and rtc timer
uint32_t ticks;
uint64_t microseconds;
uint32_t seconds;
uint32_t remainder_us;
uint32_t current_ticks, alarm_ticks;
uint32_t diff_seconds, diff_us;
time_t current_epoch_time, target_epoch_time;
if (!device_is_ready(counter_dev)) {
printk("Counter device is not ready\n");
return;
}
// starting counter
counter_start(counter_dev);
struct tm init_time = {
.tm_year = 2025 - 1900,
.tm_mon = 1 - 1,
.tm_mday = 1,
.tm_hour = 0,
.tm_min = 0,
.tm_sec = 0,
};
time_t start_epoch_time = mktime(&init_time);
current_epoch_time = mktime(&init_time);
struct tm target_time = {
.tm_year = 2025 - 1900,
.tm_mon = 1 - 1,
.tm_mday = 1,
.tm_hour = 0,
.tm_min = 0,
.tm_sec = 10,
};
target_epoch_time = mktime(&target_time);
/* Обчислюємо різницю в секундах */
diff_seconds = (uint32_t)(target_epoch_time - current_epoch_time);
printk("diff_seconds = %d\n",diff_seconds);
/* Конвертуємо різницю в мікросекунди */
diff_us = diff_seconds * 1000000U;
printk("diff_us = = %d\n",diff_us);
/* Отримуємо поточний показник таймера */
counter_get_value(counter_dev, ¤t_ticks);
/* Обчислюємо значення тика для спрацювання будильника */
alarm_ticks = current_ticks + counter_us_to_ticks(counter_dev, diff_us);
printk("current_ticks = %d\n",current_ticks);
printk("alarm_ticks = %d\n",alarm_ticks);
/* Налаштування параметрів будильника */
struct counter_alarm_cfg alarm_cfg = {
.ticks = alarm_ticks,
.flags = COUNTER_ALARM_CFG_ABSOLUTE, // Використовуйте цей прапорець, якщо підтримується
.callback = alarm_callback,
.user_data = NULL,
};
/* Встановлюємо будильник на каналі 0 */
err = counter_set_channel_alarm(counter_dev, 0, &alarm_cfg);
if (err < 0) {
LOG_ERR("Failed to configure set_channel_alarm");
return -1;
}
for (;;) {
counter_get_value(counter_dev, &ticks);
// Конвертуємо тики в мікросекунди
microseconds = counter_ticks_to_us(counter_dev, ticks);
// Визначаємо секунди та залишок мікросекунд
seconds = (uint32_t)(microseconds / 1000000U);
remainder_us = (uint32_t)(microseconds % 1000000U);
// Обчислюємо поточний час
time_t current_epoch_time = start_epoch_time + seconds;
struct tm *current_time = gmtime(¤t_epoch_time);
// Виводимо поточний час у форматі YYYY-MM-DD HH:MM:SS
printk("Поточний час: %04d-%02d-%02d %02d:%02d:%02d.%06u\n",
current_time->tm_year + 1900,
current_time->tm_mon + 1,
current_time->tm_mday,
current_time->tm_hour,
current_time->tm_min,
current_time->tm_sec,
remainder_us);
// Затримка на 1 секунду
k_sleep(K_SECONDS(3));
}
Here is my prj.conf
# Logger module
CONFIG_LOG=y
# Button and LED library
# Bluetooth LE
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="MY_LBS1"
CONFIG_BT_SMP=y
# Increase stack size for the main thread and System Workqueue
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_NVS=y
CONFIG_NRFX_TIMER1=y
CONFIG_ADC=y
CONFIG_SPI=y
CONFIG_GPIO=y
CONFIG_PRINTK=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
CONFIG_RTC=y
CONFIG_COUNTER=y
Also here is my logs from RTT:
diff_seconds = 10
diff_us = 10000000
current_ticks = 85886
alarm_ticks = 413566
Поточний час: 2025-01-01 00:00:02.620666
Поточний час: 2025-01-01 00:00:05.620819
Поточний час: 2025-01-01 00:00:08.620971
I use NCS 2.8.0
Let me know if you need any more information. I would be very grateful for help.