Files
rt-thread/bsp/hc32/tests/test_clock_timer.c
Bernard Xiong 743b614875
Some checks failed
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
doc_doxygen / doxygen_doc generate (push) Has been cancelled
doc_doxygen / deploy (push) Has been cancelled
pkgs_test / change (push) Has been cancelled
utest_auto_run / A9 :components/dfs.cfg (push) Has been cancelled
utest_auto_run / A9 :components/lwip.cfg (push) Has been cancelled
utest_auto_run / A9 :components/netdev.cfg (push) Has been cancelled
utest_auto_run / A9 :components/sal.cfg (push) Has been cancelled
utest_auto_run / A9 :cpp11/cpp11.cfg (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-smp :default.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / RISCV :kernel/atomic_c11.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/ipc.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/kernel_basic.cfg (push) Has been cancelled
utest_auto_run / A9 :kernel/mem.cfg (push) Has been cancelled
ToolsCI / Tools (push) Has been cancelled
Weekly CI Scheduler / Trigger and Monitor CIs (push) Has been cancelled
Weekly CI Scheduler / Create Discussion Report (push) Has been cancelled
[components][clock_time] Refactor time subsystem around clock_time (#11111)
* [components][clock_time] Refactor time subsystem around clock_time

Introduce the clock_time core with clock source/event separation, high-resolution scheduling, and boot-time helpers, plus clock_timer adapters for timer peripherals.

Remove legacy ktime/cputime/hwtimer implementations and migrate arch and BSP time paths to the new subsystem while keeping POSIX time integration functional.

Update drivers, Kconfig/SConscript wiring, documentation, and tests; add clock_time overview docs and align naming to clock_boottime/clock_hrtimer/clock_timer.

* [components][clock_time] Use BSP-provided clock timer frequency on riscv64

* [risc-v] Use runtime clock timer frequency for tick and delays

* [bsp] Add clock timer frequency hooks for riscv64 boards

* [bsp] Update Renesas RA driver doc clock_timer link

* [bsp] Sync zynqmp-r5-axu4ev rtconfig after config refresh

* [bsp][rk3500] Update rk3500 clock configuration

* [bsp][hpmicro] Add rt_hw_us_delay hook and update board delays

* [bsp][stm32l496-st-nucleo] enable clock_time for hwtimer sample in ci

* [bsp][hpmicro] Fix rtconfig include scope for hpm6750evk

Move rtconfig.h include outside the ENET_MULTIPLE_PORT guard for hpm6750evk and hpm6750evk2 so configuration macros are available regardless of ENET settings.

* [bsp][raspi3] select clock time for systimer

* [bsp][hpm5300evk] Trim trailing blank line

* [bsp][hpm5301evklite] Trim trailing blank line

* [bsp][hpm5e00evk] Trim trailing blank line

* [bsp][hpm6200evk] Trim trailing blank line

* [bsp][hpm6300evk] Trim trailing blank line

* [bsp][hpm6750evk] Trim trailing blank line

* [bsp][hpm6750evk2] Trim trailing blank line

* [bsp][hpm6750evkmini] Trim trailing blank line

* [bsp][hpm6800evk] Trim trailing blank line

* [bsp][hpm6e00evk] Trim trailing blank line

* [bsp][nxp] switch lpc178x to gcc and remove mcx timer source

* [bsp][stm32] fix the CONFIG_RT_USING_CLOCK_TIME issue.

* [docs][clock_time] add clock time documentation

* [docs][clock_time] Update clock time subsystem documentation

- Update device driver index to use correct page reference
- Clarify upper layer responsibilities in architecture overview
- Update README to describe POSIX/libc, Soft RTC, and device driver usage
- Refine architecture diagram with improved layout and color scheme
- Remove obsolete clock_timer.md file

* [kernel][utest] Trim trailing space

* [clock_time] Fix hrtimer wrap handling

* [clock_time] fix the static rt_inline issue

* [clock_time] fix the rt_clock_hrtimer_control result issue
2026-01-31 17:44:27 +08:00

165 lines
5.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-12-30 CDT first version
*/
/*
* 程序清单:这是一个 clock_timer 设备使用例程
* 例程导出了 clock_timer_sample 命令到控制终端
* 命令调用格式clock_timer_sample clock_timer_sample [option1] [option2] [option3]
* option1: [tmra_1/2/3..] 定时器单元
* option2: [oneshot/period] 定时模式
* option3: 超时时间,单位毫秒
* eg:clock_timer_sample tmra_1 period 1000
* 程序功能每隔一秒打印一次定时器运行时间值在定时器超时回调函数中打印总tick值
* 可以使用逻辑分析进一步查看测试管脚PA0定时时间是否准确
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <stdlib.h>
#include <board.h>
#ifdef BSP_USING_CLOCK_TIMER
/* IO用于定时时间测试 */
#define TIMEOUT_TEST_PIN GET_PIN(A, 0)
static rt_uint32_t tick;
static rt_bool_t cb_run = RT_FALSE;
static void _clock_timer_cmd_print_usage(void)
{
rt_kprintf("clock_timer_sample [option1] [option2] [option3]\n");
rt_kprintf(" option1: [tmra_1/2/3..] tmra uint\n");
rt_kprintf(" option2: [oneshot/period] timing mode set\n");
rt_kprintf(" option3: timeout unit:ms\n");
rt_kprintf(" e.g. MSH >clock_timer_sample tmra_1 period 1000\n");
}
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
static rt_uint8_t pin_cnt = 0;
rt_pin_write(TIMEOUT_TEST_PIN, ++pin_cnt % 2); /* 电平取反 */
/* 打印出的tick值由于printf原因可能有误差可以查看测试IO来精确确认时间 */
rt_kprintf("callback successful! ticks = %d \n", rt_tick_get() - tick);
tick = rt_tick_get();
cb_run = RT_TRUE;
return 0;
}
static int clock_timer_sample(int argc, char *argv[])
{
rt_uint8_t i;
rt_err_t ret = RT_EOK;
rt_clock_timerval_t timeout_s; /* 定时器超时值 */
rt_clock_timer_mode_t mode = CLOCK_TIMER_MODE_ONESHOT; /* 定时器模式 */
rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */
rt_clock_timer_t *clock_timer;
float t;
rt_uint8_t loop_cnt; /* 循环打印次数 */
rt_clock_timerval_t overflow_tv; /* 定时器超时值 */
rt_uint32_t timer_out_s;
if ((argc != 4) || (rt_strcmp("oneshot", argv[2]) && rt_strcmp("period", argv[2])))
{
_clock_timer_cmd_print_usage();
return -RT_ERROR;
}
/* 查找定时器设备 */
hw_dev = rt_device_find(argv[1]);
if (hw_dev == RT_NULL)
{
rt_kprintf("clock_timer sample run failed! can't find %s device!\n", argv[1]);
return -RT_ERROR;
}
else
{
clock_timer = (rt_clock_timer_t *)hw_dev;
}
/* 以读写方式打开设备 */
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open %s device failed!\n", argv[1]);
return ret;
}
/* 设置模式 */
if (0 == rt_strcmp(argv[2], "oneshot"))
{
mode = CLOCK_TIMER_MODE_ONESHOT;
loop_cnt = 1;
}
else if (0 == rt_strcmp(argv[2], "period"))
{
mode = CLOCK_TIMER_MODE_PERIOD;
loop_cnt = 5;
}
rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode);
/* 设置超时回调函数 */
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/* 设置定时器超时并启动定时器 */
timeout_s.sec = atoi(argv[3]) / 1000U; /* 秒 */
timeout_s.usec = (atoi(argv[3]) % 1000U) * 1000U; /* 微秒 */
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
rt_kprintf("set timeout value failed\n");
return -RT_ERROR;
}
tick = rt_tick_get();
rt_kprintf("set timeout (%d) ms successful\n", atoi(argv[3]));
/* 设置测试管脚为输出模式 */
rt_pin_mode(TIMEOUT_TEST_PIN, PIN_MODE_OUTPUT);
/* oneshot模式cb函数执行一次period模式cb函数执行5次,且每秒打印一次运行时间 */
timer_out_s = (atoi(argv[3]) / 1000U) > 1 ? (atoi(argv[3]) / 1000U) : 1;
for (i = 0; i < (timer_out_s * loop_cnt); i++)
{
/* 延时1000ms */
rt_thread_mdelay(1000);
/* 读取定时器当前值 */
if (mode == CLOCK_TIMER_MODE_PERIOD)
{
rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
}
else if (mode == CLOCK_TIMER_MODE_ONESHOT)
{
rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
t = clock_timer->overflow * clock_timer->period_sec;
overflow_tv.sec = (rt_int32_t)t;
overflow_tv.usec = (rt_int32_t)((t - overflow_tv.sec) * 1000000);
timeout_s.sec = overflow_tv.sec + (timeout_s.usec + overflow_tv.usec) / 1000000;
timeout_s.usec = (timeout_s.usec + overflow_tv.usec) % 1000000;
}
rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);
}
/* 确保oneshot模式cb函数执行一次后才关闭定时器 */
while (cb_run == RT_FALSE);
cb_run = RT_FALSE;
/* close */
rt_device_close(hw_dev);
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample: devname [oneshot | period] timeout);
#endif