RT_Thread 硬件定时器使用

  初学对RT_thread 许多配置的流程不熟悉,记录一些基本的操作。下面将简单介绍如何在RT_Thread中使用硬件定时器3,来进行重复定时中断。

 代码使用RT_Thread 硬件定时器给的一个例子,https://www.rt-thread.org/document/site/programming-manual/device/hwtimer/hwtimer/

硬件定时器设备使用示例

    硬件定时器设备的具体使用方式可以参考如下示例代码,示例代码的主要步骤如下:

  1. 首先根据定时器设备名称 “timer3” 查找设备获取设备句柄。

  2. 以读写方式打开设备 “timer3” 。

  3. 设置定时器超时回调函数。

  4. 设置定时器模式为周期性定时器,并设置超时时间为 5 秒,此时定时器启动。

  5. 延时 3500ms 后读取定时器时间,读取到的值会以秒和微秒的形式显示。

/*
 * 程序清单:这是一个 hwtimer 设备使用例程
 * 例程导出了 hwtimer_sample 命令到控制终端
 * 命令调用格式:hwtimer_sample
 * 程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。
*/

#include <rtthread.h>
#include <rtdevice.h>

#define HWTIMER_DEV_NAME   "timer3"     /* 定时器名称 */

/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    rt_kprintf("this is hwtimer timeout callback fucntion!\n");
    rt_kprintf("tick is :%d !\n", rt_tick_get());

    return 0;
}

static int hwtimer_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */
    rt_device_t hw_dev = RT_NULL;   /* 定时器设备句柄 */
    rt_hwtimer_mode_t mode;         /* 定时器模式 */

    /* 查找定时器设备 */
    hw_dev = rt_device_find(HWTIMER_DEV_NAME);
    if (hw_dev == RT_NULL)
    {
        rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
        return RT_ERROR;
    }

    /* 以读写方式打开设备 */
    ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
    if (ret != RT_EOK)
    {
        rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
        return ret;
    }

    /* 设置超时回调函数 */
    rt_device_set_rx_indicate(hw_dev, timeout_cb);

    /* 设置模式为周期性定时器 */
    mode = HWTIMER_MODE_PERIOD;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }

    /* 设置定时器超时值为5s并启动定时器 */
    timeout_s.sec = 5;      /* 秒 */
    timeout_s.usec = 0;     /* 微秒 */

    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;
    }

    /* 延时3500ms */
    rt_thread_mdelay(3500);

    /* 读取定时器当前值 */
    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec);

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);

 在ENV中开启了TIM3。使用scons进行编译,却出现了编译出错。

出现这个情况的原因是没有在CubeMX中开启定时器3以及配置。通过如下进行一下图形配置即可。在图形界面进行设置相关参数时,可先随意配置,然后再在程序中根据自己的需求进行修改。同样,当我们需要进行配置其他的外设时,也需在CubeMX中进行开启相应的配置。

 

### RT-Thread 操作系统中的硬件定时器 #### 硬件定时器概述 RT-Thread 是一个开源的实时操作系统(RTOS),特别适用于嵌入式设备和物联网应用。该系统提供了对硬件定时器的支持,允许开发者利用处理器或外部硬件模块提供的高精度和稳定性的定时器功能[^1]。 #### 使用方法 为了操作硬件定时器,在 RT-Thread 中可以通过其设备驱动框架来进行配置和控制。具体来说: - **初始化**:首先需要调用 `rt_hw_timer_init()` 来完成硬件定时器的初始化工作。 - **注册回调函数**:接着可以设置当定时时间到达时触发的动作,即指定相应的中断服务程序(ISR),这一步骤通常通过 `rt_hw_interrupt_install()` 实现。 - **启动/停止定时器**:使用 `rt_hw_timer_start()` 或者 `rt_hw_timer_stop()` 控制定时器的状态切换。 - **读取当前计数值**:有时可能还需要知道定时器目前剩余的时间量,则可借助于 `rt_hw_timer_read()` 获取这一数据。 下面给出一段简单的代码示例展示如何在应用程序层面管理一个硬件定时器实例: ```c #include "rtthread.h" #include "board.h" static void timer_sample(void *parameter) { /* 定义并初始化一个新的硬件定时器对象 */ struct rt_hardware_timer* hw_timer; // 初始化硬件定时器结构体 hw_timer = (struct rt_hardware_timer*)rt_malloc(sizeof(struct rt_hardware_timer)); if (!hw_timer) { rt_kprintf("No memory\n"); return ; } memset(hw_timer, 0x00, sizeof(struct rt_hardware_timer)); /* 设置定时周期为1秒 */ hw_timer->period = RT_TICK_PER_SECOND; /* 注册ISR处理函数 */ rt_hw_interrupt_install(TIMER_IRQ_NUMBER, sample_isr_handler, RT_NULL, "sample"); /* 开启定时器 */ rt_hw_timer_start(hw_timer); } /* ISR Handler Function Prototype Declaration Here */ int main() { /* 创建线程来运行上述例子 */ rt_thread_t tid = rt_thread_create("timer", timer_sample, RT_NULL, 512, 25, 10); if(tid != RT_NULL){ rt_thread_startup(tid); } while(1){ rt_thread_delay(RT_TICK_PER_SECOND); } } ``` 这段代码展示了怎样在一个新创建的任务里边去管理和操控一个具体的硬件定时器资源,并为其指定了每秒钟触发一次的服务例程(sample_isr_handler)[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值