⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 完成数据的采集
💻 C
字号:
#include"includes.h"
#include"ytep.h"
#include"ytepfunction.h"
const			Int16U	BAUD_TAB[]={19500-50,9600,4800-50};
/*************************************************************************/
Boolean FifoPush(pUartFifo_t Fifo, USART_TypeDef* USARTx)
{
	volatile Int32U IndxTmp;
	Fifo->Timer=0;
        Fifo->PopIndx=0;
	if(Fifo->PushIndx<20)
	{
		IndxTmp=Fifo->PushIndx;
		Fifo->Buffer[IndxTmp]=USART_ReceiveData(USART1);//USARTx->DR;
		Fifo->PushIndx++;  
                return (FALSE);
	}else
        {      
         IndxTmp =USART_ReceiveData(USART1);       
	  return (TRUE);
        }
	
}
/*************************************************************************/
Boolean   FifoPop(pUartFifo_t Fifo,USART_TypeDef* USARTx)
{
	volatile Int32U IndxTmp;
	if(Fifo->PopIndx<=(Fifo->PushIndx+1))
	{
		IndxTmp=Fifo->PopIndx;
		USARTx->DR=Fifo->Buffer[IndxTmp];
		Fifo->PopIndx++;
	}else
	{
	 return (FALSE);
	}
	return (TRUE);
} 
/////////////////////////////////////////////
void Uart1Isr(void)
{
   volatile unsigned int uart;
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))
  {
    USART_ClearFlag(USART1,USART_FLAG_ORE);
    Uart1LineEvents.bOE = TRUE;
  }
  if(USART_GetFlagStatus(USART1,USART_FLAG_FE))
  {
    USART_ClearFlag(USART1,USART_FLAG_FE);
    // Framing Error
    Uart1LineEvents.bFE = TRUE;
  }
  if(USART_GetFlagStatus(USART1,USART_FLAG_NE))
  {
    USART_ClearFlag(USART1,USART_FLAG_NE);
    // Noise Error
    Uart1LineEvents.bFE = TRUE;
  }
  if(USART_GetFlagStatus(USART1,USART_FLAG_PE))
  {
    USART_ClearFlag(USART1,USART_FLAG_PE);
    // Parity Error
    Uart1LineEvents.bPE = TRUE;
  }
  
  if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))// Push a new data into the receiver buffer
  {
  	//USART1_485RXD; 
        uart=FifoPush(pUart1RxFifo,USART1); // Push a new data into the receiver buffer         
  }

  if(USART_GetFlagStatus(USART1,USART_FLAG_TXE)
     && (USART_GetITStatus (USART1,USART_IT_TXE) == SET))
  {
  	USART_ClearFlag(USART1,USART_FLAG_TXE);
  	USART1_485TXD; 
    if(FifoPop(pUart1TxFifo,USART1));
    else
    {
      USART_ITConfig(USART1,USART_IT_TXE ,DISABLE);//USART_IT_TXE指明是CRx,
      USART1_485RXD;
      pUart1RxFifo->UsartStatus=pUart1TxFifo->UsartStatus=0;
      USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    }
  }
  //if(Uart1RxFifo.PushIndx>20)
  //USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
   //uart=USART1->SR;    
   //uart=USART1->DR; 
   //uart=USART1->CR1  ;
  
}
/****************************************************
*
*
*****************************************************/
Boolean	UsartRXD(pUartFifo_t Fifo,pUartFifo_t TFifo)
{
	Int16U	x,x1;
        x=0;
	if(Fifo->UsartStatus!=0)
        {
          USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
          if(++TFifo->Timer>=250) Fifo->UsartStatus=0;
          return FALSE;
        }
	USART1_485RXD;
        TFifo->Timer=0;
        ++Fifo->Timer;
	if((Fifo->PushIndx!=0)&&(Fifo->Timer>=C_FifoRxd)) //
		{ 
                        if(Fifo->PushIndx>=2)
			x=Fifo->PushIndx-2;                    
			x1=Fifo->Buffer[x+1];
                        x1<<=8;
			x1+=Fifo->Buffer[x];	
			x=cal_crc(Fifo->Buffer,(Int8U)x);
			if((x==x1)&&(Fifo->Buffer[0]==_YT._ELE[0]))
			{       
                                USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
				Fifo->Timer=Fifo->PushIndx=0;
				Fifo->UsartStatus=1;                                                         
				return TRUE;
			}
                        Fifo->Timer=0,Fifo->PushIndx=0;//USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
		}else    
	if(Fifo->Timer>=C_FifoRxd)
	{
		Fifo->Timer=0,Fifo->PushIndx=0;//没收到数据
		 
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收非空使能
	        
        }
               
		return 	FALSE;
}

