本文先对STM32F4的不同种类定时器的功能上的区别进行了介绍,后对TIM5的基本定时以及PWM输出进行了完整的示例。
目录
STM32定时器区别
定时器种类 | 位数 | 计数器模式 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
高级定时器(TIM1,TIM8) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 有 | 带可编程死区的互补输出 |
通用定时器(TIM2,TIM5) | 32 | 向上,向下,向上/向下 | 可以 | 4 | 无 | 通用。定时计数,PWM输出,输入捕获,输出比较 |
通用定时器(TIM3,TIM4) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 无 | 通用。定时计数,PWM输出,输入捕获,输出比较 |
用定时器(TIM9~TIM14) | 16 | 向上 | 没有 | 2 | 无 | 通用。定时计数,PWM输出,输入捕获,输出比较 |
基本定时器(TIM6,TIM7) | 16 | 向上,向下,向上/向下 | 可以 | 0 | 无 | 主要应用于驱动DAC |
时定器,复引用脚,功能,有着对应关系
例,void TIM5_Init(unsigned short arr,unsigned short psc)
1、定时器初始化配置
//1、时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
//2、定时器初始化配置 配置定时间隔
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频因子
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure); //初始化TIM5
2、PWM 脉冲输出配置
1)引脚初始化配置
//1)引脚初始化配置
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //GPIOx 时钟使能
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //GPIOx_x复用为定时器x
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA_x
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
2)定时器模式初始化配置 PWM模式
//2)定时器模式初始化配置 PWM模式
TIM_OCInitTypeDef TIM_OCInitStructure;
//初始化TIMx Channelx PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = (arr+1)*0.5; //CCR 设置占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出极性:TIM输出比较极性低
TIM_OC1Init(TIM5, &TIM_OCInitStructure);//根据T指定的参数初始化外设TIMx OC1
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器
TIM_ARRPreloadConfig(TIM5, ENABLE);//ARPE使能
3、中断优先级初始化
若需要使用定时器中断函数,则进行 中断优先级初始化配置
NVIC_InitTypeDef NVIC_InitStructure;
/* 设置中断管理 */
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; //定时器5中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//使能TIM5的更新中断
4、使能定时器
TIM_Cmd(TIM5,ENABLE); //使能定时器
定时器中断服务函数
若需要使用定时器中断函数,则添加 定时器中断服务函数
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5, TIM_IT_Update) == SET)
{
//DO
}
TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
}
初始化定时器参数
TIM5_Init(100-1,840-1); //1ms