查看STM32的手册,我们可以知道:TIMx 定时器可以从内部连接在一起,以实现定时器同步或级联。当某个定时器配置为主模式时, 可对另一个配置为从模式的定时器的计数器执行复位、启动、停止操作或为其提供时钟。
实现定时器内部时钟同步的方法有很多种,本文我们只进行一种,其他方式实现方法都差不多
使用一个定时器启动另一个定时器
void TIM1_MCLK_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_Init(GPIOB,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler=2-1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=21-1;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse=arr/2;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse=10;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Trigger);
TIM_SelectInputTrigger(TIM2,TIM_TS_ITR0);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
本例中使用定时器 1 的更新事件使能定时器 2,只要定时器 1 生成更新事件,定时器 2 便根据分频后的内部时钟从当前值(可以不为 0)开始计数。定时 器 2 收到触发信号时,其 CEN 位自动置 1,并且计数器开始计数,直到向 TIM2_CR1 寄存器的 CEN 位写入“0”后停止计数。
| ● 将定时器 1 配置为主模式,发送其更新事件 (UEV) 作为触发输出(TIM1_CR2 寄存器 中的 MMS=010)。
| ● 配置定时器 1 的周期(TIM1_ARR 寄存器)。
| ● 配置定时器 2 以接收来自定时器 1 的输入触发(TIM2_SMCR 寄存器中的 TS=000)。
| ● 将定时器 2 配置为触发模式(TIM2_SMCR 寄存器中的 SMS=110)。
| ● 通过向 CEN 位(TIM1_CR1 寄存器)写入“1”启动定时器 1