//初始化TIMX,设置TIMx的ARR,PSC
//arr:自动重装载初值,psc为预分频值,两者配合控制定时器时钟的周期
//定时器选择TIM1
static void TB6612_ADVANCE_TIM1_Mode_Config(TIM_TypeDef* TIMx,uint16_t arr,uint16_t psc,uint16_t duty)
{
//-----------------时基结构体初始化-------------------------/
TIM_TimeBaseInitTypeDef TIM_TimeStructure;
/*开启定时器1时钟,即内部时钟CK_INT=72M*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_DeInit(TIMx);
/*内部时钟作为计数器时钟,72MHZ*/
TIM_InternalClockConfig(TIMx);
/*自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断*/
TIM_TimeStructure.TIM_Period=arr;
/*时钟预分频系数为71,则驱动计数器的时钟CK_CNT=CK_INT/(71+1)=1MHZ*/
TIM_TimeStructure.TIM_Prescaler=psc-1;
/*设置时钟分割,TIM_CKD_DIV1=0,PWM波不延时*/
TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
/*向上计数模式*/
TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;
/*重复计数器*/
TIM_TimeStructure.TIM_RepetitionCounter=0;
/*初始化定时器*/
TIM_TimeBaseInit(TIMx,&TIM_TimeStructure);
/*使能ARR预装载寄存器(影子寄存器)*/
TIM_ARRPreloadConfig(TIMx,ENABLE);
//-----------------输出比较结构体初始化-----------------------/
TIM_OCInitTypeDef TIM_OCInitStructure;
/*PWM模式设置,设置为PWM模式1*/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
/*PWM输出使能相应的IO口输出信号*/
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
/*设置占空比大小,CCR1[15:0]: 捕获/比较通道1的值,若CC1通道配置为输出:CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。*/
TIM_OCInitStructure.TIM_Pulse=duty;
/*输出通道电平极性设置*/
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
/*初始化输出比较参数*/
TIM_OC1Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道1
TIM_OC2Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道2
TIM_OC3Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道3
TIM_OC4Init(TIMx,&TIM_OCInitStructure);//初始化TIM1 通道4
/*自动重装载*/
TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable);
/*使能计数器*/
TIM_Cmd(TIMx,ENABLE);
/*主输出使能,如果设置了相应的使能位(TIMx_CCER寄存器的CCxE、CCxNE位),则开启OC和OCN输出。*/
TIM_CtrlPWMOutputs(TIMx,ENABLE);
}
//高级定时器输出通道初始化函数
static void TB6612_ADVANCE_TIM_Gpio_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;
/*----------通道1配置--------------*/
/*定时器1输出比较通道*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/*配置为复用推挽输出*/
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/*-----------通道二配置-------------*/
/*定时器1输出比较通道*/
/*配置为复用推挽输出*/
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/*-----------通道三配置-------------*/
/*定时器1输出比较通道*/
/*配置为复用推挽输出*/
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/*-----------通道四配置-------------*/
/*定时器1输出比较通道*/
/*配置为复用推挽输出*/
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
————————————————
版权声明:本文为CSDN博主「果果小师弟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39400113/article/details/104063037