stm32之通用定时器
一、定时器有哪些
stm32F1xx 一共有八个定时器
两个高级定时器+四个通用定时器+两个基本定时器
定时器种类 | 位数 | 计数器模拟 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|---|---|---|---|---|---|
高级定时器(TIM1,TIM8) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 有 | 带死区控制器紧急刹车,可应用与PWM电机控制 |
通用定时器(TIM2~TIM5) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 无 | 通用,定时计数,PWM输出,输入捕获,输出比较 |
基本定时器(TIM6,TIM7) | 16 | 向上,向下,向上/向下 | 可以 | 0 | 无 | 主要应用于驱动DAC (数模转换) |
二、功能以及特点
1、通用定时器工作图
2、通用定时器工作过程
2.1、时钟部分
内部时钟APB1倍频器
注:除非APB1的分频系数位1,否则通用定时器的时钟为PAB的两倍
2.2、时基单元
预分频
计数器时钟
自动重装载数据
2.3、输入部分
输入引脚
边沿检测
2.4、输出部分
输出比较寄存器
周期——一个重装载值
占空比——比较值
3、定时器相关寄存器
①计数器寄存器CNT:当前计数值
②预分频寄存器:分频系数(PSC+1)/ N = CNT
③自动重装载寄存器:重装载值
④控住寄存器:控制计数方向
4、定时器库函数结构体
typedef struct
{ //初始化预分频值
uint16_t TIM_Prescaler;
//设定自动重装载值
uint16_t TIM_Period;
//设定计数模式
uint16_t TIM_CounterMode;
//输入捕获使用
uint16_t TIM_ClockDivision;
//高级定时器使用
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
主要用到以下几个参数:
①TIM_ClockDivision 输入捕获使用
②TIM_CounterMode 设定计数模式
③TIM_Prescaler 设定预分频值
④TIM_Period 设定自动重装载值
定时器库函数使用说明:
//定时器初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//定时器使能
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
//定时器状态标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
//定时器清除标志位
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
//定时器中断状态标志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
//定时器清除中断标志位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
5、定时器总线配置步骤:
①使能时钟(定时器时钟)
②配置定时器结构体(初始化、使能)
③开启定时器中断控制器(配置中断控制器的结构体、中断优先级组)
④中断服务函数
⑤定时器配置公式
Tout = [重装载值(ARR+1)*分频系数(PSC+1)/ Tclk ]
如1秒定时器:分频系数不变,重装载值乘分频系数是Tclk 1倍
Tout = 10000(9999+1)*7200(分频系数7199+1)/ 72M(72000 000)
6、以TIM2定时器为例配置代码:
void Tim2_Init(void)
{
//定义定时器结构体
TIM_TimeBaseInitTypeDef tim_initSruct;
//定义中断控制器结构体
NVIC_InitTypeDef nvictim_Struct;
//初始化中断控制器组2;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//配置结构体
tim_initSruct.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
tim_initSruct.TIM_CounterMode = TIM_CounterMode_Up;//向上
tim_initSruct.TIM_Period = 10000 - 1 ;//计数值
tim_initSruct.TIM_Prescaler = 7200 - 1 ;//分频系数
//开启TIM2中断控制器
TIM_ITConfig(TIM2, TIM_IT_Update ,ENABLE);
//初始化TIM2定时器的结构体
TIM_TimeBaseInit(TIM2, &tim_initSruct);
//使能定时器
TIM_Cmd( TIM2, ENABLE);
nvictim_Struct.NVIC_IRQChannel = TIM2_IRQn;
nvictim_Struct.NVIC_IRQChannelCmd = ENABLE;
nvictim_Struct.NVIC_IRQChannelPreemptionPriority = 1;
nvictim_Struct.NVIC_IRQChannelSubPriority = 1;
//初始化中断控制器结构体
NVIC_Init(&nvictim_Struct);
}
7、中断服务函数
以1秒闪烁
void TIM2_IRQHandler(void)
{
static uint16_t temp;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(temp++ %2 == 1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}else{
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}