Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
HWTIMER_硬件定时器
10
硬件定时器timeout_calc函数
发布于 2023-03-04 13:24:34 浏览:660
订阅该版
[tocm] ### 最近看hwtimer.c中的一个函数有个没理解到位的地方,请教一下大家 ```rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv)``` 这个函数中有如下一段代码不太理解: ``index``在开始时初始化为0,``timeout = tv_sec/i``;中的`i`不是会成为`0`吗,除0不异常了吗,还是说首次执行if ``(devi > devi_min)``不可能成立呢? ``` int i, index = 0; ``` ``` if (devi > devi_min) { i = index; timeout = tv_sec/i; break; } ``` 以下是该函数的一个注释: ``` /* * 该函数根据给定的时间值计算出相应的硬件定时器计数器值来作为超时值。 * 输入参数为指向硬件定时器结构体和时间值结构体的指针。 */ rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv) { float overflow; // 基于时钟频率和最大计数值计算出的定时器最大可能计数器值 float timeout; // 超时值,单位为秒 rt_uint32_t counter; // 以硬件定时器计数器值计算的超时值 int i, index = 0; // 定时器整数分频值 float tv_sec; // 以秒为单位表示的时间值 float devi_min = 1; // 实际超时值与期望超时值之间的最小偏差 float devi; // 实际超时值与期望超时值之间的偏差 /* 计算定时器最大计数时间 S*/ overflow = timer->info->maxcnt/(float)timer->freq; /* 将时间值从秒和微秒转换为以秒为单位的浮点数 S */ tv_sec = tv->sec + tv->usec/(float)1000000; /* 如果时间值小于定时器周期,将超时值设置为定时器周期并返则回相应的计数器值 */ if (tv_sec < (1/(float)timer->freq)) { i = 0; timeout = 1/(float)timer->freq; } /* 如果时间值大于或等于定时器周期 */ else { /* 开始循环以查找实现期望超时值的最佳整数分频值 */ for (i = 1; i > 0; i ++) { // 计算当前周期下的超时时间 S timeout = tv_sec/i; /* 检查计算出的超时值是否在定时器最大可能计数器值之内 */ if (timeout <= overflow) { // 计算当前周期下的计数器值 counter = (rt_uint32_t)(timeout * timer->freq); // 计算当前周期下的误差 devi = tv_sec - (counter / (float)timer->freq) * i; /* 如果实际超时值与期望超时值之间的偏差大于最小偏差,则退出循环 */ if (devi > devi_min) { i = index; timeout = tv_sec/i; break; } /* 如果实际超时值与期望超时值之间的偏差为0,则退出循环 */ else if (devi == 0) { break; } /* 如果实际超时值与期望超时值之间的偏差小于最小偏差,则更新最小偏差和整数分频值 */ else if (devi < devi_min) { devi_min = devi; index = i; } } } } /* 根据所选整数分频值设置硬件定时器结构体的周期、重装载和周期秒数值 */ timer->cycles = i; timer->reload = i; timer->period_sec = timeout; /* 根据超时值计算相应的硬件定时器计数器值 */ counter = (rt_uint32_t)(timeout * timer->freq); /* 返回相应的计数器值 */ return counter; } ```
查看更多
2
个回答
默认排序
按发布时间排序
月桂树GG_lwg
2023-03-04
这家伙很懒,什么也没写!
```c for (i = 1; i > 0; i ++) { // 计算当前周期下的超时时间 S timeout = tv_sec/i; } ``` 这里i是从1开始的
三刀流佩奇
2024-12-04
这家伙很懒,什么也没写!
是需要与硬件定时器结合着看:定时器分频后的时钟频率为1MHz,16位的计数器,定时器的最大溢出时间为0.065535s。所以,代码中devi值是不会大于1的;
撰写答案
登录
注册新账号
关注者
0
被浏览
660
关于作者
rv666
用GDB调试人生
提问
9
回答
62
被采纳
9
关注TA
发私信
相关问题
1
请问HWTIMER设备支持计数模式吗
2
HWTIMER 设备没有计数模式吗
3
ART-Pi开发板,新建Wifi示例工程,打开hwtimer就42个错误?
4
求助:使用HWTIMER timer13的问题
5
使用menuconfig 使能硬件定时器的驱动,使能PWM 编码器等,编译错误
6
STM32H743 的硬件定时器是不是是不是没有晚上
7
硬件定时器如何实现us,ms级定时功能
8
纳秒级的高精度定时器在RTT中的实现
9
HWTIMER设备TIM2_CONFIG函数要自己手动添加?F407ZGT6
10
【已解决】STMF103ZE定时器hwtimer 定时时间为us的时候不准确
推荐文章
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组件
最新文章
1
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部