一、STM32定时器介绍
共有8个定时器:高级定时器(TIM1和TIM8)、通用定时器(TIM2--TIM5)、基本定时器(TIM6 和TIM7)
高级定时器:
TIM1和TIM8简介
高级控制定时器
(TIM1
和
TIM8)
由一个
16
位的自动装载计数器组成,它由一个可编程的预分频器
驱动。
它适合多种用途,包含测量输入信号的脉冲宽度
(
输入捕获
)
,或者产生输出波形
(
输出比较、
PWM
、嵌入死区时间的互补
PWM
等
)
。
使用定时器预分频器和
RCC
时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几
个毫秒的调节。
高级控制定时器
(TIM1
和
TIM8)
和通用定时器
(TIMx)
是完全独立的,它们不共享任何资源。它们
可以同步操作
。
TIM1
和
TIM8
定时器的功能包括:
●
16
位向上、向下、向上
/
下自动装载计数器
●
16
位可编程
(
可以实时修改
)
预分频器,计数器时钟频率的分频系数为
1
~
65535
之间的任意
数值
● 多达
4
个独立通道:
─
输入捕获
─
输出比较
─
PWM
生成
(
边缘或中间对齐模式
)
─
单脉冲模式输出
● 死区时间可编程的互补输出
● 使用外部信号控制定时器和定时器互联的同步电路
● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
● 如下事件发生时产生中断
/DMA
:
─
更新:计数器向上溢出
/
向下溢出,计数器初始化
(
通过软件或者内部
/
外部触发
)
─
触发事件
(
计数器启动、停止、初始化或者由内部
/
外部触发计数
)
─
输入捕获
─
输出比较
─
刹车信号输入
● 支持针对定位的增量
(
正交
)
编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
TIMx
简介
通用定时器是一个通过可编程预分频器驱动的
16
位自动装载计数器构成。
它适用于多种场合,包括测量输入信号的脉冲长度
(
输入捕获
)
或者产生输出波形
(
输出比较和
PWM)
。
使用定时器预分频器和
RCC
时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个
毫秒间调整。
每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。
TIMx
主要功能
通用
TIMx (TIM2
、
TIM3
、
TIM4
和
TIM5)
定时器功能包括:
●
16
位向上、向下、向上
/
向下自动装载计数器
●
16
位可编程
(
可以实时修改
)
预分频器,计数器时钟频率的分频系数为
1
~
65536
之间的任意
数值
●
4
个独立通道:
─
输入捕获
─
输出比较
─
PWM
生成
(
边缘或中间对齐模式
)
─
单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断
/DMA
:
─
更新:计数器向上溢出
/
向下溢出,计数器初始化
(
通过软件或者内部
/
外部触发
)
─
触发事件
(
计数器启动、停止、初始化或者由内部
/
外部触发计数
)
─
输入捕获
─
输出比较
● 支持针对定位的增量
(
正交
)
编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
TIM6
和
TIM7
简介
基本定时器
TIM6
和
TIM7
各包含一个
16
位自动装载计数器,由各自的可编程预分频器驱动。
它们可以作为通用定时器提供时间基准,特别地可以为数模转换器
(DAC)
提供时钟。实际上,它
们在芯片内部直接连接到
DAC
并通过触发输出直接驱动
DAC
。
这
2
个定时器是互相独立的,不共享任何资源。
TIM6
和
TIM7
的主要特性
TIM6
和
TIM7
定时器的主要功能包括:
●
16
位自动重装载累加计数器
●
16
位可编程
(
可实时修改
)
预分频器,用于对输入的时钟按系数为
1
~
65536
之间的任意数值
分频
● 触发
DAC
的同步电路
● 在更新事件
(
计数器溢出
)
时产生中断
/DMA
请求
二、定时器PWM输出
2.1原理说明
PWM:脉冲宽度调制(频率可以设定,占空比可动态调节)|
占空比是高电平占整个周期的一个比例,高电平越多表示占空比越大
可以调整灯光的亮度
每个定时器有4路输出通道:OC1——OC4
有RCC给到TIM2----=-----------TIM7的时钟频率是72mhz
输入通道
输出通道
2.2固件库相关函数说明
1、定时器的初始化
1
//
计数模式
2
#define
TIM_CounterMode_Up
((
uint16_t
)
0x0000
)
3
#define
TIM_CounterMode_Down
((
uint16_t
)
0x0010
)
4
typedef struct
5
{
6
uint16_t TIM_Prescaler
;
//
预分频值
f_cnt= f_tim/(TIM_Prescaler+1)
7
uint16_t TIM_CounterMode
;
//
计数模式
8
uint16_t TIM_Period
;
//
周期(计数值)
9
}
TIM_TimeBaseInitTypeDef
;
1
/**
预分频值对它的时钟频率
2
*
@brief Initializes the TIMx Time Base Unit peripheral according to
3
*
the specified parameters
in
the TIM_TimeBaseInitStruct
.
4
*
@param TIMx
:
where x can be
1
to
17
to select the
TIM
peripheral
.
5
*
@param TIM_TimeBaseInitStruct
:
pointer to a TIM_TimeBaseInitTypeDef
6
*
structure that contains the configuration information
for
the
7
*
specified
TIM
peripheral
.
8
*
@retval None
9
*/
10
void
TIM_TimeBaseInit
(
TIM_
2、输出通道初始化
1
//pwm
相关的输出模式
2
#define
TIM_OCMode_PWM1
((
uint16_t
)
0x0060
)
3
#define
TIM_OCMode_PWM2
((
uint16_t
)
0x0070
)
4
//
输出状态
5
#define
TIM_OutputState_Disable
((
uint16_t
)
0x0000
)
6
#define
TIM_OutputState_Enable
((
uint16_t
)
0x0001
)
7
//
输出极性
8
#define
TIM_OCPolarity_High
((
uint16_t
)
0x0000
)
9
#define
TIM_OCPolarity_Low
((
uint16_t
)
0x0002
)
10
typedef struct
11
{
12
uint16_t TIM_OCMode
;
//
输出模式
13
14
uint16_t TIM_OutputState
;
//
输出状态
15
16
uint16_t TIM_Pulse
;
//
比较寄存器值
17
18
uint16_t TIM_OCPolarity
;
//
输出极性
19
}
1
void
TIM_OC1Init
(
TIM_TypeDef
*
TIMx
,
TIM_OCInitTypeDef
*
TIM_OCInitStruct
);
2
void
TIM_OC2Init
(
TIM_TypeDef
*
TIMx
,
TIM_OCInitTypeDef
*
TIM_OCInitStruct
);
3
void
TIM_OC3Init
(
TIM_TypeDef
*
TIMx
,
TIM_OCInitTypeDef
*
TIM_OCInitStruct
);
4
void
TIM_OC4Init
(
TIM_TypeDef
*
TIMx
,
TIM_OCInitTypeDef
*
TIM_OCInitStruct
);
PWM1模式:CNT < CRRx , 输出为有效电平
PWM2模式:相反
有效电平由极性决定:TIM_OCPolarity_High TIM_OCPolarity_Low
CNT计数器与比较1寄存器或者2,3,4进行比较
3、设置OCx的比较寄存器预装载功能
1
void
TIM_OC1PreloadConfig
(
TIM_TypeDef
*
TIMx
,
uint16_t TIM_OCPreload
);
2
void
TIM_OC2PreloadConfig
(
TIM_TypeDef
*
TIMx
,
uint16_t TIM_OCPreload
);
3
void
TIM_OC3PreloadConfig
(
TIM_TypeDef
*
TIMx
,
uint16_t TIM_OCPreload
);
4
void
TIM_OC4PreloadConfig
(
TIM_TypeDef
*
TIMx
,
uint16_t TIM_OCPreload
);
4、设置自动重装载使能
1
/**
2
*
@brief Enables or disables TIMx peripheral Preload register on
ARR
.
3
*
@param TIMx
:
where x can be
1
to
17
to select the
TIM
peripheral
.
4
*
@param NewState
:
new
state
of
the TIMx peripheral Preload register
5
*
This parameter can be
:
ENABLE
or
DISABLE
.
6
*
@retval None
7
*/
8
void
TIM_ARRPreloadConfig
(
TIM_TypeDef
*
TIMx
,
FunctionalState NewState
)
5、使能定时器的计数功能
1
/**
2
*
@brief Enables or disables the specified
TIM
peripheral
.
3
*
@param TIMx
:
where x can be
1
to
17
to select the TIMx peripheral
.
4
*
@param NewState
:
new
state
of
the TIMx peripheral
.
5
*
This parameter can be
:
ENABLE
or
DISABLE
.
6
*
@retval None
7
*/
8
void
TIM_Cmd
(
TIM_TypeDef
*
TIMx
,
FunctionalState NewState
)
2.3编程实现
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
void tim4_pwm_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
TIM_TimeBaseInitStruct.TIM_Period = 1000-1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 500;
//1.开启tim4的时钟->APB1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//2.开启GPIO的时钟->GPIOB ->APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//3.初始化GPIOB 6 7 8 9
GPIO_Init(GPIOB, &GPIO_InitStruct);
//4.初始化tim4定时器
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
//5.初始化输出通道
TIM_OC1Init(TIM4, &TIM_OCInitStruct);
TIM_OC2Init(TIM4, &TIM_OCInitStruct);
TIM_OC3Init(TIM4, &TIM_OCInitStruct);
TIM_OC4Init(TIM4, &TIM_OCInitStruct);
//6.使能比较寄存器于装载功能
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
//7.使能自动重装载功能
TIM_ARRPreloadConfig(TIM4, ENABLE);
//8.使能定时器的计数功能
TIM_Cmd(TIM4, ENABLE);
}
2.4软件调试
1、软件调试
编译完成
3、设置debug启动模式为用户启动弹出设置窗口设置
4、
5、弹出调试窗口
6、点击逻辑示波仪按钮
7.
添加GPIOB_ADR.6-9,并且给每一项选择display type为bit
8、点击Rst和向下执行按钮
9、输出波形
2、示波器调试