Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
硬件定时器
【英飞凌开发板模块评测任务大挑战】-4-硬件定时器的使用
发布于 2023-05-04 12:08:11 浏览:306
订阅该版
[tocm] # 4.硬件定时器的使用和学习 代码托管地址:[RTT_CY8C624ALQALQI: RTT_CY8C624ALQALQI RT_thread联合英飞凌联合开发mcu双核开发板 (gitee.com)](https://gitee.com/chejia12/rtt_-cy8-c624-alqalqi) 这里依然使用mdk的看法环境,使用mdk编译程序,下载程序 ## 4.1配置使能硬件定时器2 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230504/efc730fb3469431e0f6726316e6b524b.png) ## 4.2 编写定时器的测试函数 ```c /* * 程序清单:这是一个 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 :%d\n", 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 failed\n"); 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 = %d\n", timeout_s.sec, timeout_s.usec); return ret; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); ``` ## 4.3测试函数,查看运行结果 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230504/440313dc056d3ded9b05ff3ce4970b7c.png) ## 4.4硬件定时器设备驱动框架学习 使用方法: ### 4.4.1实现定时器的各个操作函数 ```c /* 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配置定时器的基本参数 ```c /* 定时器特征描述 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注册定时器的设备到驱动框架 ```c /* 定时器设备注册函数 */ rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data); ``` ### 4.4.4详细的定时器设备驱动相关 ```c /* * 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 ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
chejia12
这家伙很懒,什么也没写!
文章
6
回答
0
被采纳
0
关注TA
发私信
相关文章
1
rt-thread 任务调度使用的是stm32的哪个硬件定时器作为心跳
2
官方的定时器案例死机
3
硬件定时器hwtimer的CNT值出现问题
4
STM32F407VG启动硬件定时器系统忙类死机
5
硬件定时器是否会影响任务切换?
6
RT_TIMER里面分了HARD和SOFT类型,本质有啥区别
7
STM32H7打开硬件定时器后编译错误问题?
8
stm32硬件定时器,为什么只有tim3\11\13\14呢?
9
统计脉冲的频率几种方式
10
硬件定时器如何配置固定频率
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部