目录
定时器复用表:
STM32F1xx官方资料:
《STM32中文参考手册V10》-第14章 通用定时器
具体资料自己查看,这个表是自己统计的,不在其中,需要资料可以留个邮箱或者自己百度
1、高级定时器设置(tim1,tim8)
定时器1初始化:(通道1,PA8)(IO与通道号对应查看上表)
//高级定时器1中断初始化
//arr:自动重装值。
//psc:时钟预分频值。
//(((arr+1) * (7199+1)) / 72 )us
void timer1_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_BDTRInitTypeDef TIM_BdtrStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period=arr;
TIM_InitStruct.TIM_Prescaler=psc;
TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_InitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_InitStruct);
TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
TIM_BdtrStruct.TIM_DeadTime=0;
TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
TIM_BDTRConfig(TIM1,&TIM_BdtrStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
//TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
//TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low;
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OC1Init(TIM1,&TIM_OCInitStruct);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
NVIC_InitStruct.NVIC_IRQChannel=TIM1_UP_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_SetCompare1(TIM1,0);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE); //不要忘了
}
定时器8初始化:(通道2,PC8、7)(IO与通道号对应查看上表)
void timer8_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_BDTRInitTypeDef TIM_BdtrStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_TIM8,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period=arr;
TIM_InitStruct.TIM_Prescaler=psc;
TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_InitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM8,&TIM_InitStruct);
TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
TIM_BdtrStruct.TIM_DeadTime=0;
TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
TIM_BDTRConfig(TIM8,&TIM_BdtrStruct);
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
//TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
//TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low;
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OC2Init(TIM8,&TIM_OCInitStruct);
TIM_OC3Init(TIM8,&TIM_OCInitStruct);
TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
TIM_ClearFlag(TIM8,TIM_FLAG_Update);
TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
NVIC_InitStruct.NVIC_IRQChannel=TIM8_UP_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_SetCompare2(TIM8,0);
TIM_SetCompare3(TIM8,0);
TIM_CtrlPWMOutputs(TIM8,ENABLE);
// TIM_CtrlPWMOutputs(TIM8,DISABLE);
TIM_ARRPreloadConfig(TIM8,ENABLE);
TIM_Cmd(TIM8,ENABLE);
}
中断
//----------中断----------
void TIM1_UP_IRQHandler(void)//TIM1中断
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
}
}
//----------中断----------
void TIM8_UP_IRQHandler(void)//TIM1中断
{
if(TIM_GetITStatus(TIM8,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
}
}
2、通用定时器设置(以tim3为例)
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 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); //使能TIM3
}
中断
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//ProcessInTimerX(); //不启用y轴,暂做编码盘使用
CodeDisk_Count();
//IO_MechanicalSWHandel(); //机械开关
}
}
3、调用
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
TIM3_PWM_Init(899,0); //PWN3初始化
timer8_init(9999,71); //PWN8初始化
timer1_init(9999,71); //PWN1初始化
TIM_SetCompare2(TIM3,1000); //设置斩波频率,0:为关闭,1000为斩波频率
TIM_SetCompare1(TIM1,0);
TIM_SetCompare3(TIM8,5000);
TIM_SetCompare3(TIM8,5000);
while(1)
{
}
}