0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【英飞凌开发板模块评测任务大挑战】硬件定时器的使用

冬至子 来源:chejia12 作者:chejia12 2023-08-11 17:25 次阅读

4.硬件定时器的使用和学习

这里依然使用mdk的看法环境,使用mdk编译程序,下载程序

4.1配置使能硬件定时器2

1.jpg

4.2 编写定时器的测试函数

/*

程序清单:这是一个 hwtimer 设备使用例程
例程导出了 hwtimer_sample 命令到控制终端
命令调用格式:hwtimer_sample
程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。
/
#include
#include
#define HWTIMER_DEV_NAME "time2" /
定时器名称 /
/
定时器超时回调函数 /
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
rt_kprintf("this is hwtimer timeout callback fucntion!n");
rt_kprintf("tick is :%d !n", rt_tick_get());
return 0;
}
int hwtimer_sample(void)
{
rt_err_t ret = RT_EOK;
rt_hwtimerval_t timeout_s; /
定时器超时值 /
rt_device_t hw_dev = RT_NULL; /
定时器设备句柄 /
rt_hwtimer_mode_t mode; /
定时器模式 /
rt_uint32_t freq = 10000; /
计数频率 /
/
查找定时器设备 /
hw_dev = rt_device_find(HWTIMER_DEV_NAME);
if (hw_dev == RT_NULL)
{
rt_kprintf("hwtimer sample run failed! can't find %s device!n", HWTIMER_DEV_NAME);
return RT_ERROR;
}
/
以读写方式打开设备 /
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open %s device failed!n", HWTIMER_DEV_NAME);
return ret;
}
/
设置超时回调函数 /
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/
设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) /
rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
/
设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)/
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 :%dn", ret);
return ret;
}
/
设置定时器超时值为5s并启动定时器 /
timeout_s.sec = 5; /
/
timeout_s.usec = 0; /
微秒 /
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
rt_kprintf("set timeout value failedn");
return RT_ERROR;
}
/
延时3500ms /
rt_thread_mdelay(3500);
/
读取定时器当前值 /
rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s));
rt_kprintf("Read: Sec = %d, Usec = %dn", timeout_s.sec, timeout_s.usec);
return ret;
}
/
导出到 msh 命令列表中 */
MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample);

4.3测试函数,查看运行结果

1.jpg

4.4硬件定时器设备驱动框架学习

使用方法:

4.4.1实现定时器的各个操作函数

/*

  1. 定时器 初始化函数
  2. 定时器起始函数
  3. 定时器停止函数
  4. 定时器的计数值获取
  5. 定时器的控制函数
    */
    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);
    };
    4.4.2配置定时器的基本参数
    /
    定时器特征描述 Timer Feature Information /
    struct rt_hwtimer_info
    {
    rt_int32_t maxfreq; /
    最大频率 the maximum count frequency timer support /
    rt_int32_t minfreq; /
    最小频率 the minimum count frequency timer support /
    rt_uint32_t maxcnt; /
    最大计数 值counter maximum value /
    rt_uint8_t cntmode; /
    计数方向 count mode (inc/dec) */
    };
    typedef struct rt_hwtimer_device
    {
    struct rt_device parent;//基本设备驱动框架
    const struct rt_hwtimer_ops *ops;//定时器特有的操作函数
    const struct rt_hwtimer_info info;//定时器相关的参数信息
    rt_int32_t freq; /
    用户设置的计数频率 counting frequency set by the user /
    rt_int32_t overflow; /
    定时器溢出 timer overflows /
    float period_sec;
    rt_int32_t cycles; /
    溢出后将生成超时事件多少次 how many times will generate a timeout event after overflow /
    rt_int32_t reload; /
    重新加载循环(使用周期模式) reload cycles(using in period mode) /
    rt_hwtimer_mode_t mode; /
    计时模式(一次/周期) timing mode(oneshot/period) /
    } rt_hwtimer_t;
    4.4.3注册定时器的设备到驱动框架
    /

    定时器设备注册函数
    */
    rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data);

4.4.4详细的定时器设备驱动相关

