【STM32】学习笔记——定时器攻略

欢迎来到矽芯硬翌的科技主义教室!

记录STM32入土路上的艰苦旅程,加油UPUPUP
@Author: 矽芯硬翌
👇 想要我的财宝吗?想要的话可以全部给你,去找出来吧,这世上所有的一切都在那里! 👇
ONE PIECE地址:矽芯硬翌的博客


前言

已经学习过一边STM32,但没有系统的记录下来,导致很多东西都是只知道名字但不了解具体是什么原理。借用这个暑假在详细记录一下STM32的入土实况!!加油
以下是记录一些定时器的的相关知识内容,下面案例可供参考

一、定时器分类

  • 基本定时器
    基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。
  • 通用定时器
    通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。
  • 高级定时器
    高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。
    在这里插入图片描述

二、基本定时器

2.1 基本定时器功能介绍

TIM6TIM7 是STM32的一个 16 位的只能向上计数的定时器,只能定时没有外部 IO
基本定时器的核心是时基(时基的配置),不仅基本定时器有,通用定时器和高级定时器也有时基的配置。


下面是基本定时器功能框图:
在这里插入图片描述

  1. ① 时钟源
    确定定时器的时钟源,即内部时钟CK_INT,经 APB1 预分频器后分频提供,如果APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。
  2. ② 计数器时钟
    通过PSC预分频器来计算计数器的时钟,公式为:计数器时钟频率(CK_CLK) = 定时器时钟源/(PSC+1)
  3. ③ 计数器
    CNT为一个16位计数器,基本定时器只能向上计数,最大值为65535。当计数器达到ARR(自动重装载寄存器)的数值时清零,配合计数器时钟可以计算周期与延时时间,可以用来计算中断时间。
  4. ④ 定时器时间的计算
    产生一次中断或者更新的时间为:
    t = 1 C K C L K ∗ ( A R R + 1 ) t = \frac{1}{CK_{CLK}} * (ARR+1) t=CKCLK1(ARR+1)

2.2 定时器时基初始化

定时器时基初始化:TIM_TimeBaseInitTypeDef()

// 定时器基本初始化结构体
typedef struct {
	uint16_t TIM_Prescaler; // 预分频器
	uint16_t TIM_CounterMode; // 计数模式 
	uint32_t TIM_Period; // 定时器周期
	uint16_t TIM_ClockDivision; // 时钟分频
	uint8_t TIM_RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;
  1. TIM_Presacler: 定时器预分频器
    时钟源经该预分频器才是定时器时钟,可设置范围为 0 至 65535,实现 1 至 65536 分频。设置为(72-1)时即为1Mhz。
  2. TIM_CounterMode :定时器计数方式
    可是在为向上计数、向下计数以及三种中心对齐模式
  3. TIM_Period:定时器周期
    设置的为自动重装载计数器的数值ARR,可设置范围0~65535
  4. TIM_ClockDivision:时钟分频
    设置定时器时钟 CK_INT 频率与死区发生器与数字滤波器采样时钟频率分频比
  5. TIM_RepetitionCounter:重复计数器 (只有高级定时器有)
    属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数

三、通用定时器

对于STM32F103ZET6来说,通用定时器为:TIM2、 TIM3、 TIM4 和 TIM5


下面是通用定时器的基本功能:
在这里插入图片描述


关于定时器的时钟源(4个):
1) 内部时钟(CK_INT)
2) 外部时钟模式 1:外部输入脚(TIx)
3) 外部时钟模式 2:外部触发输入(ETR)
4) 内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。

3.1 通用定时器输出比较模式初始化

先介绍一下输出比较模式的初始化和一些参数设置
输出比较模式:TIM_OCInitTypeDef

1 typedef struct {
			2 uint16_t TIM_OCMode; // 比较输出模式
			3 uint16_t TIM_OutputState; // 比较输出使能
			4 uint16_t TIM_OutputNState; // 比较互补输出使能
			5 uint32_t TIM_Pulse; // 脉冲宽度
			6 uint16_t TIM_OCPolarity; // 输出极性
			7 uint16_t TIM_OCNPolarity; // 互补输出极性
			8 uint16_t TIM_OCIdleState; // 空闲状态下比较输出状态
			9 uint16_t TIM_OCNIdleState; // 空闲状态下比较互补输出状态
10 } TIM_OCInitTypeDef;
  1. TIM_OCMode:比较输出模式选择
    总共有八种,常用的为 PWM1/PWM2
  2. TIM_OutputState:比较输出使能
    决定最终的输出比较信号 OCx 是否通过外部引脚输出
  3. TIM_OutputNState:比较互补输出使能
    决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。通用定时器没有。
  4. TIM_Pulse:比较输出脉冲宽度
    实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535。与PWM模式选择有关。参照下图:
    在这里插入图片描述
    在这里插入图片描述

  1. TIM_OCPolarity:比较输出极性
    可选 OCx 为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定 CCER 寄存器的 CCxP 位的值。
  2. TIM_OCNPolarity:比较互补输出极性
    可选 OCxN 为高电平有效或低电平有效。它设定 TIMx_CCER 寄存器的 CCxNP 位的值。
  3. TIM_OCIdleState:空闲状态时通道输出电平设置
    可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2 寄存器的 OISx 位的值。
  4. TIM_OCNIdleState:空闲状态时互补通道输出电平设置
    可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器互补通道输出高电平或低电平,设定值必须与 TIM_OCIdleState 相反。它设定是 CR2 寄存器的 OISxN 位的值。

在使用通用定时器时不需要配置这么多参数,例如进行PWM输出时只需要配置如下参数

//初始化PWM模式
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
	TIM_Cmd(TIM3, ENABLE);  //使能TIM

3.2 关于定时器输出引脚的定义与重映射

下面是基本定时器功能框图:

  • TIM1:
    在这里插入图片描述

  • TIM2:
    在这里插入图片描述

  • TIM3:
    在这里插入图片描述

  • TIM4:
    在这里插入图片描述


在这里插入图片描述

四、总结

  • 定时器的使用极大的方便了PWM的输出,为调试舵机等提供了便利
  • 通过定时器的使用,更好的理解STM32的工作原理,程序四路更加清晰。
  • 关于高级定时器,在以后使用的过程中再进行补充。
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值