📄 uart.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 + -