stm32f072一个主定时器计时触发两个从定时器同时产生单次脉冲

需实现的波形:定时25ms产生一互补脉冲

 

程序实现:TIM2计时25ms周期,作为主定时器触发TIM1_CH1和TIM3_CH3产生单次脉冲。

主要参数分析:

定时器2作为主控制器设置触发输出: TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);

设置TIM2->CR2的bit6:4=010

定时器1:作为从定时器,被触发后产生单次脉冲

 (1) 、TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//单脉冲模式  

对应寄存器:TIM1->CR1的bit3=1

 
(2)、TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1);//定时器2内部触发

对应寄存器:TIM1->SMCR |= 0x0010;也就是bit6:4=001;是先看表43得知由TIM2触发的话是ITR1,然后ITR1对应寄存器值是001.

   (3) 、TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);

对应寄存器:TIM1->SMCR |= 0X0006; 也就是bit2:0=110

定时器3的设置和定时器1相同:

    TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//单脉冲模式    
      /* Input Trigger selection */
    TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);//定时器2内部触发


  /* Slave Mode selection: Trigger Mode */
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);    

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能GPIO时钟 */
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
  
  /* 配置GPIO管脚复用 :PA8: T1_CH1 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* 配置GPIO管脚复用 PB0: T3_CH3*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_1);	

}
/*****************************************************************************************
*函 数 名:TIM_PWM_Config
*函数说明:定时器1配置
*形    参:定时器使能flag:ENABLE  DISABLE
***************************************************************************************************/
void TIM_PWM_Config(FunctionalState flag)
{
   uint16_t Channel1Pulse = 0 , PrescalerValue = 0,Pulse1_TimerPeriod;
	/* TIM1 的配置 ---------------------------------------------------
   SystemCoreClock 为48 MHz 
	
	周期:180us,输出180us的高电平
	*/  
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 
	NVIC_InitTypeDef NVIC_InitStructure;
    /*计算预定表的值,也就是多少个时钟计数为一个周期*/
    Pulse1_TimerPeriod= (SystemCoreClock / 5555 ) - 1; // 5555= (1/180us)*1000000
  /*计算CCR1 跳转值 占空比100%*/
  Channel1Pulse =1;
  /* TIM1 时钟使能 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
  
  /* Time 定时基础设置*/
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/
  TIM_TimeBaseStructure.TIM_Period = Pulse1_TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* 频道1,2,3,4的PWM 模式设置 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;//使能频道1配置
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
			
  TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//单脉冲模式
/* Input Trigger selection */
  TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1);//定时器2内部触发

  /* Slave Mode selection: Trigger Mode */
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);
 /* TIM1 计算器使能*/
  TIM_Cmd(TIM1, flag);	
 /* TIM1 主输出使能 */
  TIM_CtrlPWMOutputs(TIM1, flag);
}
/*****************************************************************************************
*函 数 名:TIM2_PWM_Config
*函数说明:定时器2配置
*形    参:定时器使能flag:ENABLE  DISABLE
***************************************************************************************************/
void TIM2_PWM_Config(FunctionalState flag)
{
   uint16_t PrescalerValue = 0,Pulse2_TimerPeriod;
	/* TIM2 的配置 ---------------------------------------------------
   SystemCoreClock 为48 MHz	
	定时器时钟1000000hz
	输出频率40hz
	*/  
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	 PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;
	 Pulse2_TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;
	
  /* TIM1 时钟使能 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , flag);
  
  /* Time 定时基础设置*/
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/
  TIM_TimeBaseStructure.TIM_Period = Pulse2_TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
	TIM_ARRPreloadConfig(TIM2, flag);

	  /* Trigger of TIM2 Update into TIM1 Slave */
	TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
  /* TIM1 计算器使能*/
  TIM_Cmd(TIM2, flag);

}

void TIM3_PWM_Config(FunctionalState flag)
{
   uint16_t PrescalerValue = 0,time3_Channel3Pulse , Pulse3_TimerPeriod;
	/* TIM2 的配置 ---------------------------------------------------
   SystemCoreClock 为48 MHz	
	输出周期360us
	占空比:180us= 50%
	*/  
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	Pulse3_TimerPeriod = (SystemCoreClock / 2770 ) - 1;
  /*计算CCR1 跳转值 在占空比为50%时*/
  time3_Channel3Pulse = (uint16_t) (((uint32_t) 50 * (Pulse3_TimerPeriod - 1)) / 100);	
  /* TIM1 时钟使能 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , flag);
  
  /* Time 定时基础设置*/
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  /* Time 定时设置为上升沿计算模式*/
  TIM_TimeBaseStructure.TIM_Period = Pulse3_TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* 频道3PWM 模式设置 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM_OCPolarity_Low
  TIM_OCInitStructure.TIM_Pulse = time3_Channel3Pulse;//使能频道1配置
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);

//	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 
 	
	TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//单脉冲模式
	
	  /* Input Trigger selection */
  TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);//定时器2内部触发

  /* Slave Mode selection: Trigger Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);

  /* TIM1 计算器使能*/
  TIM_Cmd(TIM3, flag);
	 /* TIM1 主输出使能 */
  TIM_CtrlPWMOutputs(TIM3, flag);

	}

使用:在main函数中初始化这四个函数就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值