STM32定时器同步功能1

STM32定时器同步功能1:将一个定时器用作另一个定时器的预分频器

测试程序说明:

测试芯片为STM32L151C8T6, 程序库使用的是LL库

用TIM3为主定时器,产生更新事件,并产生触发输出(TGRO)给TIM2,TIM2的时钟来自TIM3的TGRO信号,TIM2作为从定时器,配置为PWM输出模式。

内部触发连接如下图:

STM32定时器同步功能1

 

/**
  * 说明 : 从定时器初始化,用来生成PWM
  * 参数 : 无
  * 返回 : 无
  */ 
void Pwm_Timer_Init(void)
{
   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
   LL_TIM_InitTypeDef TIM_InitStruct = {0};
   LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
	
   LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
   LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
	
	/** PWM_OUT->PA0 */
	GPIO_InitStruct.Pin=LL_GPIO_PIN_0;
	GPIO_InitStruct.Mode=LL_GPIO_MODE_ALTERNATE;
	GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStruct.Pull=LL_GPIO_PULL_UP;
	GPIO_InitStruct.Alternate=LL_GPIO_AF_1;
	LL_GPIO_Init(GPIOA, &GPIO_InitStruct);	
	
	/** 定时器时基配置:注意此时TIM2的时钟源来自TIM3即100K */
   TIM_InitStruct.Prescaler = 9;  /** 10分频即10K */
   TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
   TIM_InitStruct.Autoreload = 9; /** 装载值10即周期为1KHz */
   TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
   LL_TIM_Init(TIM2, &TIM_InitStruct);
   LL_TIM_EnableARRPreload(TIM2);

	/** 输出模式配置 */
   TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
   TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
   TIM_OC_InitStruct.CompareValue = 5; /** 50%占空比 */
   TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
   LL_TIM_OC_Init(TIM2, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
   LL_TIM_OC_EnablePreload(TIM2, LL_TIM_CHANNEL_CH1);	
   LL_TIM_OC_DisableFast(TIM2, LL_TIM_CHANNEL_CH1);

	/** 触发模式 */
	LL_TIM_SetSlaveMode(TIM2, LL_TIM_SLAVEMODE_TRIGGER); /** 不要也行 */
  /** 选择输入触发源(即TIM3生成的时钟) */
	LL_TIM_SetTriggerInput(TIM2, LL_TIM_TS_ITR2); /** 选哪个看内部触发连接图,手册提供的 */
   LL_TIM_EnableMasterSlaveMode(TIM2);	
  /** 时钟源设置为模式1  */
	LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_EXT_MODE1);
	
   LL_TIM_CC_EnableChannel(TIM2, LL_TIM_CHANNEL_CH1);	
	LL_TIM_EnableCounter(TIM2);
   LL_TIM_GenerateEvent_UPDATE(TIM2);
}

/**
  * 说明 : 主定时器初始化,用来控制从定时器
  * 参数 : 无
  * 返回 : 无
  */
void Master_Timer_Init(void)
{
	LL_TIM_InitTypeDef TIM_InitStruct = {0};
   LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);	
	
	/** 定时器时基配置:输出频率100K */
   TIM_InitStruct.Prescaler = 31;
   TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
   TIM_InitStruct.Autoreload = 9;
   TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
   LL_TIM_Init(TIM3, &TIM_InitStruct);
   LL_TIM_EnableARRPreload(TIM3);

   LL_TIM_EnableMasterSlaveMode(TIM3);	
  /** 输出源选择:更新事件 */
	LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_UPDATE);
}

/**
  * 说明 : 使能定时器产生PWM
  * 参数 : 无
  * 返回 : 无
  */ 
void Start_Timer(void)
{
  LL_TIM_EnableCounter(TIM3);
   LL_TIM_GenerateEvent_UPDATE(TIM3);	
}

/**
  * 说明 : 关闭定时器产生PWM
  * 参数 : 无
  * 返回 : 无
  */ 
void Stop_Timer(void)
{
	LL_TIM_DisableCounter(TIM3);
	LL_TIM_ClearFlag_CC1(TIM3);	
}

 

输出波形图:

STM32定时器同步功能1

 

从波形可以看出输出的信号是一个频率为1KHz占空比50%的PWM波,和预期一致。

 

 

 

 

上一篇:STM32定时器同步功能2


下一篇:[学习笔记]STM32F1通用定时器-PWM(寄存器、标准库、HAL库)