当前位置: 代码迷 >> 单片机 >> STM32 TIM4 输出比较模式 有关问题
  详细解决方案

STM32 TIM4 输出比较模式 有关问题

热度:648   发布时间:2016-04-28 14:41:18.0
STM32 TIM4 输出比较模式 问题
void TIM_Init(void) 
{
   RCC->APB1ENR|=1<<2;       //TIM4时钟
   TIM4->ARR   = 0xFFFF;         //
   TIM4->PSC   = 35;
   TIM4->CCR1  = 500;            // CCR1捕获比较值寄存器
  TIM4->CCMR1|=6<<4;        // CH1 PWM1模式
   TIM4->CCER|=1<<0;          //CC1通道配置为输出,OC1信号输出到相应管脚
  TIM4->DIER  = 0x03;          //使能CC1中断
  TIM4->CR1   = 0x81;          //使能计数器
   MY_NVIC_Init(5,1,TIM4_IRQChannel,3);
}

void TIM4_IRQHandler(void) 
{
  if (TIM4->SR&0x0002)
  {
     TIM4->SR=(~0x0002);
     Motor1_Driver(); 
     capture = TIM4->CCR1;
     TIM4->CCR1=capture+Motor1_Value; 
  }
}

第一个问题:
上面TIM_Init中断程序初始化完后,第一次进入中断,执行中断程序,然后主函数中TIM_Init()函数后面的程序执行不了了,奇怪,不知道怎么回事,是不是TIM4配置哪里有问题,

如下TIM1配置都可以用 没问题

RCC->APB2ENR|=1<<11;  
TIM1->ARR   = 0xFFFF;   
TIM1->PSC   = 35;               
           
TIM1->CCR1  = 0xFFFF;
//TIM1->CCR2  = 0xFFFF;

TIM1->RCR   = 0x00;  //立即更新

TIM1->DIER  = 0x03;   // 使能CC1中断
//TIM1->DIER  = 0x05;   //使能CC1、 CC2中断
TIM1->BDTR = 0x8000;  // 主输出使能
TIM1->CR1   = 0x81;   // 使能计数器

void TIM1_CC_IRQHandler(void)
{
   u16 temp;
   if (TIM1->SR&0x0002) 
  {
     TIM1->SR&=0xFFFD; 
     Motor2_Driver(); 
     temp=TIM1->CCR1;
    TIM1->CCR1=temp+Motor2_Value;
  }
//  else if (TIM1->SR&0x0004) 
//   {
//    TIM1->SR&=0xFFFB; 
//    Motor3_Driver(); 
//    temp=TIM1->CCR2;
//    TIM1->CCR2=temp+Motor3_Value;
//   }
}

第二个问题:
TIM1单独的CC1或CC2中断都可以用,但是如果TIM1加上屏蔽掉的代码,就是CC1、CC2两个都用,就又不行了。

求各位熟悉STM32输出比较模式的大虾指教,谢谢,调试困扰好久了,感激不尽!

------解决思路----------------------
你那个Motor2_Driver();函数是驱动电机函数吧,它涉及到硬件操作,所以执行时间很长。也就是说,当中断来临时,此函数执行,但由于执行时间较长,所以这个函数还没有执行完,下次中断就又来了,如此进行下去,当然执行不了后面的程序。建议你把那个函数放到主函数中,在中断函数中设置一个标识变量(全局),然后再主函数中判断是否执行。中断处理函数一定要干净利落。希望能帮到你。