嵌入式技术william hill官网
直播中

五斤麻辣油

9年用户 1293经验值
擅长:电源/新能源
私信 关注
[经验]

小白求助怎样去使用RT-Thread的硬件定时器HWTIMER呢

第一步:查找该外设开启的前置条件或使用步骤
RTT系统每需开启一种外设,都可以直接在dirvers/board.h里找到使用该外设的步骤。

第二步:跟着第一步找到对应外设,这里举例硬件定时器。
board.h里说明,要想用硬件定时器,需要在RT-Thread Settings中进行勾选。

第三步:通过宏定义打开对应的外设配置。

第四步:在board.c中添加定时器3的初始化代码。
这个步骤是很多人会经常出错的地方,又是基于RTT Studio开发,又是接入STM32CuBeMx的相关代码。一会函数名冲突,一会stm32f4xx_hal_conf.h因STM32CuBeMx的代码生成,变成stm32f4xx_hal_conf_back.h,也引入一些找不到stm32f4xx_hal_conf.h头文件的问题。所以我习惯不在项目里使用STM32CuBeMx,而是单独在桌面打开STM32CuBeMx按着需要进行外设配置。(这种习惯不一定最好)然后将如图所示代码添加道board.c的末尾。

在board.c中添加外设初始化代码。

第五步:进行STM32 HAL库本身需要支持的宏打开。
最关键,也最容易出错的一步完成了。

第六步:跟着官方撸代码。
注意官方使用的外设是"time0",我改成了"time3"。然后也会报一些没有定义某某结构体等的错。那就加上#include

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

#include
#include

#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!
");
rt_kprintf("tick is :%d !
", 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!
", 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!
", 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
", 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
");
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
", timeout_s.sec, timeout_s.usec);
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);

原作者:RT_Student


更多回帖

发帖
×
20
完善资料,
赚取积分