TIM5_CAP实验,串口接收第一个字母丢失

2019-10-14 20:35发布

IAR编译环境下,请大神看看这是什么情况?
#include"sys.h"
#include"delay.h"
#include"usart.h"
#include"tim5_cap.h"

extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值       
int main(void)
{
  u32 temp=0;
  delay_init();
  NVIC_Configuration();
  uart_init(9600);
  TIM5_CAP_Init(0xffff,71);
  while(1)
  {
    delay_ms(100);
    if(TIM5CH1_CAPTURE_STA&0X80)
    {
      temp=TIM5CH1_CAPTURE_STA&0X3F;
      temp*=65536;
      temp+=TIM5CH1_CAPTURE_VAL;
      printf("HIGH:%d us ",temp);
      TIM5CH1_CAPTURE_STA=0;
    }
  }
}

#include"tim5_cap.h"

void TIM5_CAP_Init(u16 arr,u16 psc)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);        //使能TIM5时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                               
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                  
  GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
  GPIO_ResetBits(GPIOA,GPIO_Pin_0);

  TIM_TimeBaseInitStructure.TIM_Period=arr;
  TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
  TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStructure);

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x00;
  TIM_ICInit(TIM5, &TIM_ICInitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

  TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1, ENABLE);
  TIM_Cmd(TIM5, ENABLE);

}

u8 TIM5CH1_CAPTURE_STA=0;
u16 TIM5CH1_CAPTURE_VAL=0;


void TIM5_IRQHandler(void)
{
  if((TIM5CH1_CAPTURE_STA&0X80)==0)//最高位是否为0,为0为输入捕获还没有完成
  {
    if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)//溢出中断
    {
     if(TIM5CH1_CAPTURE_STA&0X40)
     {
       if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)
       {
         TIM5CH1_CAPTURE_STA|=0X80;//强制标记捕获完成
         TIM5CH1_CAPTURE_VAL=0XFFFF;
       }
       else TIM5CH1_CAPTURE_STA++;
     }
    }
    if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)//捕获1发生捕获事件
    {
      if(TIM5CH1_CAPTURE_STA&0X40)
      {
        TIM5CH1_CAPTURE_STA|=0X80;
        TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
        TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
      }
      else
      {
        TIM5CH1_CAPTURE_STA=0;
        TIM5CH1_CAPTURE_VAL=0;
        TIM_SetCounter(TIM5,0);
        TIM5CH1_CAPTURE_STA|=0X40;
        TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
      }
    }
  }
  TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1);
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。