需实现的波形:定时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函数中初始化这四个函数就行。