STM32嵌入式开发之CubeMx定时器基本定时功能详解

    图1  定时器内部架构图

 

 

 

图2 Cubemx 可视化定时器配置

工作流程:

   内部或外部驱动时钟CK_PSC驱动预分频器PSC计数分频,产生CK_CNT驱动计数器CNT计数。自动重装载寄存器在发生更新事件时将值传到计数器CNT中作为初始计数值,REP寄存器则控制CNT溢出次数,当重复次数计数器从REP寄存器的数值递减至0是计数器CNT停止计数。

 1. 根据上述CubeMx工具自动产生如下代码,定时周期s = (Period + 1) * (Prscaler +1) /(Tclk定时器时钟频率Hz) = (99+1)*(63+1)/64MHz=100*10^(-6)秒=100us

/* USER CODE BEGIN TIM1_Init 1 */

/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;                //   选择所使用的的定时器
htim1.Init.Prescaler = 63;            // 对定时器输入的时钟源进行分频的分频系数,对应于图1中的1,例如输入时钟源时钟频率为64MHz,此处分频系数为63,则定时器时钟=64MHz/64 = 1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;          // 定时器计数方式选择为从下往上
htim1.Init.Period = 99;   // 计时周期=定时器时钟*(period+1)  自动重装载值(默认值)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;  // 代表计数值满溢出几次才进入中断,对应于图1中的3,RepetitionCounter = 0则代表一个定时周期便产生中断;RepetitionCounter =1 代表需要两个定时周期才产生中断
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 关闭自动重载功能
if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
{
  Error_Handler();
}

 2.常用术语

2.1 计数模式--对应于htim1.Init.CounterMode

向上计数模式:

  在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。

向下计数模式:

  在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。

中央对齐模式:

  在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

2.2 重复计数器功能

  如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。对应于htim1.Init.RepetitionCounter

 

posted @   梦想成真0625  阅读(2275)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示