这个例程是野火的通用定时器同步章节,使用的是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