通用定时器的级联同步输出

这个例程是野火的通用定时器同步章节,使用的是STM32F103VET6

#ifndef __GENERAL_TIM_H
#define	__GENERAL_TIM_H

#include "stm32f10x.h"

/* 定时器 */
#define GENERAL_TIM_MASTER     		  TIM2
#define GENERAL_TIM_MASTER_CLK        RCC_APB1Periph_TIM2

#define GENERAL_TIM_SLAVE1     		  TIM3
#define GENERAL_TIM_SLAVE1_CLK        RCC_APB1Periph_TIM3

#define GENERAL_TIM_SLAVE11     	  TIM4
#define GENERAL_TIM_SLAVE11_CLK       RCC_APB1Periph_TIM4

/* TIM主模式PWM输出引脚 */
#define GENERAL_MASTER_PIN            GPIO_Pin_10             
#define GENERAL_MASTER_GPIO_PORT      GPIOB                      
#define GENERAL_MASTER_GPIO_CLK       RCC_APB2Periph_GPIOB

/* TIM从模式PWM输出引脚 */
#define GENERAL_SLAVE1_PIN            GPIO_Pin_6             
#define GENERAL_SLAVE1_GPIO_PORT      GPIOC                      
#define GENERAL_SLAVE1_GPIO_CLK       RCC_APB2Periph_GPIOC

/* TIM从模式的从模式PWM输出引脚 */
#define GENERAL_SLAVE11_PIN           GPIO_Pin_6             
#define GENERAL_SLAVE11_GPIO_PORT     GPIOB                      
#define GENERAL_SLAVE11_GPIO_CLK      RCC_APB2Periph_GPIOB

void TIMx_Configuration(void);

#endif
#include "./tim/bsp_general_tim.h"

static void TIMx_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能GPIO时钟 */
  RCC_APB2PeriphClockCmd(GENERAL_MASTER_GPIO_CLK | GENERAL_SLAVE1_GPIO_CLK | GENERAL_SLAVE11_GPIO_CLK, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
  GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);    // 完全重映像TIM2_CH3->PB10
  GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);    // 完全重映像TIM3_CH1->PC6
  /* GPIO 配置: PC6(TIM3 CH1) 作为推挽复用输出功能 ------*/
  GPIO_InitStructure.GPIO_Pin = GENERAL_SLAVE1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_SLAVE1_GPIO_PORT, &GPIO_InitStructure);
  /* GPIO 配置: PB6(TIM4 CH1) 作为推挽复用输出功能 ------*/
  GPIO_InitStructure.GPIO_Pin = GENERAL_SLAVE11_PIN;
  GPIO_Init(GENERAL_SLAVE11_GPIO_PORT, &GPIO_InitStructure);
  /* GPIO 配置: PB10(TIM2 CH3) 作为推挽复用输出功能 ------*/
  GPIO_InitStructure.GPIO_Pin = GENERAL_MASTER_PIN;
  GPIO_Init(GENERAL_MASTER_GPIO_PORT, &GPIO_InitStructure);
}

