于是我改成如下
/* 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,但这个值是基本固定的,可以算出来再减去,但是还是对应不上。
香主和各位兄弟看下,不胜感激涕零
|