概述
欢迎来到矽芯硬翌的科技主义教室!
记录STM32入土路上的艰苦旅程,加油UPUPUP!
@Author: 矽芯硬翌
????想要我的财宝吗?想要的话可以全部给你,去找出来吧,这世上所有的一切都在那里!
????
ONE PIECE地址: ✨ 矽芯硬翌的博客✨
文章目录
- 欢迎来到矽芯硬翌的科技主义教室!
- 前言
- 一、定时器分类
- 二、基本定时器
- 2.1 基本定时器功能介绍
- 2.2 定时器时基初始化
- 三、通用定时器
- 3.1 通用定时器输出比较模式初始化
- 3.2 关于定时器输出引脚的定义与重映射
- 四、总结
前言
已经学习过一边STM32,但没有系统的记录下来,导致很多东西都是只知道名字但不了解具体是什么原理。借用这个暑假在详细记录一下STM32的入土实况!!加油以下是记录一些定时器的的相关知识内容,下面案例可供参考
一、定时器分类
- 基本定时器
基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。 - 通用定时器
通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。 - 高级定时器
高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。
二、基本定时器
2.1 基本定时器功能介绍
TIM6 和 TIM7 是STM32的一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。
基本定时器的核心是时基(时基的配置),不仅基本定时器有,通用定时器和高级定时器也有时基的配置。
下面是基本定时器功能框图:
- ① 时钟源
确定定时器的时钟源,即内部时钟CK_INT,经 APB1 预分频器后分频提供,如果APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。 - ② 计数器时钟
通过PSC预分频器来计算计数器的时钟,公式为:计数器时钟频率(CK_CLK) = 定时器时钟源/(PSC+1) - ③ 计数器
CNT为一个16位计数器,基本定时器只能向上计数,最大值为65535。当计数器达到ARR(自动重装载寄存器)的数值时清零,配合计数器时钟可以计算周期与延时时间,可以用来计算中断时间。 - ④ 定时器时间的计算
产生一次中断或者更新的时间为:
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;
- TIM_Presacler: 定时器预分频器
时钟源经该预分频器才是定时器时钟,可设置范围为 0 至 65535,实现 1 至 65536 分频。设置为(72-1)时即为1Mhz。 - TIM_CounterMode :定时器计数方式
可是在为向上计数、向下计数以及三种中心对齐模式 - TIM_Period:定时器周期
设置的为自动重装载计数器的数值ARR,可设置范围0~65535 - TIM_ClockDivision:时钟分频
设置定时器时钟 CK_INT 频率与死区发生器与数字滤波器采样时钟频率分频比 - 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;
- TIM_OCMode:比较输出模式选择
总共有八种,常用的为 PWM1/PWM2 - TIM_OutputState:比较输出使能
决定最终的输出比较信号 OCx 是否通过外部引脚输出 - TIM_OutputNState:比较互补输出使能
决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。通用定时器没有。 - TIM_Pulse:比较输出脉冲宽度
实际设定比较寄存器 CCR 的值,决定脉冲宽度。可设置范围为 0 至 65535。与PWM模式选择有关。参照下图:
- TIM_OCPolarity:比较输出极性
可选 OCx 为高电平有效或低电平有效。它决定着定时器通道有效电平。它设定 CCER 寄存器的 CCxP 位的值。 - TIM_OCNPolarity:比较互补输出极性
可选 OCxN 为高电平有效或低电平有效。它设定 TIMx_CCER 寄存器的 CCxNP 位的值。 - TIM_OCIdleState:空闲状态时通道输出电平设置
可选输出 1 或输出 0,即在空闲状态(BDTR_MOE 位为 0)时,经过死区时间后定时器通道输出高电平或低电平。它设定CR2 寄存器的 OISx 位的值。 - 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的工作原理,程序四路更加清晰。
- 关于高级定时器,在以后使用的过程中再进行补充。
最后
以上就是谦让发夹为你收集整理的【STM32】学习笔记——定时器攻略前言一、定时器分类二、基本定时器三、通用定时器四、总结的全部内容,希望文章能够帮你解决【STM32】学习笔记——定时器攻略前言一、定时器分类二、基本定时器三、通用定时器四、总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复