先上效果图
代码如下,直接调用“TIM4_TIM3_PulseOut”就可以输出两路波形
/***************************************************************************************
* 2018/11/26 - 14:46:02
* 主定时器4
* 从定时器3
* 配置主机模式
* 选择通道 SelectChannel
* 当前通道输出频率 Cycle
***************************************************************************************/
static void Tim4Tim3Config(uint32_t Cycle, unsigned short PulseNum)
{
uint16_t Prescaler = SystemCoreClock / 1000000;
uint16_t Period = 1000000 / Cycle;
TIM_DeInit(TIM3);
TIM_DeInit(TIM4);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_TIM4 , ENABLE); // 复用端口映射
GPIO_Init(GPIOD, &(GPIO_InitTypeDef){GPIO_Pin_13|GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_PP});
TIM_TimeBaseInit(TIM3, &(TIM_TimeBaseInitTypeDef) {
.TIM_Prescaler =0, // 设置预分频
.TIM_CounterMode = TIM_CounterMode_Up, // 向上计数模式
.TIM_Period = PulseNum>1?PulseNum-1:PulseNum, // 时钟分频因子
.TIM_ClockDivision = TIM_CKD_DIV1, // 预分频系数
.TIM_RepetitionCounter = 0,
});
TIM_TimeBaseInit(TIM4, &(TIM_TimeBaseInitTypeDef) {
.TIM_Prescaler =Prescaler-1, // 设置预分频
.TIM_CounterMode = TIM_CounterMode_Up, // 向上计数
.TIM_Period = Period-1,
.TIM_ClockDivision = TIM_CKD_DIV1, // 时钟分频为1
.TIM_RepetitionCounter = 0,
});
NVIC_Init(&(NVIC_InitTypeDef) {
.NVIC_IRQChannel = TIM3_IRQn,
.NVIC_IRQChannelPreemptionPriority = 0,
.NVIC_IRQChannelSubPriority = 1,
.NVIC_IRQChannelCmd = ENABLE,
});
// TIM_SetCounter(TIM4, Period );
TIM_OC2Init(TIM4, &(TIM_OCInitTypeDef) {
.TIM_OCMode = TIM_OCMode_PWM2, // 设置PWM输出模式
.TIM_OutputState = TIM_OutputState_Enable,
.TIM_OutputNState = TIM_OutputNState_Disable,
.TIM_Pulse = Period / 2, // 设置占空比
.TIM_OCPolarity = TIM_OCPolarity_High, // 空闲默认为高电平,因为第一个脉冲款是后面的两倍,电机是上升沿触发,所以此处设置为高
.TIM_OCNPolarity = TIM_OCNPolarity_Low,
.TIM_OCIdleState = TIM_OCIdleState_Reset,
.TIM_OCNIdleState = TIM_OCNIdleState_Reset
});
TIM_OC4Init(TIM4, &(TIM_OCInitTypeDef) {
.TIM_OCMode = TIM_OCMode_PWM2, // 设置PWM输出模式
.TIM_OutputState = TIM_OutputState_Enable,
.TIM_OutputNState = TIM_OutputNState_Disable,
.TIM_Pulse = Period / 2, // 设置占空比
.TIM_OCPolarity = TIM_OCPolarity_High, // 空闲默认为高电平,因为第一个脉冲款是后面的两倍,电机是上升沿触发,所以此处设置为高
.TIM_OCNPolarity = TIM_OCNPolarity_Low,
.TIM_OCIdleState = TIM_OCIdleState_Reset,
.TIM_OCNIdleState = TIM_OCNIdleState_Reset
});
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_External1);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); // 设置主从机模式
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update); // 更新事件被选为触发输入TRGO、一个主定时器的时钟可以用作另一个从定时器的预分频器
TIM_ARRPreloadConfig(TIM4, ENABLE); // 使能自动重装载
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); // CC2通道被配置为输入、IC2映射在TRC上。此模式仅工作在内部触发器输入被选中时
}
//
/***************************************************************************************
* 2018/11/26 - 14:06:52
* 主定时器 TIM4
* 从定时器 TIM3
***************************************************************************************/
void TIM4_TIM3_PulseOut(uint32_t Cycle,uint32_t PulseNum)
{
Tim4Tim3Config(Cycle, PulseNum);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
TIM_Cmd(TIM4, ENABLE);
}
//
/***************************************************************************************
* 2018/11/26 - 14:07:41
* 从定时器计数个数
***************************************************************************************/
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
TIM_Cmd(TIM3, DISABLE);
TIM_Cmd(TIM4, DISABLE);
}
}
//