简介
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设备