在学习rt-thread文档的时候,根据rt-thread官方的步骤,但是还是没有实现预期效果。中途我也遇到了一些问题,今天就来看看关于文档HWTIMER设备的实现步骤。
首先学习HWTIMER所需要的文档
函数 | 描述 |
---|---|
rt_device_find(); | 功能:查找设备。参数:设备名称。返回值:成功返回设备句柄,失败返回RT_NULL |
rt_devcie_open() | 功能:打开设备。参数1:设备句柄,参数2:打开模式,一般为读写打开:RT_DEVICE_OFLAG_RDWR。返回值:成功返回RT_EOK,错误返回其它错误码 |
rt_device_set_rx_indicate() | 功能:设置超值回调函数。参数1:设备句柄,参数2:回调函数。返回值:成功返回RT_EOK |
rt_device_control() | 功能:控制定时器。参数1:设备句柄,参数2:命令控制字,参数3:控制参数。返回值:成功返回RT_EOK,失败返回-RT_ENOSYS |
rt_device_write () | 功能:设置定时器超时值。参数1:设备句柄,参数2:偏移量(一般为0),参数3:指向超时时间结构体指针,参数4:结构体大小。返回值:成功返回结构体大小,失败返回0 |
rt_device_read () | 功能:读取定时器当前值。参数1:设备句柄,参数2:偏移量,参数3:输出参数,指向定时器时间结构体指针,参数4:超时时间结构体大小。返回值:返回超时时间结构体大小,失败返回0 |
rt_device_close() | 功能:关闭设备。参数:设备句柄。返回值:RE_EOK表示关闭成功,-RT_ENOSYS表示重复关闭,其它错误码表示关闭失败 |
直接上代码(内容做了部分修改以编译验证),读取定时值部分代码删除了,学会这个后面加上去很容易的:
#include <rtthread.h>
#include <rtdevice.h>
#include "hwtimer_sample.h"
rt_device_t hw_dev; //设备句柄
rt_hwtimer_mode_t mode; //控制参数,单次定时OR周期定时
rt_hwtimerval_t timeout_t; //定时器超出值
/* 定时器超时回调函数 */
rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
rt_kprintf("this is hwtimer timeout callback fucntion!\n");
return 0;
}
int hw_sample(void)
{
rt_err_t ret = RT_EOK;
/* 查找设备 */
hw_dev = rt_device_find(HWTIME_DEV_NAME);
if(hw_dev == RT_NULL)
{
rt_kprintf("find %s failed\t\n", HWTIME_DEV_NAME);
return RT_ERROR;
}
/* 查找设备成功 */
rt_kprintf("find %s success \t\n",HWTIME_DEV_NAME);
/* 以读写的方式打开设备 */
rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
/* 设置定时器工作模式为周期定时 */
mode = HWTIMER_MODE_PERIOD;
rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
/* 超值回调函数 */
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/* 配置超时值 */
timeout_t.sec = 5;
timeout_t.usec = 0;
rt_device_write(hw_dev, 0, &timeout_t, sizeof(timeout_t));
return RT_EOK;
}
1.寻找定时器3
我用到的是STM32F407IET6,用到的定时器可以在tim_config.h查看可以使用的定时器,其它能知道的方法未知,按道理查看原理图是有的。
2、配置定时器3
首先需要在RT-Thread setting打开定时器设备
接下来在board.h文件中取消TIM的注释,在添加一个TIM3
接下来把stm32f4xx_hal_conf.h文件中的定时器使能
不要以为这就完了。在board.h文件里有使用步骤,因为我看文档不细心
第一、二、四步已经完成了,那stm32xxxx_hal_msp.c这个文件在哪。这个文件在RT-Thread项目里是没有的,需要下载stm32cubeMX软件,这个软件简单的理解就是对芯片的外设进行封装,我的理解类似于库函数
如何下载以及安装可以百度。
设置完后直接生成
我们找到生成的目录文件,在Src文件夹下看到了熟悉的文件
将代码复制到borad.c文件尾