你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何设计延时函数基于STM32定时器

[复制链接]
攻城狮Melo 发布时间:2023-3-29 19:29
本文用STM32F205芯片中的TIM3为例,写了两种定时器延时函数。本人所知的延时函数方式有3种,通过定时器中断方式的延时函数在本文中暂时不提及。为方便自己记忆,以下均为自己总结,如有错误,欢迎大家讨论。
TIM3挂载在APB1上,30MHz,故TIM3的始终频率为60MHz。


方法一:1. 先配置定时器的单次定时时长,定时器分频为1M,即每计一个数需要1us。
2. 写延时函数,当计数器的计数值大于给定的计数值时,停止计数。

  1. void TIM3_Init(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  4.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  5.         TIM_TimeBaseInitStructure.TIM_Period    = 50000-1;         //自动重装载值
  6.         TIM_TimeBaseInitStructure.TIM_Prescaler = 60-1;     //定时器分频
  7.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  8.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  9.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  10. }

  11. //微秒级延时
  12. void TIM3_Delayus(u16 xus)
  13. {
  14.         TIM_Cmd(TIM3,ENABLE); //启动定时器
  15.         while(TIM3->CNT < xus);
  16.         TIM3->CNT = 0;
  17.         TIM_Cmd(TIM3,DISABLE); //关闭定时器
  18. }

  19. //毫秒级延时
  20. void TIM3_Delayms(u16 xms)
  21. {
  22.         int i;
  23.         for(i=0;i<xms;i++)
  24.         {
  25.                 TIM3_Delayus(1000);
  26.         }
  27. }
复制代码

注意:通过这个方法写的定时器延时函数,微秒级延时时长必须小于单次定时时长,即自动重装载值必须设置大一点,但也不能超过最大值。


方法二:将定时时长跟自动重装载值联系在一起,当检测SR寄存器发生计数溢出,关闭定时器。
  1. //毫秒级延时
  2. void TIM3_Delayms(u16 xms)
  3. {
  4.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  6.         TIM_TimeBaseInitStructure.TIM_Period    = xms*10-1;         //自动重装载值
  7.         TIM_TimeBaseInitStructure.TIM_Prescaler = 6000-1;       //定时器分频
  8.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  9.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  10.         TIM3->SR = 0;
  11.         TIM_Cmd(TIM3,ENABLE); //启动定时器
  12.         while((TIM3->SR & TIM_FLAG_Update)!=SET);
  13.         TIM_Cmd(TIM3,DISABLE); //关闭定时器
  14.         TIM3->CNT = 0;
  15. }
复制代码

注意:在使用方法二的延时时,在启动定时器前需要先将SR寄存器清空,否则会出问题。
————————————————
版权声明:Zelonal
如有侵权请联系删除


收藏 评论0 发布时间:2023-3-29 19:29

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版