本文主要是介绍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设备
这篇关于BearPi Std 板从入门到放弃 - 先天神魂篇(7)(RT-Thread 定时器-硬件定时器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!