README_CN.md 2.1 KB
Newer Older
armink_ztl's avatar
armink_ztl 已提交
1 2 3 4
# 定时器设备

## 功能

H
heyuanjie87 已提交
5 6 7
* 时间测量
* 周期或单次执行回调函数
  
armink_ztl's avatar
armink_ztl 已提交
8 9
## 编译

H
heyuanjie87 已提交
10
1. 在rtconfig.h添加 `#define RT_USING_HWTIMER`
armink_ztl's avatar
armink_ztl 已提交
11 12 13

## 使用流程

H
heyuanjie87 已提交
14 15 16 17 18 19 20
1. 以读写方式打开设备
2. 设置超时回调函数(如果需要)
3. 根据需要设置定时模式(单次/周期)
4. 设置计数频率(可选)
5. 写入超时值,定时器随即启动
6. 停止定时器(可选)
7. 关闭设备(如果需要)
armink_ztl's avatar
armink_ztl 已提交
21

H
heyuanjie87 已提交
22 23
应用参考 [hwtimer_test] (/examples/test/hwtimer\_test.c)

armink_ztl's avatar
armink_ztl 已提交
24 25 26
## 驱动编写指南

### 操作接口
H
heyuanjie87 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

``` 
struct rt_hwtimer_ops
{
    void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state);
    rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode);
    void (*stop)(struct rt_hwtimer_device *timer);
    rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);
    rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args);
};
```

* init - state <1 打开设备 0 关闭设备> 
* start - cnt <超时值> - mode <单次/周期>
* stop - <停止计数>
* count_get - <读取计数器值>
* control - <设置计数频率 >

armink_ztl's avatar
armink_ztl 已提交
45 46
### 定时器特征信息

H
heyuanjie87 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
```
struct rt_hwtimer_info
{
    rt_int32_t maxfreq;   
    rt_int32_t minfreq;    
    rt_uint32_t maxcnt;     
    rt_uint8_t  cntmode;  
 };
```

* maxfreq <设备支持的最大计数频率>
* minfreq <设备支持的最小计数频率>
* maxcnt  <计数器最大计数值>
* cntmode <递增计数/递减计数>
  
armink_ztl's avatar
armink_ztl 已提交
62 63
### 注册设备

H
heyuanjie87 已提交
64 65 66 67 68 69 70 71 72 73 74 75
```
static rt_hwtimer_t _timer0;
int stm32_hwtimer_init(void)
{
    _timer0.info = &_info;
    _timer0.ops  = &_ops;

    rt_device_hwtimer_register(&_timer0, "timer0", TIM2);

    return 0;
}
```
armink_ztl's avatar
armink_ztl 已提交
76 77 78

### 定时器中断

H
heyuanjie87 已提交
79 80 81 82 83 84 85 86 87
```
void timer_irq_handler(void)
{
    //其它操作
    
    rt_device_hwtimer_isr(&_timer0);
}
```

armink_ztl's avatar
armink_ztl 已提交
88 89 90
## 注意事项

**可能出现定时误差**
H
heyuanjie87 已提交
91 92 93 94

误差原因:

假设计数器最大值0xFFFF,计数频率1Mhz,定时时间1秒又1微秒。
armink_ztl's avatar
armink_ztl 已提交
95

H
heyuanjie87 已提交
96 97
由于定时器一次最多只能计时到65535us,对于1000001us的定时要求。
可以50000us定时20次完成,此时将会出现计算误差1us。