/*

Copyright (c) 2006-2023, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
/
#ifndef HWTIMER_H
#define HWTIMER_H
#include
#ifdef __cplusplus
extern "C" {
#endif
/
定时器的控制命令类型 /
typedef enum
{
HWTIMER_CTRL_FREQ_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x01, /
设置技术的频率set the count frequency /
HWTIMER_CTRL_STOP = RT_DEVICE_CTRL_BASE(Timer) + 0x02, /
停止定时器stop timer /
HWTIMER_CTRL_INFO_GET = RT_DEVICE_CTRL_BASE(Timer) + 0x03, /
获取计时器功能信息 get a timer feature information /
HWTIMER_CTRL_MODE_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x04 /
设置定时器的工作模式 Setting the timing mode(oneshot/period) /
} rt_hwtimer_ctrl_t;
/
Timing Mode /
typedef enum
{
HWTIMER_MODE_ONESHOT = 0x01,//单次模式
HWTIMER_MODE_PERIOD//周期模式
} rt_hwtimer_mode_t;
/
Time Value /
typedef struct rt_hwtimerval
{
rt_int32_t sec; /
秒 second /
rt_int32_t usec; /
微秒 microsecond /
} rt_hwtimerval_t;
/ 计数的方向 /
#define HWTIMER_CNTMODE_UP 0x01 /
increment count mode /
#define HWTIMER_CNTMODE_DW 0x02 /
decreasing count mode /
struct rt_hwtimer_device;
/

  1. 定时器 初始化函数
  2. 定时器起始函数
  3. 定时器停止函数
  4. 定时器的计数值获取
  5. 定时器的控制函数
    */
    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);
    };
    /
    定时器特征描述 Timer Feature Information /
    struct rt_hwtimer_info
    {
    rt_int32_t maxfreq; /
    最大频率 the maximum count frequency timer support /
    rt_int32_t minfreq; /
    最小频率 the minimum count frequency timer support /
    rt_uint32_t maxcnt; /
    最大计数 值counter maximum value /
    rt_uint8_t cntmode; /
    计数方向 count mode (inc/dec) */
    };
    typedef struct rt_hwtimer_device
    {
    struct rt_device parent;//基本设备驱动框架
    const struct rt_hwtimer_ops *ops;//定时器特有的操作函数
    const struct rt_hwtimer_info info;//定时器相关的参数信息
    rt_int32_t freq; /
    用户设置的计数频率 counting frequency set by the user /
    rt_int32_t overflow; /
    定时器溢出 timer overflows /
    float period_sec;
    rt_int32_t cycles; /
    溢出后将生成超时事件多少次 how many times will generate a timeout event after overflow /
    rt_int32_t reload; /
    重新加载循环(使用周期模式) reload cycles(using in period mode) /
    rt_hwtimer_mode_t mode; /
    计时模式(一次/周期) timing mode(oneshot/period) /
    } rt_hwtimer_t;
    /

    定时器设备注册函数
    */
    rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data);
    / 定时器回调函数 /
    void rt_device_hwtimer_isr(rt_hwtimer_t *timer);
    #ifdef __cplusplus
    }
    #endif
    #endif
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    52

    文章

    8133

    浏览量

    145890
  • 定时器
    +关注

    关注

    23

    文章

    3235

    浏览量

    114379
  • 计时器
    +关注

    关注

    1

    文章

    417

    浏览量

    32622
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11537
  • RT-Thread
    +关注

    关注

    31

    文章

    1266

    浏览量

    39871
