Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2301_76519099
rt-thread
提交
f12d5bfb
R
rt-thread
项目概览
2301_76519099
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
3
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
f12d5bfb
编写于
12月 14, 2018
作者:
B
Bernard Xiong
提交者:
GitHub
12月 14, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2065 from qgyhd1234/hwtimer
完善 hwtimer 测试例程,修改 readme 显示错误
上级
698f9a91
6ea32ee4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
50 addition
and
29 deletion
+50
-29
components/drivers/hwtimer/README_CN.md
components/drivers/hwtimer/README_CN.md
+24
-25
examples/test/hwtimer_test.c
examples/test/hwtimer_test.c
+26
-4
未找到文件。
components/drivers/hwtimer/README_CN.md
浏览文件 @
f12d5bfb
定时器设备
# 定时器设备
===
## 功能
##功能
---
*
时间测量
*
时间测量
*
周期或单次执行回调函数
*
周期或单次执行回调函数
##编译
##
编译
---
1.
在rtconfig.h添加
`#define RT_USING_HWTIMER`
1.
在rtconfig.h添加
`#define RT_USING_HWTIMER`
##使用流程
##
使用流程
---
1.
以读写方式打开设备
1.
以读写方式打开设备
2.
设置超时回调函数(如果需要)
2.
设置超时回调函数(如果需要)
3.
根据需要设置定时模式(单次/周期)
3.
根据需要设置定时模式(单次/周期)
...
@@ -19,12 +18,12 @@
...
@@ -19,12 +18,12 @@
5.
写入超时值,定时器随即启动
5.
写入超时值,定时器随即启动
6.
停止定时器(可选)
6.
停止定时器(可选)
7.
关闭设备(如果需要)
7.
关闭设备(如果需要)
应用参考 [hwtimer_test] (/examples/test/hwtimer
\_
test.c)
应用参考 [hwtimer_test] (/examples/test/hwtimer
\_
test.c)
##驱动编写指南
##
驱动编写指南
---
###操作接口
###
操作接口
```
```
struct rt_hwtimer_ops
struct rt_hwtimer_ops
...
@@ -43,8 +42,8 @@ struct rt_hwtimer_ops
...
@@ -43,8 +42,8 @@ struct rt_hwtimer_ops
*
count_get -
<读取计数器值>
*
count_get -
<读取计数器值>
*
control -
<设置计数频率
>
*
control -
<设置计数频率
>
###定时器特征信息
###
定时器特征信息
```
```
struct rt_hwtimer_info
struct rt_hwtimer_info
{
{
...
@@ -60,7 +59,8 @@ struct rt_hwtimer_info
...
@@ -60,7 +59,8 @@ struct rt_hwtimer_info
*
maxcnt
<计数器最大计数值>
*
maxcnt
<计数器最大计数值>
*
cntmode
<递增计数
/
递减计数
>
*
cntmode
<递增计数
/
递减计数
>
###注册设备
### 注册设备
```
```
static rt_hwtimer_t _timer0;
static rt_hwtimer_t _timer0;
int stm32_hwtimer_init(void)
int stm32_hwtimer_init(void)
...
@@ -73,8 +73,9 @@ int stm32_hwtimer_init(void)
...
@@ -73,8 +73,9 @@ int stm32_hwtimer_init(void)
return 0;
return 0;
}
}
```
```
###定时器中断
### 定时器中断
```
```
void timer_irq_handler(void)
void timer_irq_handler(void)
{
{
...
@@ -84,15 +85,13 @@ void timer_irq_handler(void)
...
@@ -84,15 +85,13 @@ void timer_irq_handler(void)
}
}
```
```
##注意事项
## 注意事项
---
**可能出现定时误差**
<font
color=
"#FF0000"
>
可能出现定时误差
</font>
误差原因:
误差原因:
假设计数器最大值0xFFFF,计数频率1Mhz,定时时间1秒又1微秒。
假设计数器最大值0xFFFF,计数频率1Mhz,定时时间1秒又1微秒。
由于定时器一次最多只能计时到65535us,对于1000001us的定时要求。
由于定时器一次最多只能计时到65535us,对于1000001us的定时要求。
可以50000us定时20次完成,此时将会出现计算误差1us。
可以50000us定时20次完成,此时将会出现计算误差1us。
examples/test/hwtimer_test.c
浏览文件 @
f12d5bfb
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
static
rt_err_t
timer_timeout_cb
(
rt_device_t
dev
,
rt_size_t
size
)
static
rt_err_t
timer_timeout_cb
(
rt_device_t
dev
,
rt_size_t
size
)
{
{
rt_kprintf
(
"
HT %d
\n
"
,
rt_tick_get
()
);
rt_kprintf
(
"
enter hardware timer isr
\n
"
);
return
0
;
return
0
;
}
}
...
@@ -35,7 +35,7 @@ int hwtimer(void)
...
@@ -35,7 +35,7 @@ int hwtimer(void)
return
-
1
;
return
-
1
;
}
}
rt_device_set_rx_indicate
(
dev
,
timer_timeout_cb
);
/* 时间测量 */
/* 计数时钟设置(默认1Mhz或支持的最小计数频率) */
/* 计数时钟设置(默认1Mhz或支持的最小计数频率) */
err
=
rt_device_control
(
dev
,
HWTIMER_CTRL_FREQ_SET
,
&
freq
);
err
=
rt_device_control
(
dev
,
HWTIMER_CTRL_FREQ_SET
,
&
freq
);
if
(
err
!=
RT_EOK
)
if
(
err
!=
RT_EOK
)
...
@@ -69,12 +69,34 @@ int hwtimer(void)
...
@@ -69,12 +69,34 @@ int hwtimer(void)
rt_device_read
(
dev
,
0
,
&
val
,
sizeof
(
val
));
rt_device_read
(
dev
,
0
,
&
val
,
sizeof
(
val
));
rt_kprintf
(
"Read: Sec = %d, Usec = %d
\n
"
,
val
.
sec
,
val
.
usec
);
rt_kprintf
(
"Read: Sec = %d, Usec = %d
\n
"
,
val
.
sec
,
val
.
usec
);
/* 定时执行回调函数 -- 单次模式 */
/* 设置超时回调函数 */
rt_device_set_rx_indicate
(
dev
,
timer_timeout_cb
);
/* 单次模式 */
mode
=
HWTIMER_MODE_PERIOD
;
err
=
rt_device_control
(
dev
,
HWTIMER_CTRL_MODE_SET
,
&
mode
);
/* 设置定时器超时值并启动定时器 */
val
.
sec
=
t
;
val
.
usec
=
0
;
rt_kprintf
(
"SetTime: Sec %d, Usec %d
\n
"
,
val
.
sec
,
val
.
usec
);
if
(
rt_device_write
(
dev
,
0
,
&
val
,
sizeof
(
val
))
!=
sizeof
(
val
))
{
rt_kprintf
(
"SetTime Fail
\n
"
);
goto
EXIT
;
}
/* 等待回调函数执行 */
rt_thread_delay
((
t
+
1
)
*
RT_TICK_PER_SECOND
);
EXIT:
EXIT:
err
=
rt_device_close
(
dev
);
err
=
rt_device_close
(
dev
);
rt_kprintf
(
"Close %s
\n
"
,
TIMER
);
rt_kprintf
(
"Close %s
\n
"
,
TIMER
);
return
err
;
return
err
;
}
}
#ifdef FINSH_USING_MSH
FINSH_FUNCTION
_EXPORT
(
hwtimer
,
"Test hardware timer"
);
MSH_CMD
_EXPORT
(
hwtimer
,
"Test hardware timer"
);
#endif
#endif
#endif
/* RT_USING_HWTIMER */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录