static void TIM_Mode_Config(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;

  /* 使能TIM时钟  */
  RCC_APB1PeriphClockCmd(GENERAL_TIM_MASTER_CLK | GENERAL_TIM_SLAVE1_CLK | GENERAL_TIM_SLAVE11_CLK, ENABLE);
  /* 时基配置 */
  TIM_TimeBaseStructure.TIM_Period = 72 - 1;                                // 自动重装载值 72MHz/1/72=1Mhz,1us触发一次更新事件
  TIM_TimeBaseStructure.TIM_Prescaler = 0;                                  // 预分频系数 1-1=0
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                   // 时钟分频因子,不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               // 向上计数
  TIM_TimeBaseInit(GENERAL_TIM_MASTER, &TIM_TimeBaseStructure);             // 初始化定时器
  // 自动重装载值 现在从定时器1的频率由主定时器决定,故以1us的速度增加5次及5us才能触发更新事件
  TIM_TimeBaseStructure.TIM_Period = 5 - 1;
  TIM_TimeBaseInit(GENERAL_TIM_SLAVE1, &TIM_TimeBaseStructure);
  // 自动重装载值 现在从定时器2的频率由从定时器1决定,故以5us的速度增加5次及25us才能触发更新事件
  TIM_TimeBaseStructure.TIM_Period = 5 - 1;
  TIM_TimeBaseInit(GENERAL_TIM_SLAVE11, &TIM_TimeBaseStructure);

  /* 主 设置成PWM1模式 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                          // PWM1模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;              // 输出使能
  TIM_OCInitStructure.TIM_Pulse = 36;                                        // 主定时器占空比(36/72[自动重装载值]=50%)
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                  // 有效电平为高电平
  TIM_OC3Init(GENERAL_TIM_MASTER, &TIM_OCInitStructure);                     // 初始化 TIM2 输出通道3
  TIM_SelectMasterSlaveMode(GENERAL_TIM_MASTER, TIM_MasterSlaveMode_Enable); // 使能“主从模式”
  TIM_SelectOutputTrigger(GENERAL_TIM_MASTER, TIM_TRGOSource_Update);        // 输出触发源选项
  /* 从1 设置成PWM1模式 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                          // PWM1模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;              // 输出使能
  TIM_OCInitStructure.TIM_Pulse = 1;                                         // 从定时器1占空比(1/5[自动重装载值]=20%)
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                  // 有效电平为高电平
  TIM_OC1Init(GENERAL_TIM_SLAVE1, &TIM_OCInitStructure);                     // 初始化 TIM3 输出通道1
  TIM_SelectMasterSlaveMode(GENERAL_TIM_SLAVE1, TIM_MasterSlaveMode_Enable); // 使能“主从模式”
  TIM_SelectOutputTrigger(GENERAL_TIM_SLAVE1, TIM_TRGOSource_Update);        // 输出触发源选项
  /* 从2 设置成PWM1模式 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           // PWM1模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               // 输出使能
  TIM_OCInitStructure.TIM_Pulse = 1;                                          // 从定时器2占空比(1/5[自动重装载值]=20%)
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                   // 有效电平为高电平
  TIM_OC1Init(GENERAL_TIM_SLAVE11, &TIM_OCInitStructure);                     // 初始化 TIM4 输出通道1
  TIM_SelectMasterSlaveMode(GENERAL_TIM_SLAVE11, TIM_MasterSlaveMode_Enable); // 使能“主从模式”
  TIM_SelectOutputTrigger(GENERAL_TIM_SLAVE11, TIM_TRGOSource_Update);        // 输出触发源选项

  TIM_SelectSlaveMode(GENERAL_TIM_SLAVE1, TIM_SlaveMode_Gated); // 从模式配置 : TIM3
  TIM_SelectInputTrigger(GENERAL_TIM_SLAVE1, TIM_TS_ITR1);      // 设置输入触发源

  TIM_SelectSlaveMode(GENERAL_TIM_SLAVE11, TIM_SlaveMode_Gated); // 从模式配置 : TIM4
  TIM_SelectInputTrigger(GENERAL_TIM_SLAVE11, TIM_TS_ITR2);      // 设置输入触发源

  /* TIM 计数器溢出启用 */
  TIM_Cmd(GENERAL_TIM_SLAVE1, ENABLE);
  TIM_Cmd(GENERAL_TIM_MASTER, ENABLE);
  TIM_Cmd(GENERAL_TIM_SLAVE11, ENABLE);
}

/**
 * @brief  初始化通用定时器级联同步PWM输出
 * @param  无
 * @retval 无
 */
void TIMx_Configuration(void)
{
  TIMx_GPIO_Config();
  TIM_Mode_Config();
}

TIM2是主定时器           

频率为1Mhz,占空比为50% ,周期为1us  

TIM3是从定时器1       

频率由TIM2(主定时器)的周期(1us)决定,占空比为20%,因为自动重装载值为5,所以周期为5us 

TIM4是从定时器2

频率由TIM3(从定时器1)的周期(5us)决定,占空比为20%,因为自动重装载值为5,所以周期为25us 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值