打印
[应用相关]

通用定时器实现us微秒延时

[复制链接]
626|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zerorobert|  楼主 | 2021-8-4 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为了获取精确延时,STM32芯片中往往会使用内核中的嘀嗒时钟Systick作为参考时钟。当嘀嗒时钟被占用做其他用途时,比如RTOS中的节拍器;就需要采用其他方法进行延时。

  这里提出一种采用通用定时器作为延时的参考时钟的方法。

  首先选择基础定时器即可,配置定时器参数,主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位,由于TIM2的时钟为84MHz,所有TIM2_PSC设置为84,即每一次计数对应1us。另外,这里计数器采用向下计数,便于程序判断。
void Delay_Timer_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
    TIM_TimeBaseInitStruct.TIM_Period = 100-1;
    TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1);
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

    while((TIM3->SR & TIM_FLAG_Update)!=SET);
    TIM3->SR = (uint16_t)~TIM_FLAG_Update;
}
 延时函数如下,对CNT寄存器赋延时值,然后通过判断Update标志位进行阻塞延时。
void Delay_us(uint32_t us_cnt)
{
    TIM3->CNT = us_cnt-1;
    TIM3->CR1 |= TIM_CR1_CEN;
    while((TIM3->SR & TIM_FLAG_Update)!=SET);
    TIM3->SR = (uint16_t)~TIM_FLAG_Update;
    TIM3->CR1 &= ~TIM_CR1_CEN;
}


使用特权

评论回复
沙发
sadicy| | 2021-8-5 09:53 | 只看该作者
主要关注预分频器寄存器TIMx_PSC,它的大小决定了延时的最小单位
就记住了这一句话

使用特权

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

本版积分规则

35

主题

1495

帖子

0

粉丝