Boolean	UsartTXD(pUartFifo_t TFifo,pUartFifo_t RFifo,Int16U *pos)
{
  Int16U    a,b;
  //RFifo->Buffer[5]=10,RFifo->Buffer[3]=0,RFifo->Buffer[1]=3;
#if 1
	if((RFifo->UsartStatus==0)||(RFifo->Buffer[C_RX_ADDR]!=*pos))
		{
			RFifo->Timer=RFifo->PushIndx=0;
			return FALSE;
		}
#endif
	
	//USART_Cmd(USART1, DISABLE);
	b=RFifo->Buffer[5];//length
	TFifo->Buffer[0]=*(pos+C_PrductADD);
	TFifo->Buffer[1]=RFifo->Buffer[1];
	if((RFifo->Buffer[3]+RFifo->Buffer[5])>(UART_FIFO_SIZE-2))TFifo->Buffer[1]=0x83;
	TFifo->PushIndx=2,a=RFifo->Buffer[3];//address
	if(TFifo->Buffer[1]==3)
	{
		pos+=a;
		a=2;
		for(;b>0;b--)
		{
			TFifo->Buffer[TFifo->PushIndx]=*pos>>8;
			TFifo->Buffer[++TFifo->PushIndx]=*pos&0xff;
			pos++,TFifo->PushIndx++;
		}
	}
		b=cal_crc(TFifo->Buffer,TFifo->PushIndx);
		TFifo->Buffer[TFifo->PushIndx]=b>>8;
		TFifo->Buffer[++(TFifo->PushIndx)]=b&0xFF;
               
	  TFifo->PopIndx=0;
	  USART_ITConfig(USART1,USART_IT_PE  ,ENABLE);//校验错误中断
    USART_ITConfig(USART1,USART_IT_TC  ,DISABLE);//发送完成中断使能
    USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//接收非空使能
    USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);
    USART_ITConfig(USART1,USART_IT_LBD ,DISABLE);
    USART_ITConfig(USART1,USART_IT_CTS ,DISABLE);
    USART_ITConfig(USART1,USART_IT_ERR ,DISABLE);
    FifoPop(pUart1TxFifo,USART1); 
    USART1_485TXD; 
    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
    //USART_Cmd(USART1, ENABLE);  
	  
	  return 	FALSE;
}

///////////////////////////////////////////////
///////////////////////////////////////////////
void Uart1Init()
{
 USART_Cmd(USART1, DISABLE);  
USART_InitTypeDef  UART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
   pUart1TxFifo=&Uart1TxFifo;
   pUart1RxFifo=&Uart1RxFifo;
   UART_InitStructure.USART_BaudRate = BAUD_TAB[_YT._Rate&7]; 
  UART_InitStructure.USART_WordLength = USART_WordLength_8b;
  UART_InitStructure.USART_StopBits = USART_StopBits_1;
  UART_InitStructure.USART_Parity = USART_Parity_No ;
  UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  UART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx ;
  UART_InitStructure.USART_Clock = USART_Clock_Disable;
  UART_InitStructure.USART_CPOL = USART_CPOL_Low;
  UART_InitStructure.USART_CPHA = USART_CPHA_1Edge;
  UART_InitStructure.USART_LastBit = USART_LastBit_Disable;
  
   UART_InitStructure.USART_Parity = USART_Parity_No;  
    USART_DeInit(USART1);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,DISABLE);
    GPIO_PinRemapConfig(GPIO_Remap_USART1,DISABLE);
    // Assign PA9 to UART1 (Tx)
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    // Assign PA10 to UART1 (Rx)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    // Init UART1
    USART_Init(USART1,&UART_InitStructure);
    // Enable and configure the priority of the UART1 Update IRQ Channel
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =10;//4 UART1_INTR_PRI;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//5
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ClearFlag(USART1, USART_FLAG_CTS | USART_FLAG_LBD  | USART_FLAG_TXE  |
                            USART_FLAG_TC  | USART_FLAG_RXNE | USART_FLAG_IDLE |
                            USART_FLAG_ORE | USART_FLAG_NE   | USART_FLAG_FE |
                            USART_FLAG_PE);

    // Enable UART1 interrupts
    //USART_ITConfig(USART1,USART_IT_PE  ,ENABLE);//校验错误中断
    USART_ITConfig(USART1,USART_IT_PE  ,ENABLE); // DISABLE
     USART_ITConfig(USART1,USART_IT_TXE  ,DISABLE);
    USART_ITConfig(USART1,USART_IT_TC  ,DISABLE);//发送完成中断使能
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收非空使能
    USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);
    USART_ITConfig(USART1,USART_IT_LBD ,DISABLE);
    USART_ITConfig(USART1,USART_IT_CTS ,DISABLE);
    USART_ITConfig(USART1,USART_IT_ERR ,DISABLE);
    USART1_485RXD;
    Uart1RxFifo.UsartStatus=0;
     USART_Cmd(USART1, ENABLE);
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -