打印
[STM32F1]

定时器实现延时函数

[复制链接]
楼主: alvpeg
手机看帖
扫描二维码
随时随地手机跟帖
21
backlugin| | 2024-10-23 21:50 | 只看该作者 回帖奖励 |倒序浏览

// 延时函数,参数ms表示毫秒数  
void Delay_ms(uint32_t ms) {  
    // 计算定时器需要计数的值(考虑预分频器)  
    __HAL_TIM_SET_COUNTER(&htim2, 0); // 重置计数器  
    uint32_t ticks = (HAL_RCC_GetPCLK1Freq() / 1000) * ms / (htim2.Init.Prescaler + 1);  
  
    // 启动定时器  
    HAL_TIM_Base_Start_IT(&htim2); // 使用中断方式(可选,也可以使用轮询)  
  
    // 如果使用轮询方式,则等待计数器达到设定的值  
    while (__HAL_TIM_GET_COUNTER(&htim2) < ticks) {  
        // 可以在这里添加其他代码,但注意不要阻塞太久  
    }  
  
    // 停止定时器  
    HAL_TIM_Base_Stop_IT(&htim2); // 如果之前使用了中断方式  
}  

使用特权

评论回复
22
pmp| | 2024-10-24 19:37 | 只看该作者
STM32 的定时器是基于计数器实现的。定时器内部有一个计数器,它按照一定的时钟频率进行计数。通过设置计数器的初始值、计数模式和预分频系数等参数,可以控制定时器的定时周期。

使用特权

评论回复
23
ingramward| | 2024-10-25 08:43 | 只看该作者
使用的是不同的STM32系列或不同的库(如LL库),代码可能需要相应地调整。

使用特权

评论回复
24
biechedan| | 2024-10-25 09:38 | 只看该作者
使用了轮询方式来等待定时器计数完成。这种方法虽然简单,但在等待期间会占用CPU资源。

使用特权

评论回复
25
deliahouse887| | 2024-10-25 10:32 | 只看该作者
在STM32微控制器中,定时器是一种非常强大的外设,可以用来实现精确的时间控制,包括延时函数。

使用特权

评论回复
26
lihuami| | 2024-10-25 12:30 | 只看该作者
大多数STM32系列都有多个定时器可供选择。

使用特权

评论回复
27
ccook11| | 2024-10-25 14:43 | 只看该作者
在STM32中,可以使用硬件定时器来实现延时函数。STM32的定时器功能强大,可以用来生成精确的时间间隔。

使用特权

评论回复
28
桃醉| | 2024-10-25 17:36 | 只看该作者
不就是一个延时函数吗?使用滴答定时器进行延时的,搞得这么神秘

使用特权

评论回复
29
在曼谷的春| | 2024-11-6 10:38 | 只看该作者
如果需要更详细的结果输出,可以通过串口打印将 TimeWidthAvrage 转换为时间单位并输出

使用特权

评论回复
30
朝生| | 2024-11-6 12:57 | 只看该作者
基于stm32,hal库中定时器实现延时功能的例子。

使用特权

评论回复
31
Pretext| | 2024-11-6 21:40 | 只看该作者
多次重复延迟功能的测试,观察其在不同条件下的性能。,

使用特权

评论回复
32
失物招領| | 2024-11-7 01:00 | 只看该作者
要通过调试方法查看检测结果,特别是通过调试器观察变量的变化情况,可以点击菜单栏中的 Run -> Debug Configurations。选择你的调试配置(例如,STM32 Cortex-M C/C++ Application),然后点击 Debug 按钮

使用特权

评论回复
33
她已醉| | 2024-11-7 02:00 | 只看该作者
添加变量到Watch窗口在调试界面中,添加变量到Watch窗口

使用特权

评论回复
34
温室雏菊| | 2024-11-7 03:00 | 只看该作者
在调试界面中,找到 Variables 或 Expressions 窗口。右键点击 Variables 或 Expressions 窗口,选择 Add Watch Expression。输入变量名 Time 或 TimeWidthAvrage,然后点击 OK

使用特权

评论回复
35
未说出口的像你| | 2024-11-7 04:00 | 只看该作者
点击调试工具栏中的 Resume 按钮(通常是一个绿色的三角形),或者按 F8 键

使用特权

评论回复
36
我吃小朋友| | 2024-11-7 05:00 | 只看该作者
在程序运行过程中,观察 TimeWidthAvrage 变量的变化:在 Variables 或 Expressions 窗口中,可以看到 TimeWidthAvrage 的值。当程序执行到 Delay_us(1000) 时,记录 TimeWidthAvrage 的值

使用特权

评论回复
37
将爱藏于深海| | 2024-11-7 06:00 | 只看该作者
根据 TimeWidthAvrage 的值计算 Delay_us(1000) 的执行时间:TimeWidthAvrage 的值为 0x119B8,转换为十进制为 72120。滴答定时器的一个滴答为 1/72M 秒。因此,Delay_us(1000) 的执行时间为 72120 * 1/72M (s) = 0.001001s,即 1ms

使用特权

评论回复
38
一只眠羊| | 2024-11-7 07:00 | 只看该作者
如果你希望通过串口打印结果,可以按照以下步骤进行:确保你的STM32微控制器已经配置了串口,并且可以与PC通信。在代码中添加串口打印功能,将 TimeWidthAvrage 转换为时间单位(如 us、ms、s)并打印出来

使用特权

评论回复
39
春日负喧| | 2024-11-7 08:00 | 只看该作者
确保在 main.c 中正确配置了UART,并且 huart2 已经初始化。这样就可以打印啦

使用特权

评论回复
40
月亮一键变蓝| | 2024-11-7 09:00 | 只看该作者
通过调试方法可以直观地观察变量的变化情况,验证 Delay_us(1000) 的执行时间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则