打印
[STM32F1]

常规定时器实现延时

[复制链接]
1570|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maudlu|  楼主 | 2024-4-29 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器实现的思路也比较简单,定时器一般有ms定时和us定时,我们可以先初始化两个定时器,一个配置成1ms定时,一个配置成1us定时。

以下以us级定时器为例说明如何基于定时器编写延时函数。

实现微秒级延时
void TIM3Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);               //开启时钟

    TIM_TimeBaseInitStruct.TIM_Period = 0xffff;                        //装载计数值
    TIM_TimeBaseInitStruct.TIM_Prescaler = 42 - 1;              //装载预分频值,1us
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;    //预分频值为1
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数方式

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);            //进行定时器配置       

    TIM_Cmd(TIM3, ENABLE);        //使能TIMx外设
}

// 微秒延时
void delay_us(uint16_t us)
{
        u16 tp1;
        u16 tp2;
        u16 dif;
       
        tp1 = TIM3->CNT;
        while(1)
        {
                tp2 = TIM3->CNT;
                dif = tp2 - tp1;
                if(dif >= us)
                        break;
        }
}

使用特权

评论回复
沙发
geraldbetty| | 2024-5-1 21:45 | 只看该作者
延时时间的准确性对于某些应用来说非常重要。

使用特权

评论回复
板凳
jonas222| | 2024-5-2 14:49 | 只看该作者
根据系统的实时性要求合理设置定时器中断的优先级。如果有多个中断源,需要考虑它们之间的优先级关系,以避免中断冲突。

使用特权

评论回复
地板
uptown| | 2024-5-2 19:24 | 只看该作者
当高优先级中断发生时,低优先级中断会被挂起。因此,在中断服务例程中,如果需要执行较长时间的操作,应当考虑将其放入线程或任务中,以免阻塞其他中断的处理。

使用特权

评论回复
5
youtome| | 2024-5-3 09:14 | 只看该作者
时钟源的稳定性直接影响定时器的精度。如果时钟源存在较大的波动,可能需要采取额外措施来补偿这种不稳定性。

使用特权

评论回复
6
chenci2013| | 2024-5-4 20:37 | 只看该作者
使用定时器中断来实现延时,请确保正确配置中断优先级、事件处理函数等

使用特权

评论回复
7
fengm| | 2024-5-6 12:50 | 只看该作者
预分频器决定了系统时钟分频后的频率,而自动重载值则决定了定时器计数的最大值。

使用特权

评论回复
8
pentruman| | 2024-5-6 22:13 | 只看该作者
定时器延时的精度和误差可能受到多种因素的影响,如时钟频率、预分频器设置、计数器值等。

使用特权

评论回复
9
jackcat| | 2024-5-7 19:50 | 只看该作者
如果使用中断方式实现延时,正确配置中断使能、中断优先级以及中断服务程序。

使用特权

评论回复
10
mmbs| | 2024-5-8 17:58 | 只看该作者
定时器的时钟配置正确无误,包括主时钟源和预分频器的设置,这将直接影响定时器的精度。

使用特权

评论回复
11
Henryko| | 2024-5-8 21:53 | 只看该作者
定时器的精度是不是取决于晶振精度啊

使用特权

评论回复
12
modesty3jonah| | 2024-5-9 11:37 | 只看该作者
如果需要高精度且低功耗的延时,可以考虑使用STM32内置的实时时钟(RTC)模块

使用特权

评论回复
13
houjiakai| | 2024-5-9 16:24 | 只看该作者
对于简单的应用场景,可以使用循环来实现延时

使用特权

评论回复
14
qiufengsd| | 2024-5-10 11:25 | 只看该作者
STM32中有多种类型的定时器,如基本定时器、通用定时器和高级定时器,它们的功能和特点各不相同。

使用特权

评论回复
15
mickit| | 2024-5-10 15:07 | 只看该作者
需要正确配置定时器的时钟源、预分频器和自动重装载寄存器,以确保定时器能够在预定的时间后溢出并触发中断或更新事件。

使用特权

评论回复
16
yorkbarney| | 2024-5-10 19:50 | 只看该作者
定时器延时的精度和误差可能受到多种因素的影响,如时钟频率、预分频器设置、计数器值等。

使用特权

评论回复
17
jtracy3| | 2024-5-12 10:54 | 只看该作者
定时器的精度受到系统时钟的影响,如果系统时钟频率波动较大,可能影响定时器的准确性。在某些情况下,可能需要使用更高精度的时钟源来提高定时器的精度。

使用特权

评论回复
18
Bowclad| | 2024-5-12 20:50 | 只看该作者
可以用滴答定时器实现,更节省资源

使用特权

评论回复
19
bartonalfred| | 2024-5-13 23:07 | 只看该作者
可以不断检查TIM4的更新标志位,直到达到预设的延时时间。

使用特权

评论回复
20
yorkbarney| | 2024-5-14 16:11 | 只看该作者
在多任务系统中,定时器延时可能会与其他任务产生冲突。

使用特权

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

本版积分规则

28

主题

1337

帖子

0

粉丝