[经验] STM32简单容易的精确延时(只需一个定时器)

weizhongc   2017-11-7 14:22 楼主
自己在测试个模拟i2c的时候,由于滴答定时器给用了,没有了us的精确延时,很烦。 自己突发写了一个,很简单,很好用。系统时钟是72M 例程如下
  1. void delay_init(void)
  2. {
  3. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
  5. //定时器TIM4初始化
  6. TIM_TimeBaseStructure.TIM_Period = 40000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  7. TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值
  8. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  9. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  10. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  11. }
  12. //最大延时 65536/72 = 910 us
  13. void delay_us(uint32 nTime)
  14. {
  15. /* 清零计数器并使能定时器 */
  16. nTime*=72;
  17. TIM4->CNT = 0;
  18. TIM_Cmd(TIM4,ENABLE);
  19. while( (TIM4->CNT) < nTime);
  20. TIM_ClearFlag(TIM4, TIM_FLAG_Update);
  21. TIM_Cmd(TIM4,DISABLE);
  22. }
  23. void delay_ms(u16 ms)
  24. {
  25. while(ms--)
  26. {
  27. delay_us(500);
  28. delay_us(500);
  29. }
  30. }
本帖最后由 weizhongc 于 2017-11-7 17:19 编辑

回复评论 (7)

不给出时钟配置的定时器延时都是耍流氓
So TM what......?
点赞  2017-11-7 15:24
系统时钟是使用多少频率?
点赞  2017-11-7 16:24
引用: ljj3166 发表于 2017-11-7 15:24
不给出时钟配置的定时器延时都是耍流氓

有啊 0分频
点赞  2017-11-7 17:17
引用: 网络孤客 发表于 2017-11-7 16:24
系统时钟是使用多少频率?

使用的是72M的啊
点赞  2017-11-7 17:18
其实程序里有很多影响到延时的,所以也不太能说是精准的延时了。
点赞  2017-11-7 17:21
刚学STM32从头开始,看着很好谢谢楼主
点赞  2017-11-22 22:07
祝楼主节日快乐
点赞  2018-1-1 00:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复