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

基于stm32用两个16位定时器级联成32位定时器经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-7 16:56
16位计时器最多计数65535,那么us级别的计时最大是65.535ms,项目上可能会有计时或者延时时间大于65.535ms的情况,因此需要级联成32位扩大使用范围。

实现原理
使用两个定时器,一个位主定时器,一个为从定时器,当主定时器计数到65535时,会产生UEV(Update Event)事件,TRGO信号会给到从定时器,这时从定时器开始计数,从定时器计数一次的计时时间为65.535ms。

微信图片_20231107165542.png


假如给定延时时间为100000(0x186A0)us,那么可以计算出主从定时器的cnt寄存器的值为:

主定时器:0x186A0 & 0xFFFF = 0x86A0

从定时器:0x186A0 >> 16 = 1

根据计算演示100000us,从定时器会被触发一次。

主从定时器的选择有一定依赖关系,具体可参见下表

微信图片_20231107165535.png


目前代码中选用的是:TIM3用作主定时器,TIM4用作从定时器,根据表中选择内部触发就是ITR2

微信图片_20231107165529.png


时钟源选择内部时钟源为APB1,因为APB1为90Mhz,所以分频系数为(90-1)= 89,这样一个cnt就是1us

微信图片_20231107165015.png


从定时器配置

微信图片_20231107165010.png


slave mode选择External Clock Mode 1,触发源根据上表选择ITR2,如果后面不再接从定时器,MSMbit就disable,出发事件选择Reset


代码实现
  1. void delay(uint32_t nus);
  2. {
  3.   uint32_t MSB = 0;
  4.   uint32_t LSB = 0;

  5.   MSB = nus >> 16;
  6.   LSB = nus & 0xFFFF;

  7.   if (nus > 0xFFFF)
  8.   {
  9.     __HAL_TIM_SET_COUNTER(&htim4, MSB);
  10.     __HAL_TIM_SET_COUNTER(&htim3, LSB);

  11.     HAL_TIM_Base_Start(&htim3);
  12.     HAL_TIM_Base_Start(&htim4);

  13.     while (__HAL_TIM_GET_COUNTER(&htim4) > 0)
  14.       ;
  15.     HAL_TIM_Base_Stop(&htim4);

  16.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
  17.       ;
  18.     HAL_TIM_Base_Stop(&htim3);
  19.   }
  20.   else
  21.   {
  22.     __HAL_TIM_SET_COUNTER(&htim3, LSB);

  23.     HAL_TIM_Base_Start(&htim3);

  24.     while (__HAL_TIM_GET_COUNTER(&htim3) > 1)
  25.       ;
  26.     HAL_TIM_Base_Stop(&htim3);
  27.   }
  28. }
复制代码

转载自:啊哈哈昊啊
如有侵权请联系删除
收藏 评论0 发布时间:2023-11-7 16:56

举报

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