STM32笔记:STM32F407的TIM1和TIM2同步配置

查看STM32的手册,我们可以知道:TIMx 定时器可以从内部连接在一起,以实现定时器同步或级联。当某个定时器配置为主模式时, 可对另一个配置为从模式的定时器的计数器执行复位、启动、停止操作或为其提供时钟。

实现定时器内部时钟同步的方法有很多种,本文我们只进行一种,其他方式实现方法都差不多

使用一个定时器启动另一个定时器

void TIM1_MCLK_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	//TIM1时钟使能    
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);		//TIM2时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE); 	//使能PORTA|PORTB时钟	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_TIM1);  //GPIO A11复用为定时器1
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2);   //GPIO B3复用为定时器2
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_3;           //GPIO	PB3|PA11
	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);              //初始化PA
	GPIO_Init(GPIOB,&GPIO_InitStructure);              //初始化PB
	  
	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);//初始化定时器1
	
	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);//初始化定时器2
	
	//初始化TIM1 Channe2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性
	TIM_OCInitStructure.TIM_Pulse=arr/2;
	
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 OC1
	
	TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);//配置使能TIM1 为主模式
	TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器2模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性
	TIM_OCInitStructure.TIM_Pulse=10;
	
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);//通道2
	TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Trigger);//设置TIM2为从模式
	TIM_SelectInputTrigger(TIM2,TIM_TS_ITR0);	//内部触发0,由TIM1触发计数

	TIM_Cmd(TIM2, ENABLE);  //使能TIM2
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
	
	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

你可能感兴趣的:(STM32)