收藏 人收藏

    评论

    相关推荐

    如何利用STM32L475开发板去处理定时器捕获模块应用程序

    我想在捕获模块上进行测试,以找出实际应用中定时器引脚处到达脉冲的脉冲宽度。所以,在这里我想要一个 STM32L475 的开发板来处理这个应用程序,比如从一个定时器 PWM 生成脉冲并循
    发表于 12-23 09:08

    【实验38】定时器定时

    HL配套C实验例程100例之定时器定时,配合开发板学习效果更好。
    发表于 04-11 16:09 7次下载

    HL配套C实验例程定时器

    HL配套C实验例程定时器,配合开发板学习效果更好。
    发表于 04-11 17:04 2次下载

    基于MCU的模块定时器的详细解析

    在MCU中(M16),定时器是独立的一个模块,M16有三个独立的定时器模块,即T/C0、T/C1和T/C2;其中T/C0和T/C2都是8位的定时器
    的头像 发表于 01-16 09:42 1.1w次阅读

    新唐 NuMaker-M2354模块评测任务挑战

    评测任务挑战活动,让开发者小伙伴们互相协作,对开发板的每个模块功能进行
    的头像 发表于 11-16 16:42 1290次阅读

    基于硬件定时器的软件定时器

    概括硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源。梳理讲到
    发表于 11-25 09:51 8次下载
    基于<b class='flag-5'>硬件</b><b class='flag-5'>定时器</b>的软件<b class='flag-5'>定时器</b>

    基于cubemx的stm32开发之路(使用正点原子战舰V3开发板)——基本定时器的应用

    1hz的闪烁实验设备正点原子新战舰V3 STM32F103ZET6开发板学习st-link烧录定时器原理F103定时器组成STM32F1
    发表于 12-08 15:21 5次下载
    基于cubemx的stm32<b class='flag-5'>开发</b>之路(使用正点原子战舰V3<b class='flag-5'>开发板</b>)——基本<b class='flag-5'>定时器</b>的应用

    MM32F0140定时器模块计数定时功能

    本篇笔记主要探讨 MM32F0140 定时器模块的框图结构、定时器提供的计数定时等功能以及配置定时器的流程,并以 pokt-f0140
    的头像 发表于 04-07 16:31 2675次阅读
    MM32F0140<b class='flag-5'>定时器</b><b class='flag-5'>模块</b>计数<b class='flag-5'>定时</b>功能

    Linux驱动开发高精度定时器的精度测量评测

    正点原子的示波器能不能支撑嵌入式开发流程。 Linux高精度定时器说明 其实传统的低分辨率定时器随着技术的演进,已经无法满足开发需求。而且硬件
    的头像 发表于 08-09 11:17 2007次阅读

    【合宙Air105开发板试用体验】小小定时器,能有大作用!

    本文来源电子发烧友社区,作者:HonestQiao, 帖子地址: https://bbs.elecfans.com/jishu_2283057_1_1.html 案例演示(开发板体验视频,详见作者
    的头像 发表于 12-02 15:02 834次阅读

    N32L40XCL-STB 开发板模块评测任务挑战

    评测任务挑战活动,让开发者小伙伴们互相协作,对开发板的每个模块功能进行
    的头像 发表于 03-28 03:25 831次阅读

    英飞凌开发板模块评测任务挑战

    ?RT-Thread 官方特联合合作伙伴发起开发板评测任务挑战活动,让开发者小伙伴们互相协作,对开发板
    的头像 发表于 04-11 09:05 853次阅读

    英飞凌开发板模块评测任务挑战-SPI驱动测试

    使用PSoC™ 62 with CAPSENSE™ evaluation kit开发板适配的RTT SPI驱动,做显示测试。
    发表于 08-10 15:44 671次阅读
    <b class='flag-5'>英飞凌</b><b class='flag-5'>开发板</b><b class='flag-5'>模块</b><b class='flag-5'>评测</b><b class='flag-5'>任务</b>大<b class='flag-5'>挑战</b>-SPI驱动测试

    定时器中断程序怎么写

    达到预定的定时时间时,它会产生一个中断信号,称为定时器中断。在本文中,我们将详细了解如何编写定时器中断程序。 #1. 硬件配置 在开始编写定时器
    的头像 发表于 09-01 10:17 1891次阅读

    英飞凌开发板模块评测任务挑战】mdk开发板环境搭建

    在rtt源码内部生成英飞凌芯片的独立的工程
    的头像 发表于 10-27 12:39 796次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>开发板</b><b class='flag-5'>模块</b><b class='flag-5'>评测</b><b class='flag-5'>任务</b>大<b class='flag-5'>挑战</b>】mdk<b class='flag-5'>开发板</b>环境搭建