当前位置:   article > 正文

STM32不使用中断实现定时器微秒级精确延时

STM32不使用中断实现定时器微秒级精确延时

我们在写代码的时候避免不了要使用延时函数,很多延时函数都是使用中断或者tick来实现的,tick的方式最大到毫秒ms级别,通过中断方式的通用定时器来实现,如果实现1us的延时那么每1us就来一次中断,很影响cpu的效率。

本文提供一种不使用中断,并且很简单的方式实现的微秒级精确定时。

通过使用通用定时器来实现

代码如下(基于stm32f103)

  1. static void us_delay(uint32_t us)
  2. {
  3. uint32_t count = us;
  4. TIM_SetCounter(TIM3, count);
  5. TIM_Cmd(TIM3, ENABLE);
  6. while (count > 1)//一般改为>= 1,只是 > 1延时偶尔会不够
  7. {
  8. count = TIM_GetCounter(TIM3);
  9. }
  10. TIM_Cmd(TIM3, DISABLE);
  11. }
  12. static void timer_init(void)//2us
  13. {
  14. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  15. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  16. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  17. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  18. TIM_TimeBaseStructure.TIM_Period = 1;
  19. TIM_TimeBaseStructure.TIM_Prescaler = 71;//72Mhz
  20. TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  21. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  22. TIM_Cmd(TIM3, DISABLE);
  23. }

示波器测试抓到的5us延时如下:

当然如果要实现毫秒级别的要是就很简单了,代码如下:

  1. void ms_delay(uint32_t ms)
  2. {
  3. us_delay(ms * 1000);
  4. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/330783
推荐阅读
相关标签
  

闽ICP备14008679号