BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-硬件定时器)

简介

BearPi IOT开发板 硬件定时器使用

步骤

创建项目

参考 BearPi RT-Thread项目创建

RT-Thread TIM2 设备注册

宏定义添加

rtconfig.h 中添加

#define RT_USING_HWTIMER
#define BSP_USING_TIM
#define BSP_USING_TIM2
生成支持TIM2的mdk5项目工程

env + 指令 scons --target=mdk5 -s
一样参考 参考 BearPi RT-Thread项目创建

STM32CubeMX 开启TIM2

board\CubeMX_Config\CubeMX_Config.ioc 双击打开, 设置TIM2, 如下
在这里插入图片描述

编译烧录

list device 就可以看到timer2设备了
在这里插入图片描述
这里会有两个报错
1) 其中一个就是TIM17, 目前我的芯片是没看到TIM17这个定时器, 所以报错注释掉就可以
2) tim_config.h 中缺少 TIM2_CONFIG
参考其他TIM配置, 加入如下代码

#ifdef BSP_USING_TIM2
#ifndef TIM2_CONFIG
#define TIM2_CONFIG                                        \
    {
                                                           \
       .tim_handle.Instance     = TIM2,                    \
       .tim_irqn                = TIM2_IRQn,               \
       .name                    = "timer2",                \
    }
#endif /* TIM2_CONFIG */
#endif /* BSP_USING_TIM2 */
硬件定时器使用代码

接口参考 HWTIMER 设备

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

#define HWTIMER_DEV_NAME   "timer2"     /* 定时器名称 */
rt_device_t hw_dev;                     /* 定时器设备句柄 */
rt_hwtimerval_t timeout_s;

/* 定时器超时回调函数 */
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_hwtimer_mode_t  mode = HWTIMER_MODE_PERIOD;
		rt_uint32_t freq = 10000;               /* 计数频率 */
	
    /* 查找定时器设备 */
    hw_dev = rt_device_find(HWTIMER_DEV_NAME);
		if ( RT_NULL == hw_dev )
		{
   
			rt_kprintf("can't find device name %s!\n", HWTIMER_DEV_NAME);
			return -RT_ERROR;
		}
	
    /* 以读写方式打开设备 */
    if (RT_EOK != rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR))
		{
   
			rt_kprintf("fail to open device name %s!\n", HWTIMER_DEV_NAME);
			return -RT_ERROR;
		}

    /* 设置超时回调函数 */
    if (RT_EOK != rt_device_set_rx_indicate(hw_dev, timeout_cb))
		{
   
			rt_kprintf("fail to set callback function!\n");
			return -RT_ERROR;
		}
		
		/* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */
    rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
    /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/
    mode = HWTIMER_MODE_PERIOD;
    if (RT_EOK != rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode))
    {
   
        rt_kprintf("set mode failed!\n");
        return -RT_ERROR;
    }
		
		/* 设置定时器超时值为1s并启动定时器 */
    timeout_s.sec = 1;      /* 秒 */
    timeout_s.usec = 0;     /* 微秒 */
    rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s));
		
		rt_kprintf("timer2 init succeed!\n");
    return RT_EOK;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, timer sample);
编译烧录测试

list device ## 看到timer2设备
hwtimer_sample ## 执行指令,1s打印一次

代码

完整代码

参考

RT-Thread API参考手册 定时器管理

RT-Thread 时钟管理

RT-Thread 设备和驱动 - HWTIMER设备

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-16 05:16:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-16 05:16:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-16 05:16:03       82 阅读
  4. Python语言-面向对象

    2023-12-16 05:16:03       91 阅读

热门阅读

  1. cfa一级考生复习经验分享系列(五)

    2023-12-16 05:16:03       60 阅读
  2. 《小聪明》

    2023-12-16 05:16:03       46 阅读
  3. facebook广告怎么降低预算优化效果

    2023-12-16 05:16:03       61 阅读
  4. C# TcpIpSocketSever

    2023-12-16 05:16:03       41 阅读
  5. uniapp腾讯地图路线规划

    2023-12-16 05:16:03       56 阅读