欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【STM32】入土笔记——定时器攻略

程序员文章站 2022-06-08 16:37:30
...

欢迎来到精神小火君的科技主义教室!

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


						/*
						 *                        _oo0oo_
						 *                       o8888888o
						 *                       88" . "88
						 *                       (| -_- |)
						 *                       0\  =  /0
						 *                     ___/`---'\___
						 *                   .' \\|     |// '.
						 *                  / \\|||  :  |||// \
						 *                 / _||||| -:- |||||- \
						 *                |   | \\\  - /// |   |
						 *                | \_|  ''\---/''  |_/ |
						 *                \  .-\__  '-'  ___/-. /
						 *              ___'. .'  /--.--\  `. .'___
						 *           ."" '<  `.___\_<|>_/___.' >' "".
						 *          | | :  `- \`.;`\ _ /`;.`/ - ` : | |
						 *          \  \ `_.   \_ __\ /__ _/   .-` /  /
						 *      =====`-.____`.___ \_____/___.-`___.-'=====
						 *                        `=---='
						 * 
						 * 
						 *      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
						 * 
						 *            佛祖保佑       永不宕机     永无BUG
						 * 
						 *        佛曰:  
						 *                写字楼里写字间,写字间里程序员;  
						 *                程序人员写程序,又拿程序换酒钱。  
						 *                酒醒只在网上坐,酒醉还来网下眠;  
						 *                酒醉酒醒日复日,网上网下年复年。  
						 *                但愿老死电脑间,不愿鞠躬老板前;  
						 *                奔驰宝马贵者趣,公交自行程序员。  
						 *                别人笑我忒疯癫,我笑自己命太贱;  
						 *                不见满街漂亮妹,哪个归得程序员?
						 */



前言

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

一、定时器分类

  • 基本定时器
    基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。
  • 通用定时器
    通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。
  • 高级定时器
    高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。
    【STM32】入土笔记——定时器攻略

二、基本定时器

2.1 基本定时器功能介绍

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


下面是基本定时器功能框图:
【STM32】入土笔记——定时器攻略

  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=1CKCLK(ARR+1) t = \frac{1}{CK_{CLK}} * (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


下面是通用定时器的基本功能:
【STM32】入土笔记——定时器攻略


关于定时器的时钟源(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模式选择有关。参照下图:
    【STM32】入土笔记——定时器攻略
    【STM32】入土笔记——定时器攻略

  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:
    【STM32】入土笔记——定时器攻略

  • TIM2:
    【STM32】入土笔记——定时器攻略

  • TIM3:
    【STM32】入土笔记——定时器攻略

  • TIM4:
    【STM32】入土笔记——定时器攻略


【STM32】入土笔记——定时器攻略

四、总结

  • 定时器的使用极大的方便了PWM的输出,为调试舵机等提供了便利
  • 通过定时器的使用,更好的理解STM32的工作原理,程序四路更加清晰。
  • 关于高级定时器,在以后使用的过程中再进行补充。