于是我改成如下 
/* Private macro -------------------------------------------------------------*/ 
/* Private variables ---------------------------------------------------------*/ 
static uint32_t LSB = 0,MSB = 0; 
 
/** 
  * @brief  This function handles TIM3 global interrupt request. 
  * @param  None 
  * @retval : None 
  */ 
void TIM3_IRQHandler(void) 
{ 
  /* TIM2 CCR1 Register define the MSB of the captured value 
     TIM3 CCR1 Register define the LSB of the captured value  */ 
    if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)  // 检测到上升沿  计算低电平 
    { 
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); 
        MSB = TIM_GetCounter(TIM2); 
        LSB = TIM_GetCapture1(TIM3);        
        TIM_SetCounter(TIM2,0); 
        TIM_SetCounter(TIM3,0);         
 
        printf("M:%d,L:%d\r\n",MSB,LSB); 
         
         
    } 
     
    if(TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) // // 检测到下降沿   计算高电平 
    { 
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); 
        MSB = TIM_GetCounter(TIM2); 
        LSB = TIM_GetCapture1(TIM3); 
        TIM_SetCounter(TIM2,0); 
        TIM_SetCounter(TIM3,0); 
        printf("1M:%d,L:%d\r\n",MSB,LSB);         
    }   
     
      
} 
 
程序运行的结果是总是和理论值对应不上,16位的我有试过,所以对定时器计算方法和基本理解上应不会存在问题。 
脉宽长一点的,计算还凑合, 
短一点的,比如64us,怎么也对应不上, 
虽然printf也会花些时间,用的115200,但这个值是基本固定的,可以算出来再减去,但是还是对应不上。 
 
香主和各位兄弟看下,不胜感激涕零
 |