你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教 一个STM8 定时器TIM1 PWM 输出的问题(TIM1 ARR被异常赋0)

[复制链接]
项目经理 提问时间:2011-11-23 15:51 /

  各位高手,最近遇到一个STM8 PWM输出的怪问题, 我在初始化里配置TIM1 为PWM 输出模式, 输出的脉冲是用来供给步进电机细分驱动器的,每次TIM1更新中断时重新对ARR,CCR 赋初值。 但是系统经常是过一段时间,ARR就变成0了,查了好久也不知道是什么原因造成的,请大家帮忙看一下,下面是初始化程序 ,和中断处理程序
void InitTime1(void)
{
  /******************************************
  ***********************************************/
  TIM1->CCMR1 |= 0x78;      /* Output mode PWM2.TIM_CNT>TIM_CCR时,输出有效电平,使能预装载                      */
    //TIM1->CCMR1 |= 0x70;      /* Output mode PWM2.TIM_CNT>TIM_CCR时,输出有效电平,使能预装载                      */  
   TIM1->CCER1 |= 0x03;      /* CC polarity high,enable PWM output      */
  TIM1->ARRH    = 0x07;         /* Freq control register: ARR             */
    TIM1->ARRL    = 0xD0;         /* Freq control register: ARR             */
 
  TIM1->CCR1H   = 0x03;         /* Dutycycle control register: CCR        */
    TIM1->CCR1L  = 0XE8;      /* Dutycycle control register: CCR        */
  TIM1->BKR    |=0X80;    //MOE =1;主输出使能
  //TIM1->RCR=200;
  TIM1->RCR=10;
  TIM1-&gtSCRH = 00;
  //TIM1-&gtSCRL = 0x1F;      ///32分频=16M/32=500KHZ
    TIM1-&gtSCRL = 0x07;//8分频=16M/8=2000KHZ 
  TIM1->CR1   |= 0x81;      /* Enable TIM3.   TIM3->ARR通 过预装载寄存器缓冲      */
    //TIM1->CR1   |= 0x01;      /* Enable TIM1.   TIM3->ARR立 即写入影子寄存器    */
    TIM1->IER |= 0x01; //充许更新中断  UIE
 }
 
#ifdef _COSMIC_
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
#else /* _RAISONANCE_ */
void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) interrupt 11
#endif /* _COSMIC_ */
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
 //-----共100 cycle 共6.25us
   unsigned int waittabletemp;
   unsigned int ccrtemp;
//--------------------------------------------------//
//----------------------------------------------//  
 
//-------------------------------------
  TIM1->CR1   &= (~0x01); //关闭计数器
#if  ACC_CELE_EN==1
if(ArrTemp!=0) //==0时不执行
{
switch(AccCeleState)
 {
  case 0 :{
         TIM1->ARRH = (u8)(ArrTemp>>8);
          TIM1->ARRL = (u8)ArrTemp;
          ccrtemp=ArrTemp>>1;
     TIM1->CCR1H   =(u8)(ccrtemp>>8);         //Dutycycle control register: CCR
     TIM1->CCR1L  = (u8)(ccrtemp);   
     break;
     }
 
  case 1 :{              //加速
     waittabletemp=WaitTable[ArrLastI+ArrLastI2];
        TIM1->ARRH = (u8)(waittabletemp>>8);
          TIM1->ARRL = (u8)waittabletemp;
     ccrtemp=waittabletemp>>1;
          TIM1->CCR1H   =(u8)(ccrtemp>>8);         //Dutycycle control register: CCR
     TIM1->CCR1L  = (u8)(ccrtemp);  
      if((ArrLastI+ArrLastI2++)==ArrI)
       {
      ArrLastI2=0; //复位
      AccCeleState=0; //转为匀速
      ArrTempLast=ArrTemp;
      }
      break;
     } 
 case 2 :{     //减速
        waittabletemp=WaitTable[ArrLastI-ArrLastI3];
        TIM1->ARRH = (u8)(waittabletemp>>8);
          TIM1->ARRL = (u8)waittabletemp;
         ccrtemp=waittabletemp>>1;
          TIM1->CCR1H   =(u8)(ccrtemp>>8);         //Dutycycle control register: CCR
     TIM1->CCR1L  = (u8)(ccrtemp);    
      if((ArrLastI-ArrLastI3++)==ArrI)
       {
      ArrLastI3=0; //复位
      AccCeleState=0; //转为匀速
      ArrTempLast=ArrTemp;
      }
     break;
      }
 }
 
}

#endif
//----------------------------------------------------

  TestRcr++;

   TIM1->SR1 &= ~0x01;
  
  TIM1->CR1   |= 0x01; //开计数器 

}
 
收藏 评论2 发布时间:2011-11-23 15:51

举报

2个回答
废鱼 回答时间:2011-11-23 21:00:48

RE:请教 一个STM8 定时器TIM1 PWM 输出的问题(TIM1 ARR被异常赋0)

waittabletemp=WaitTable[ArrLastI+ArrLastI2];
这个你有考虑过吗?会不会为0?
项目经理 回答时间:2011-11-25 13:33:37

回复:请教 一个STM8 定时器TIM1 PWM 输出的问题(TIM1 ARR被异常赋0)

找到原因了,问题在于waittabletemp=WaitTable[ArrLastI+ArrLastI2] 这个变量所指向的查找表有时会越界,造成waittabletemp变0,ARR也就为0了,,是我的大意造成的,还以为是硬件的问题的。
    多谢楼上的提醒!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版