关于 STM32F103接收中断超时处理总是收一个字节

2019-08-14 06:18发布

请问 红 {MOD}是我标记上的 我是用个10ms定时器 然后再串口中断接收函数里 如果时间超过10ms就认为接收完成 ,在main函数里就是给接收的先打印出来。发现第一次必须发一个字节(如果发多了就死了) 然后 在多发就正常了。。。。  这是为什么啊  我找了一天没找出个原因来
u8 RxTimerout = 3;
u16 yyy=0;

UART_HandleTypeDef huart1;//huart1句柄
TIM_HandleTypeDef htim3;

__align(8) u8 USART1_TX_BUF[200];         //????,??USART2_MAX_SEND_LEN??
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
int i=0;

/*接收状态
*bit15,        接收完成标志
*bit14,        接收到0x0d
*bit13~0,        接收到的有效字节数目
*/
u16 USART_RX_STA=0;       //接收状态标记       

u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
/* USER CODE END 2 */

/* USER CODE BEGIN printf */
/*如果使用printf函数需要开启下面函数*/
#if 1
#pragma import(__use_no_semihosting)                             
struct __FILE
{
        int handle;
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{           
        while((USART1->ISR & 0x40) == RESET);
        USART1->TDR = (u8)ch;       
       
        return ch;
}
#endif

/* USER CODE END printf */

/* USART1 init function */
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1 2 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
        HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE);
/* USER CODE END USART1  */
}



#if 0



/*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{       
        u8 Rec;       

        Rec=*(--(huart->pRxBuffPtr));
         /* USER CODE BEGIN USART1_Receive_callback 1 */
        if(huart->Instance==USART1)//如果是串口1
        {
       
                        if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                                       
                                                                       
                                        if(RxTimerout==0)
                                                {
                                                        yyy=0;
                                                        USART_RX_STA |= 0x8000;
                                                }
                                        RxTimerout = 3;       
                                        USART_RX_BUF[yyy++]=Rec;                //记录接收到的值
                                        if(yyy>(USART_REC_LEN-1))yyy=0;//接收数据错误,重新开始接收       
                                                                               
                        }
       
         /* USER CODE END USART1_Receive_callback 1 */
}
}
#endif



#if 1
/*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{       
        u8 Rec;       


        Rec=*(--(huart->pRxBuffPtr));
         /* USER CODE BEGIN USART1_Receive_callback 1 */
        if(huart->Instance==USART1)//如果是串口1
        {
                        if(USART_RX_STA<USART_REC_LEN-1)                //还可以接收数据
                                {
                                       


                                        __HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空                                 
                                        if(USART_RX_STA==0)TIM3_Set(1);
                                        USART_RX_BUF[USART_RX_STA&0x3FFF]=Rec;                //记录接收到的值
                                        USART_RX_STA++;                       
                                }       
                        else
                                {
                                        USART_RX_STA|=1<<15;//强制标记接收完成
                                }


        }
         /* USER CODE END USART1_Receive_callback 1 */
}

#endif

#if 0

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{       
        u8 Rec;       
        Rec=*(--(huart->pRxBuffPtr));
        if(huart->Instance==USART1)
        {
                        if(USART_RX_STA < USART_REC_LEN)
                        {
                                HAL_TIM_Base_Stop_IT(&htim3);
                                if(USART_RX_STA==0){
                                       
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Rec;
                                        USART_RX_STA++;
                                //        HAL_TIM_Base_Start_IT(&htim3); //使能定时器
                                }                               
                        }
                        else
                        {
                                USART_RX_STA|=1<<15;                               
                        }
        }
               
}


#endif




#if 0
        /*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{       
        int i=0;
        u8 Rec;       
        Rec=*(--(huart->pRxBuffPtr));
         /* USER CODE BEGIN USART1_Receive_callback 1 */
        if(huart->Instance==USART1)//如果是串口1
        {
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(Rec!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }                                       
                        else //还没收到0X0D
                        {       
                                if(Rec==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Rec;
                                        USART_RX_STA++;
                                       
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                }                 
                        }
                }
        }
         /* USER CODE END USART1_Receive_callback 1 */
}

#endif

/* @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
        while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY);//等待就绪
    while(HAL_UART_Receive_IT(&huart1,(u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK);

  /* USER CODE END USART1_IRQn 1*/
}


#if 0
/************************************************
函数名称 : USART1_SendByte
功    能 : 串口1发送一字节数据
参    数 : Data --- 数据
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART1_SendByte(uint8_t Data)
{
  while((USART1->ISR & UART_FLAG_TXE) == RESET);
  USART1->TDR = (Data & (uint16_t)0x01FF);
}

/************************************************
函数名称 : USART1_SendNByte
功    能 : 串口1发送N个字符
参    数 : pData ----- 字符串
            Length --- 长度
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART1_SendNByte(uint8_t *pData, uint16_t Length)
{
  while(Length--)
  {
    USART1_SendByte(*pData);
    pData++;
  }
}

/************************************************
函数名称 : USART1_Printf
功    能 : 串口1打印输出
参    数 : String --- 字符串
返 回 值 : 无
作    者 : strongerHuang
*************************************************/
void USART1_Printf(uint8_t *String)
{
  while((*String) != '')
  {
    USART1_SendByte(*String);
    String++;
  }
  USART1_SendByte(0x0A);
}


#endif



/* TIM3 init function */
void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 4800-1;//4800-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 200-1;//10000-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
        //        HAL_TIM_Base_Start_IT(&htim3); //使能定时器
}



//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)
        {
                __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
                HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
                HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
        }
}


//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim3);
       
}



//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{                               
                if(htim==(&htim3))
    {
                               
                        USART_RX_STA|=1<<15;        //标记接收完成
                        TIM3_Set(0);
//                        if(RxTimerout > 0)
//                        {
//                                printf("OK ");
//                                RxTimerout--;
//                        }
                       
    }
                //__HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空
       
}

void TIM3_Set(u8 sta)
{
        if(sta)
        {
      
                __HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空
                HAL_TIM_Base_Start_IT(&htim3);//使能TIMx       
        }
        else HAL_TIM_Base_Stop_IT(&htim3);//关闭定时器3          
       
}
void u2_printf(char* fmt,...)  
{  
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART1_TX_BUF,fmt,ap);
        va_end(ap);
        HAL_UART_Transmit(&huart1,(u8 *)USART1_TX_BUF,sizeof(USART1_TX_BUF),1000);
        while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);                //等待发送结束
}

main()函数                                               
while (1)
  {
                        if(USART_RX_STA &0x8000)
                        {
                                HAL_UART_Transmit(&huart1,(u8 *)USART_RX_BUF,strlen(USART_RX_BUF),1000);
                                while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);                //等待发送结束
                                memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
                               
                               
                                USART_RX_STA = 0;
                        }
        }
       

0条回答

一周热门 更多>