20191006 (17)RT-Thread 硬件定时器接口说明(1)

目的

1 初步接触 RTOS 关于外设的使用方式
2 了解硬件定时器涉及到的内容


正文

硬件定时器是通过 RTOS 提供的 IO 设备管理接口,这就是符合裸程序时候设定定时器的方式。

函数 描述
rt_device_find() 查找定时器设备
rt_device_open() 以读写方式打开定时器设备
rt_device_set_rx_indicate() 设置超时回调函数
rt_device_control() 控制定时器设备,可以设置定时模式(单次/周期)/计数频率,或者停止定时器
rt_device_write() 设置定时器超时值,定时器随即启动
rt_device_read() 获取定时器当前值
rt_device_close() 关闭定时器设备

1 查找定时器

一般情况下,注册到系统的硬件定时器设备名称为 timer0,timer1等

#define HWTIMER_DEV_NAME "timer0" /* 定时器名称 */
rt_device_t hw_dev; /* 定时器设备句柄 */ 
/* 查找定时器设备 */ 
hw_dev = rt_device_find(HWTIMER_DEV_NAME);

2 打开定时器
注意: 打开设备时,会自动检测是否初始化,如果没有就自动调用初始化接口初始化该设备

一般使用读写方式打开设备:RT_DEVICE_OFLAG_RDWR

#define RT_DEVICE_OFLAG_RDONLY   0x001 只读访问权限  
#define RT_DEVICE_OFLAG_WRONLY   0x002 只写访问权限 
#define RT_DEVICE_OFLAG_RDWR   0x003 读写权限

3 设置设备接收回调函数

当硬件设备接收到数据时,会回调这个函数并把收到的数据长度放在size参数中传递给上层应用。 上层应用线程应在收到指示后,立刻从设备中读取数据。

4 控制设备

定时器硬件及驱动支持设置计数频率的情况下设置频率才有效,一般使用驱动设置的默认频率即可
获取定时器特征信息参数 arg 为指向结构体 struct rt_hwtimer_info 的指针,作为一个输出参数保存获取的信息
HWTIMER_MODE_ONESHOT 单次定时
HWTIMER_MODE_PERIOD 周期性定时

HWTIMER_CTRL_FREQ_SET设置计数频率
HWTIMER_CTRL_STOP停止定时器
HWTIMER_CTRL_INFO_GET获取定时器特征信息
HWTIMER_CTRL_MODE_SET设置定时器模式

5 该函数将向设备写入数据

typedef struct rt_hwtimerval { 
rt_int32_t sec; /* 秒 s */ 
rt_int32_t usec; /* 微秒 us */
} rt_hwtimerval_t;

6 该函数将向设备读取数据
rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size);

7 关闭设备

关闭设备接口和打开设备接口需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。

可能出现定时误差。假设计数器最大值 0xFFFF,计数频率 1Mhz,定时时间 1 秒又 1 微秒。由于定时器一次最多只能计时到 65535us,对于 1000001us 的定时要求。可以 50000us 定时 20 次完成,此时将会出现计算误差 1us。

发布了120 篇原创文章 · 获赞 27 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_24890953/article/details/102254576