STM32F4定时器的主从模式,主模式PWM输出,从模式设置为输出比较,进不了中断

Blueyas 2016-03-07 09:30:06

我用定时器4配置成PWM输出,同时做为主模式,定时器5配置为输出比较模式,作为从模式。为什么定时器5没有进输出比较的中断里面

void Timer4_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

/* GPIOD clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

//ÅäÖÃTIM4μÄDÅoÅêä3ö1ü½ÅÎaPD12£¬OC1í¨μ࣬êä3öSINCDÅoÅ
/* TIM4 channel 1 pin (PD12) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);


/* Connect TIM pins to AF2 */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);

/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 4-1; //84M/4=21Mhz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 700; //21M/700=30Khz.
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);


/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 350; //50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM4, &TIM_OCInitStructure);

/* Master Mode selection: TIM1 */
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);//
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);

/* TIM enable counter */
TIM_Cmd(TIM4, ENABLE);

/* TIM1 Main Output Enable */
TIM_CtrlPWMOutputs(TIM4,ENABLE);

}

void Timer5_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/* TIM9 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
/* GPIOE clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

/* Configure PD11 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD, GPIO_Pin_11);


TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

/* Slave Mode selection: TIM4 */
TIM_SelectInputTrigger(TIM5, TIM_TS_ITR2);
TIM_SelectSlaveMode(TIM5, TIM_SlaveMode_Trigger);

TIM_SetCompare1(TIM5,20);
TIM_SetCompare2(TIM5,30);
TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE);
TIM_ITConfig(TIM5,TIM_IT_CC2,ENABLE);

/* TIM enable counter */
TIM_Cmd(TIM5, ENABLE);
}

void TIM5_IRQHandler(void)
{
if(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC1) == SET)
{
GPIO_SetBits(GPIOD, GPIO_Pin_11);
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);

}
if(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC2) == SET)
{
GPIO_ResetBits(GPIOD, GPIO_Pin_11);
TIM_ClearITPendingBit(TIM5,TIM_IT_CC2);
}
}
...全文
1247 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Blueyas 2016-03-26
  • 打赏
  • 举报
回复
已解决,配置错误
Blueyas 2016-03-17
  • 打赏
  • 举报
回复
中断那些初始化区别写了,主要看输出比较,和主从部分有什么问题
Eric Hu 2016-03-17
  • 打赏
  • 举报
回复
1:初始化好,时钟,引脚,中断enable等 2:配置nvic,注意不要冲突 3:软件测试,上仿真器在线调 4:硬件测试,示波器,引脚测对,还要保证芯片完好(有时候就当个引脚硬件坏了)
码农Ben 2016-03-12
  • 打赏
  • 举报
回复
我也不是很了解,不过NVIC应该要配吧。 类似:
    /* Enable the TIM4 gloabal Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
Blueyas 2016-03-11
  • 打赏
  • 举报
回复
自己顶

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