stm32f0求助!中断后不能跳转回

[复制链接]
1624|3
手机看帖
扫描二维码
随时随地手机跟帖
wago2008|  楼主 | 2013-1-13 16:23 | 显示全部楼层 |阅读模式
我是用tim2控制pwm输出伪232通信,发现tim2中断后无法停止,请大家看看。
void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA Clocks enable */
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
  
  /* GPIOA Configuration: Channel 1, 2, 3 and 4 as alternate function push-pull */
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ;
  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(GPIOB, GPIO_PinSource1, GPIO_AF_1);
}
  int PV_pwm_init(void)
{
TIM_Config();
TimerPeriod = (SystemCoreClock / 100000 ) - 1;
Channel4Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod- 1)) / 10);
/* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3EN , ENABLE);
/* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* Channel 1, 2, 3 and 4 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_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_OCInitStructure.TIM_Pulse = Channel4Pulse;
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);
return 0;
}
int main(void)
{
wago2008|  楼主 | 2013-1-13 16:25 | 显示全部楼层
int main(void)
{
        char a_pwm_test[]={55,55,55,55,55,55,55,55,55,55};
        PV_pwm_init();
        Init_TM2();
        while(PWMInterface_char(a_pwm_test,10)==0)
        {
                while(PWMInterface_char(a_pwm_test,10)!=0);
                testnum++;
        }
       
        return 0;
}
void Init_TM2(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
          TIM_OCInitTypeDef        TIM_OCInitStructure;
          NVIC_InitTypeDef         NVIC_InitStructure;
        // TIM3 Periph clock enable
          // 定时器2外设时钟使能
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        // TIM2 Configuration
          // 定时器2配置
          TIM_DeInit(TIM2);
  
          // 配置定时器2内部时钟
          TIM_InternalClockConfig(TIM2);
          TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
          TIM_OCStructInit(&TIM_OCInitStructure);
          // Time base configuration
          // 时间基数配置
          //设定1s一次
          TIM_TimeBaseStructure.TIM_Period = 0x4480;
          TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
          TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
          TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
          TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
         // TIM2 TRGO selection
          // 定时器TRGO选择
          TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
          //优先级最低
          //nvic
          NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
wago2008|  楼主 | 2013-1-13 16:27 | 显示全部楼层
int SEND_Proc(void)
{
  send_completechar=0;//发送未完成
TIM_Cmd(TIM2, ENABLE);
  while(1)
  {
  if(send_completechar==1)//发送已完成
  {
   TIM_Cmd(TIM2, DISABLE);
   //pwm is close ? close
   if(pwmflag==0)//0 is open
    {
     //如果状态开启则关闭
      TIM_CtrlPWMOutputs(TIM3, DISABLE);
      TIM_Cmd(TIM3, DISABLE);
     pwmflag=1;
    }
   //init bit control
   pwmout_numbit=0;
   //send next byte
   pwmout_numbyte++;
   return 0;
  }
}
}

  int PWMInterface_char(char arry[],int numarry)
{
  int i;
char norm=0x01;
pwmout_numbyte=0;
  if((arry==0)||(numarry<=0))
   {
   return -1;
   }
  else
   {
    //loop send byte end to complete send
   while((numarry-pwmout_numbyte)>0)
    {
     //get every bit add head and end
     for(i=0;i<10;i++)
      {
       if(i==0)
        {
         //add head
         pwmtim_swap[0]=0;
        }
       else if(i==9)
        {
         //add end
         pwmtim_swap[9]=1;
        }
       else
        {
         if((arry[pwmout_numbyte]&(norm<<(i-1)))>0)
          {
           pwmtim_swap[i]=1;
          }
         else
          {
           pwmtim_swap[i]=0;
          }
        }
      }
     //begain send
     while(SEND_Proc());
      //check byte send
      if(pwmout_numbyte==numarry)
       {
       //get every bit add head and end
       for(i=0;i<10;i++)
        {
         if(i==0)
          {
           //add head
           pwmtim_swap[0]=0;
          }
         else if(i==9)
          {
           //add end
           pwmtim_swap[9]=1;
          }
         else
          {
           if((((char)pwmout_numbyte)&(norm<<(i-1)))>0)
            {
             pwmtim_swap[i]=1;
            }
           else
            {
             pwmtim_swap[i]=0;
            }
          }
        }
       //begain send check byte
       while(SEND_Proc());
       }
     
    }
   }
  return 0;
}

使用特权

评论回复
wago2008|  楼主 | 2013-1-13 16:29 | 显示全部楼层
中断程序
void TIM2_IRQHandler(void)
{  
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {      
   if(send_completechar==0)  //发送未完成
    {
      //计数138次
     if(count_pwm==0)
      {
       count_pwm=0;
        if(pwmout_numbit==9)
         {
         send_completechar=1;//已经传输完成10 bit(这里已经完成了)
         //TIM_Cmd(TIM2, DISABLE);
         }
        else
         {
         if(pwmtim_swap[pwmout_numbit]==1)
          {
           //open pwm tim
            if(pwmflag==1)// 1 is close
             {
              //如果状态关闭则开启
              TIM_CtrlPWMOutputs(TIM3, ENABLE);
              TIM_Cmd(TIM3, ENABLE);
              pwmflag=0;
             }
          }
         else
          {
           //close pwm tim
           if(pwmflag==0)//0 is open
            {
             //如果状态开启则关闭
              TIM_CtrlPWMOutputs(TIM3, DISABLE);
              TIM_Cmd(TIM3, DISABLE);
             pwmflag=1;
            }
           }
         pwmout_numbit++;
        }
     
      }
     else
      {
      }
    }
   TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
  }
}
发现根本跳不回SEND_Proc的if(send_completechar==1)//发送已完成

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

81

帖子

2

粉丝