本章节将讲解 RTC定时器 的示例以及重要接口的使用。
{SDK}\.sdk\csk\samples\driver\counter
演示使用 RTC 定时器来实现定时,1s后获取定时器的计数值,并设置闹钟为10s后触发回调。
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk\csk\samples\driver\counter -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop
是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin
文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。
若您已按照 《环境搭建》 教程完成开发环境的安装,可在编译完成后执行 lisa zep exec cskburn
指令完成烧录。
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
请将命令行中的的 COMx 替换为开发套件在 PC 上对应的串口号(可通过设备管理器查看)。例如:
COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
请将命令行中的 PORT 替换为开发套件连接在 PC 上对应的串口号。例如:
/dev/ttyUSB0
。
烧录完成后,连接串口终端,按下开发板复位按钮,可看到串口有对应的信息输出。
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
…
// 回调函数
static void sec_counter_callback(const struct device *dev, uint8_t id, uint32_t ticks, void *ud)
{
printk("Counter alarm callback at %u ms, id %d, ticks %u, ud %p\n", k_uptime_get_32(), id,
ticks, ud);
}
void rtc_thread(void *v1, void *v2, void *v3)
{
const struct device *rtc = NULL;
uint32_t ticks = 0;
printk("======RTC device sample start======\n");
// 获取 RTC 的句柄
rtc = DEVICE_DT_GET(DT_NODELABEL(rtc1));
…
// 检查 RTC 就绪状态
if (!device_is_ready(rtc)) {
printk("RTC: Device is not ready.\n");
}
// 读取和打印RTC的最大计数值(顶值)
uint32_t rtc_top_value = counter_get_top_value(rtc);
printk("RTC top value is %ds\n", rtc_top_value);
// 启动计数器
counter_start(rtc);
k_msleep(1000);
// 读取计数值
counter_get_value(rtc, &ticks);
printk("RTC value: %ds\n", ticks);
printk("======RTC device alarm sample start======\n");
uint32_t now;
struct counter_alarm_cfg alarm_cfg;
alarm_cfg.flags = 0;
// 设置闹钟的回调函数
alarm_cfg.callback = sec_counter_callback;
counter_get_value(rtc, &now);
alarm_cfg.ticks = now + 10; // After 10s alarm
alarm_cfg.user_data = &alarm_cfg;
counter_set_channel_alarm(rtc, 0, &alarm_cfg);
}
int main(void)
{
int pri = k_thread_priority_get(k_current_get());
k_thread_create(&rtc_thread_data, rtc_stack_area, K_THREAD_STACK_SIZEOF(rtc_stack_area),
rtc_thread, NULL, NULL, NULL, pri, 0, K_NO_WAIT);
while (1) {
k_msleep(50);
}
}