目的
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。