2524|6

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

RT-thread studio 关于硬件定时器计数的问题 [复制链接]

 

环境:RTT中配置了硬件时钟,计数频率是1MHZ,向上计数,最大计数为0xFFFF

测试步骤:

1.定时器触发模式为周期触发,定时器时间为100US,当定时器超时,进入回调中,读取计数器的值

A.   

     /* 设置模式为周期性定时器 */
    mode = HWTIMER_MODE_PERIOD;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }
B.

/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */

    /* 读取定时器当前值 */
    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    rt_kprintf("Read: Usec = %d\n", timeout_s.usec);
    return 0;
}

打印结果为:

Read: Usec = 536656
Read: Usec = 536719
Read: Usec = 536881
Read: Usec = 536942
2.

定时器触发模式为周期触发,定时器时间为100US,当定时器超时,进入回调中,读取计数器的值并重新设置定时器的超时时间为100US

A.   

     /* 设置模式为周期性定时器 */
    mode = HWTIMER_MODE_PERIOD;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }
B.

/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */

    /* 读取定时器当前值 */
    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    rt_kprintf("Read: Usec = %d\n", timeout_s.usec);

 

    /* 设置定时器超时值为100us并启动定时器 */
    timeout_s.sec = 0;      /* 秒 */
    timeout_s.usec = 100;     /* 微秒 */
    rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    return 0;
}

打印结果为:

Read: Usec = 103
Read: Usec = 103
Read: Usec = 103
Read: Usec = 103

3.

定时器触发模式单次触发,定时器时间为100US,当定时器超时,进入回调中,读取计数器的值并重新设置定时器的超时时间为100US

A.   

     /* 设置模式为单次定时器 */
    mode = HWTIMER_MODE_ONESHOT;
    ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
    if (ret != RT_EOK)
    {
        rt_kprintf("set mode failed! ret is :%d\n", ret);
        return ret;
    }
B.

/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
    rt_hwtimerval_t timeout_s;      /* 定时器超时值 */

    /* 读取定时器当前值 */
    rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    rt_kprintf("Read: Usec = %d\n", timeout_s.usec);

 

    /* 设置定时器超时值为100us并启动定时器 */
    timeout_s.sec = 0;      /* 秒 */
    timeout_s.usec = 100;     /* 微秒 */
    rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s));
    return 0;
}

打印结果为:

Read: Usec = 100
Read: Usec = 100
Read: Usec = 100
Read: Usec = 100

问:以上三次的测试步骤,导致的结果不同的原因是?

注:希望可以详细的解释清楚并给我合理的代码建议

最新回复

我在想呀,你用printf是不是对打印有影响,能不能用IO翻转,用示波器来测量。这样更准确,也排除其他干扰。   详情 回复 发表于 2022-4-15 15:14
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
本帖最后由 lugl4313820 于 2022-4-15 09:31 编辑

非常感谢您的提问:

三种结果不同,是因为定时器的设计问题,

第一种的时间是软件定时器,以系统系统的启动时间为基准,超时回调打印的是系统启动时间,你可以把第二次减去第一次的时间,结果差不多是100左右。

第二种、第三种是硬件定时器,为什么第二次,周期那里多了3个,那是因为到你多了走了几步,所以多出3个节拍。

希望对你有帮助,B站看看定时器那篇教材,非常有必要看一遍。

点评

第一种软件定时器时间不太准,我算了一下,大概在70左右,差的有点大,按道理不应该。  详情 回复 发表于 2022-4-15 11:01
 
 
 

回复

6960

帖子

11

TA的资源

版主

板凳
 

请问你是要这定时器实现什么功能列?如果要求不是很高这应该可以了,第二个就3个微秒。

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

4
 
lugl4313820 发表于 2022-4-15 09:14 非常感谢您的提问: 三种结果不同,是因为定时器的设计问题, 第一种的时间是软件定时器,以系统系统 ...

感谢您的回复

 

点评

现在在公司里面,晚上回去,我用硬件跑一下,再具体答复你。因为用的单片机太多了,一时也记不住。  详情 回复 发表于 2022-4-15 09:46
 
 
 

回复

6960

帖子

11

TA的资源

版主

5
 

现在在公司里面,晚上回去,我用硬件跑一下,再具体答复你。因为用的单片机太多了,一时也记不住。

 
 
 

回复

7158

帖子

2

TA的资源

版主

6
 
lugl4313820 发表于 2022-4-15 09:14 非常感谢您的提问: 三种结果不同,是因为定时器的设计问题, 第一种的时间是软件定时器,以系统系统 ...

第一种软件定时器时间不太准,我算了一下,大概在70左右,差的有点大,按道理不应该。

 
 
 

回复

6960

帖子

11

TA的资源

版主

7
 

我在想呀,你用printf是不是对打印有影响,能不能用IO翻转,用示波器来测量。这样更准确,也排除其他干扰。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
常用网络命令

常用网络命令 计算机网络的主要优点是能够实 ...

运放稳定性-(第五第六部分)

本帖最后由 dontium 于 2015-1-23 12:49 编辑 第五部分-单电源缓冲器的实际设计 第六部分-电容性负载稳定性

ccs5和ccs4中文教程

新手分享点资料给大家,当新手间的相互帮助吧

【LPC54100】双核的引导

本帖最后由 freebsder 于 2015-3-8 02:32 编辑 freebsder发于www.eeworld.com.cn,如需转载或转发请保留此行声明。 板子还 ...

F7-老人紧急呼救组-进度规划

本帖最后由 arthasarthas 于 2015-12-24 16:19 编辑 项目英雄帖: https://bbs.eeworld.com.cn/thread-471640-1-1.html 项 ...

【TI课程】PFC电源设计与电感设计计算

请问下这个课程,全课程在哪里学习呢

谁清楚嵌入式OS的标准吗?RTthread过了GJB7718-2012和GJB7706-2012可以说明什么问...

刚刚看新闻,说是RTthread过了GJB7718-2012和GJB7706-2012。 这两个军标和其他行业标准,例如了医疗认证 IEC-62304 Class C, ...

【平头哥RVB2601创意应用开发】第四篇 声音直方图

本篇测评实验的内容是将声音播放和显示结合起来,播放声音的同时屏幕同时显示声音强度的直方图。 先上视频,再解释实现方 ...

【得捷电子Follow me第1期】作品提交 - 温湿度计和网络时钟(开机播放生日快乐歌)

本帖最后由 walker2048 于 2023-6-30 20:29 编辑 作品提交 - 温湿度计和网络时钟 展示视频 项目介绍 介绍: 本 ...

有做汽车EMC方面工作的吗?求经验!

我最近在弄产品EMC整改方面的工作,现在RE方面有几处微微超标一点点降不下来。手里只有一个200MHz的示波器,有的超标信号在示波 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表