打印
[STM32F1]

定时器实现延时函数

[复制链接]
1340|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2024-9-29 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
View Code
  怎么去看检测结果呢?用调试的办法,打开调试界面后,将Time变量添加到Watch一栏中。然后全速运行程序,既可以看到Time中保存变量的变化情况,其中TimeWidthAvrage就是最终的结果。
  可以看到TimeWidthAvrage的值等于0x119B8,十进制数对应72120,滴答定时器的一个滴答为1/72M(s),所以Delay_us(1000)的执行时间就是72120*1/72M (s) = 0.001001s,也就是1ms。验证成功。
备注:定时器方法输出检测结果有待改善,你可以把得到的TimeWidthAvrage转换成时间(以us、ms、s)为单位,然后通过串口打印出来,不过这部分工作对于经常使用调试的人员来说也可有可无。

使用特权

评论回复
沙发
tpgf| | 2024-10-8 14:16 | 只看该作者
当定时器的计数值达到预设值时,应该触发中断并执行相应的处理函数。检查中断触发的情况,可以判断延时函数是否正确响应了定时器事件。

使用特权

评论回复
板凳
磨砂| | 2024-10-8 17:20 | 只看该作者
确保预置值设置正确是实现准确延时的关键。

使用特权

评论回复
地板
晓伍| | 2024-10-8 18:25 | 只看该作者
过高或过低的时钟频率都可能导致延时不准确。

使用特权

评论回复
5
八层楼| | 2024-10-8 19:33 | 只看该作者
在程序运行时,定时器的计数值会不断更新。通过监控计数值的变化,可以了解定时器是否按照预期工作

使用特权

评论回复
6
观海| | 2024-10-8 20:35 | 只看该作者
多次重复测试延时函数,观察其在不同条件下的表现。

使用特权

评论回复
7
星辰大海不退缩| | 2024-10-8 21:32 | 只看该作者
用调试的办法,打开调试界面后,将Time变量添加到Watch一栏中

使用特权

评论回复
8
guanjiaer| | 2024-10-8 21:47 | 只看该作者
仔细检查延时函数及其相关代码,确保没有逻辑错误或遗漏的处理细节

使用特权

评论回复
9
jackcat| | 2024-10-11 09:00 | 只看该作者
在STM32中,使用定时器实现延时函数是一种常见且精确的方法。

使用特权

评论回复
10
belindagraham| | 2024-10-11 09:50 | 只看该作者
需要考虑定时器的溢出处理、中断的使用以及系统时钟的配置等因素。

使用特权

评论回复
11
plsbackup| | 2024-10-11 12:05 | 只看该作者
设置预分频器和自动重装载寄存器的值以获得所需的定时周期。

使用特权

评论回复
12
geraldbetty| | 2024-10-11 13:25 | 只看该作者
STM32的定时器是可编程的计数器,可以用来产生定时中断、测量输入信号的脉冲长度或者生成输出波形。定时器可以通过配置预分频器和计数器周期来设定定时时间。

使用特权

评论回复
13
hudi008| | 2024-10-11 14:43 | 只看该作者
基于STM32 HAL库的定时器实现延时函数的示例。

使用特权

评论回复
14
burgessmaggie| | 2024-10-11 20:12 | 只看该作者
如果需要更高的精度或更长的延时,可以考虑使用多个定时器或使用SysTick定时器。

使用特权

评论回复
15
Stahan| | 2024-10-13 22:29 | 只看该作者
用滴答定时器比较省资源

使用特权

评论回复
16
hilahope| | 2024-10-16 10:36 | 只看该作者
通过配置定时器的预分频器和计数器周期,可以精确控制定时时间。在本例中,预分频器设置为7199,计数器周期设置为delay - 1,假设系统时钟为72MHz,这样可以实现每1000ms产生一次中断。
中断处理:在定时器中断服务程序中,通过更新全局变量timer_counter来记录中断次数,从而实现延时功能。
延时函数:delay_ms函数通过等待定时器中断次数达到指定的延时时间,实现延时功能。在延时完成后,重置定时器中断次数计数器,并关闭定时器。

使用特权

评论回复
17
jtracy3| | 2024-10-19 10:27 | 只看该作者
如果使用中断方式,则需要在中断处理函数中更新一个全局变量或标志位,然后在Delay_ms函数中检查这个标志位来判断延时是否完成。

使用特权

评论回复
18
jtracy3| | 2024-10-19 14:46 | 只看该作者
延时函数的精度受到定时器时钟源的限制,因此可能不适合需要非常高精度延时的应用。

使用特权

评论回复
19
saservice| | 2024-10-21 16:48 | 只看该作者
在STM32微控制器中,定时器是一种强大的外设,可以用于生成精确的延时。

使用特权

评论回复
20
macpherson| | 2024-10-23 20:07 | 只看该作者
#include "stm32f1xx.h"

// 定时器中断次数计数器
volatile uint32_t timer_counter = 0;

void TIM3_IRQHandler(void) {
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
        // 清除中断标志位
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        
        // 更新定时器中断次数计数器
        timer_counter++;
    }
}

void delay_ms(uint32_t delay) {
    // 设置定时器预分频器和计数器周期
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = delay - 1; // 计数器周期
    TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 预分频器,假设系统时钟为72MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
    // 使能定时器
    TIM_Cmd(TIM3, ENABLE);
   
    // 等待定时器中断次数达到delay
    while(timer_counter < delay) {
        // 空操作
    }
   
    // 重置定时器中断次数计数器
    timer_counter = 0;
   
    // 关闭定时器
    TIM_Cmd(TIM3, DISABLE);
}

int main(void) {
    // 系统初始化
    SystemInit();
   
    // 定时器初始化
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    NVIC_EnableIRQ(TIM3_IRQn);
   
    // 无限循环
    while(1) {
        // 延时1000ms
        delay_ms(1000);
        
        // 在这里添加需要执行的代码
    }
}

使用特权

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

本版积分规则

33

主题

1505

帖子

0

粉丝