本章节将讲解 Dual定时器 与 GPT定时器 的示例以及重要接口的使用。
int counter_set_top_value ( const struct device * dev, const struct counter_top_cfg * cfg )
函数设置最高值,并可选择根据计数器方向将计数器重置为 0 或最高值。在周转时,计数器可以重置,并且定期调用可选的回调。只有当没有活动频道警报时,才能更改最高值。
参数说明
字段 | 说明 |
---|---|
dev | 指向驱动程序实例的设备结构的指针 |
cfg | 配置。不能为 NULL |
返回值
字段 | 说明 |
---|---|
0 | 成功 |
-ENOTSUP | 不支持请求(例如,在顶部值更新期间无法更改顶部值或不能/必须重置计数器) |
-EBUSY | 任何警报处于激活状态 |
-ETIME | 设置了COUNTER_TOP_CFG_DONT_RESET,并且新的最高值小于当前计数器值(计数器计数) |
更多Counter Interface Driver API接口可查看Zephyr官网Counter Interface Driver API。
{SDK}\.sdk\csk\samples\driver\counter_timer
本示例演示使用dual_timer 和 gpt定时器来实现定时器,10s后,停止定时器,12s后在main函数中重新启用定时器。
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk\csk\samples\driver\counter_timer -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
。
烧录完成后,连接串口终端,按下开发板复位按钮,可看到串口有对应的信息输出。
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
在工程目录 prj.conf
文件中需使能以下模块:
CONFIG_STDOUT_CONSOLE=y
CONFIG_PRINTK=y
CONFIG_COUNTER=y
CONFIG_COUNTER_CSK6_GPTCHANNEL=y
设备树文件csk6_duomotai_devkit.overlay
配置如下:
/*
* SPDX-License-Identifier: Apache-2.0
*/
&gptchannel0 {
compatible = "listenai,csk-gptchannel";
status = "okay";
channel_mode = <0>; /* Deprecated */
};
1.获取ADC设备的句柄
counter_dev = DEVICE_DT_GET(DT_NODELABEL(gptchannel0));
2.配置 counter_top_cfg 结构体
top_cfg.flags = 0;
top_cfg.ticks = counter_us_to_ticks(counter_dev, DELAY_US);
top_cfg.callback = test_counter_interrupt_fn;
top_cfg.user_data = NULL;
3.设置计数器的阈值
err = counter_set_top_value(counter_dev, &top_cfg);
4.无限循环中,每次将 g_counter 置零,然后启动计数器
while (1)
{
g_counter = 0;
counter_start(counter_dev);
k_msleep(12000);
printk("restart\n");
}
5.通过串口打印计数
按下开发板复位按钮,运行程序,可通过串口查看打印结果
int main(void)
{
const struct device *counter_dev;
int err;
struct counter_top_cfg top_cfg;
printk("Counter alarm sample\n\n");
#ifdef CONFIG_COUNTER_CSK6_GPTCHANNEL
counter_dev = DEVICE_DT_GET(DT_NODELABEL(gptchannel0));
#elif
counter_dev = DEVICE_DT_GET(DT_NODELABEL(dual_timer));
#endif
if (counter_dev == NULL) {
printk("counter device not found\n");
return 0;
}
top_cfg.flags = 0;
top_cfg.ticks = counter_us_to_ticks(counter_dev, DELAY_US);
top_cfg.callback = test_counter_interrupt_fn;
top_cfg.user_data = NULL;
err = counter_set_top_value(counter_dev, &top_cfg);
if (err < 0) {
printk("counter_set_channel_alarm err %d\n",err);
}
while (1)
{
g_counter = 0;
counter_start(counter_dev);
k_msleep(12000);
printk("restart\n");
}
return 0;
}