[STM32F1] 定时器实现延时函数

[复制链接]
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); // 如果之前使用了中断方式  
}  
pmp 发表于 2024-10-24 19:37 | 显示全部楼层
STM32 的定时器是基于计数器实现的。定时器内部有一个计数器,它按照一定的时钟频率进行计数。通过设置计数器的初始值、计数模式和预分频系数等参数,可以控制定时器的定时周期。
ingramward 发表于 2024-10-25 08:43 | 显示全部楼层
使用的是不同的STM32系列或不同的库(如LL库),代码可能需要相应地调整。
biechedan 发表于 2024-10-25 09:38 | 显示全部楼层
使用了轮询方式来等待定时器计数完成。这种方法虽然简单,但在等待期间会占用CPU资源。
deliahouse887 发表于 2024-10-25 10:32 | 显示全部楼层
在STM32微控制器中,定时器是一种非常强大的外设,可以用来实现精确的时间控制,包括延时函数。
lihuami 发表于 2024-10-25 12:30 | 显示全部楼层
大多数STM32系列都有多个定时器可供选择。
ccook11 发表于 2024-10-25 14:43 | 显示全部楼层
在STM32中,可以使用硬件定时器来实现延时函数。STM32的定时器功能强大,可以用来生成精确的时间间隔。
桃醉 发表于 2024-10-25 17:36 | 显示全部楼层
不就是一个延时函数吗?使用滴答定时器进行延时的,搞得这么神秘
在曼谷的春 发表于 2024-11-6 10:38 | 显示全部楼层
如果需要更详细的结果输出,可以通过串口打印将 TimeWidthAvrage 转换为时间单位并输出
朝生 发表于 2024-11-6 12:57 | 显示全部楼层
基于stm32,hal库中定时器实现延时功能的例子。
Pretext 发表于 2024-11-6 21:40 | 显示全部楼层
多次重复延迟功能的测试,观察其在不同条件下的性能。,
失物招領 发表于 2024-11-7 01:00 | 显示全部楼层
要通过调试方法查看检测结果,特别是通过调试器观察变量的变化情况,可以点击菜单栏中的 Run -> Debug Configurations。选择你的调试配置(例如,STM32 Cortex-M C/C++ Application),然后点击 Debug 按钮
她已醉 发表于 2024-11-7 02:00 | 显示全部楼层
添加变量到Watch窗口在调试界面中,添加变量到Watch窗口
温室雏菊 发表于 2024-11-7 03:00 | 显示全部楼层
在调试界面中,找到 Variables 或 Expressions 窗口。右键点击 Variables 或 Expressions 窗口,选择 Add Watch Expression。输入变量名 Time 或 TimeWidthAvrage,然后点击 OK
未说出口的像你 发表于 2024-11-7 04:00 | 显示全部楼层
点击调试工具栏中的 Resume 按钮(通常是一个绿色的三角形),或者按 F8 键
我吃小朋友 发表于 2024-11-7 05:00 | 显示全部楼层
在程序运行过程中,观察 TimeWidthAvrage 变量的变化:在 Variables 或 Expressions 窗口中,可以看到 TimeWidthAvrage 的值。当程序执行到 Delay_us(1000) 时,记录 TimeWidthAvrage 的值
将爱藏于深海 发表于 2024-11-7 06:00 | 显示全部楼层
根据 TimeWidthAvrage 的值计算 Delay_us(1000) 的执行时间:TimeWidthAvrage 的值为 0x119B8,转换为十进制为 72120。滴答定时器的一个滴答为 1/72M 秒。因此,Delay_us(1000) 的执行时间为 72120 * 1/72M (s) = 0.001001s,即 1ms
一只眠羊 发表于 2024-11-7 07:00 | 显示全部楼层
如果你希望通过串口打印结果,可以按照以下步骤进行:确保你的STM32微控制器已经配置了串口,并且可以与PC通信。在代码中添加串口打印功能,将 TimeWidthAvrage 转换为时间单位(如 us、ms、s)并打印出来
春日负喧 发表于 2024-11-7 08:00 | 显示全部楼层
确保在 main.c 中正确配置了UART,并且 huart2 已经初始化。这样就可以打印啦
月亮一键变蓝 发表于 2024-11-7 09:00 | 显示全部楼层
通过调试方法可以直观地观察变量的变化情况,验证 Delay_us(1000) 的执行时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部