462 lines
11 KiB
C
462 lines
11 KiB
C
|
|
|
|||
|
|
#define _IN_SERIAL_C
|
|||
|
|
|
|||
|
|
#include "serial.h"
|
|||
|
|
#include "cpuid.h"
|
|||
|
|
|
|||
|
|
/*------------------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF1_SIZE
|
|||
|
|
#define MAX_STBUF1_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF1_SIZE
|
|||
|
|
#define MAX_SRBUF1_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF2_SIZE
|
|||
|
|
#define MAX_STBUF2_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF2_SIZE
|
|||
|
|
#define MAX_SRBUF2_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF3_SIZE
|
|||
|
|
#define MAX_STBUF3_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF3_SIZE
|
|||
|
|
#define MAX_SRBUF3_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF4_SIZE
|
|||
|
|
#define MAX_STBUF4_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF4_SIZE
|
|||
|
|
#define MAX_SRBUF4_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF5_SIZE
|
|||
|
|
#define MAX_STBUF5_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF5_SIZE
|
|||
|
|
#define MAX_SRBUF5_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_STBUF6_SIZE
|
|||
|
|
#define MAX_STBUF6_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifndef MAX_SRBUF6_SIZE
|
|||
|
|
#define MAX_SRBUF6_SIZE (128)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
u16 sEnFlag; // <20><>Ч<EFBFBD><D0A7>־ = 0x55aa<61><61><EFBFBD>ṹ<EFBFBD><E1B9B9>Ч
|
|||
|
|
USART_TypeDef * USARTx;
|
|||
|
|
BAUD_TypeDef baud;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int squeueLen; // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 * sendQueue; // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 * pSdQueueHead; // <20><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>ͷָ<CDB7><D6B8>
|
|||
|
|
u8 * pSdQueueTail; // <20><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>βָ<CEB2><D6B8>
|
|||
|
|
u16 lenSdQueue; // <20><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
u16 ctrlSdFlag; // <20><><EFBFBD>ͱ<EFBFBD>־, TRUE, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>; FALSE, <20><><EFBFBD><EFBFBD>û<EFBFBD>з<EFBFBD><D0B7><EFBFBD>
|
|||
|
|
|
|||
|
|
int rqueueLen; // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 * rsevQueue; // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u8 * pRsQueueHead; // <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>ͷָ<CDB7><D6B8>
|
|||
|
|
u8 * pRsQueueTail; // <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>βָ<CEB2><D6B8>
|
|||
|
|
u16 lenRsQueue; // <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
u16 ctrlRsFlag; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־, TRUE, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>; FALSE, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
|
|||
|
|
|
|||
|
|
ResvExProc resvexproc; // <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
}UsartCtrl;
|
|||
|
|
|
|||
|
|
#define FLAG_ENABLE 0x55AA
|
|||
|
|
|
|||
|
|
/*------------------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
#define IsUsartRxneFlag(usart) LL_USART_IsActiveFlag_RXNE(usart)
|
|||
|
|
#define IsUsartTxeFlag(usart) LL_USART_IsActiveFlag_TXE(usart)
|
|||
|
|
#define IsUsartTcFlag(usart) LL_USART_IsActiveFlag_TC(usart)
|
|||
|
|
|
|||
|
|
#define EnableItReceive(usart) LL_USART_EnableIT_RXNE(usart)
|
|||
|
|
#define DisableItReceive(usart) LL_USART_DisableIT_RXNE(usart)
|
|||
|
|
|
|||
|
|
#define EnableItTrans(usart) LL_USART_EnableIT_TXE(usart)
|
|||
|
|
#define DisableItTrans(usart) LL_USART_DisableIT_TXE(usart)
|
|||
|
|
|
|||
|
|
#define ReceiveData LL_USART_ReceiveData8
|
|||
|
|
#define TransmitData LL_USART_TransmitData8
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*------------------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
// <20>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ
|
|||
|
|
|
|||
|
|
#define INITUSART(usart) do \
|
|||
|
|
{\
|
|||
|
|
/* ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>ж<EFBFBD> */ \
|
|||
|
|
LL_USART_ReceiveData8(USART##usart); \
|
|||
|
|
LL_USART_EnableIT_RXNE(USART##usart); \
|
|||
|
|
\
|
|||
|
|
/* <20><EFBFBD><F2BFAAB4><EFBFBD> */ \
|
|||
|
|
LL_USART_Enable(USART##usart); \
|
|||
|
|
} while (0)
|
|||
|
|
|
|||
|
|
/*------------------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
#define USART_PROC(usart) \
|
|||
|
|
\
|
|||
|
|
u8 g_usart##usart##TBuff[MAX_STBUF##usart##_SIZE];\
|
|||
|
|
u8 g_usart##usart##RBuff[MAX_SRBUF##usart##_SIZE];\
|
|||
|
|
UsartCtrl g_uCtrl##usart; \
|
|||
|
|
\
|
|||
|
|
int InitUsart##usart(BAUD_TypeDef baud, char dat, char parity, char stop) \
|
|||
|
|
{ \
|
|||
|
|
/* <20>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
memset(&g_uCtrl##usart, 0, sizeof(UsartCtrl)); \
|
|||
|
|
g_uCtrl##usart.sendQueue = g_usart##usart##TBuff; \
|
|||
|
|
g_uCtrl##usart.squeueLen = MAX_STBUF##usart##_SIZE; \
|
|||
|
|
g_uCtrl##usart.rsevQueue = g_usart##usart##RBuff; \
|
|||
|
|
g_uCtrl##usart.rqueueLen = MAX_SRBUF##usart##_SIZE; \
|
|||
|
|
g_uCtrl##usart.USARTx = USART##usart; \
|
|||
|
|
g_uCtrl##usart.baud = baud; \
|
|||
|
|
\
|
|||
|
|
g_uCtrl##usart.pSdQueueHead = &(g_uCtrl##usart.sendQueue[0]); \
|
|||
|
|
g_uCtrl##usart.pSdQueueTail = g_uCtrl##usart.pSdQueueHead; \
|
|||
|
|
g_uCtrl##usart.lenSdQueue = 0; \
|
|||
|
|
g_uCtrl##usart.ctrlSdFlag = FALSE; \
|
|||
|
|
\
|
|||
|
|
g_uCtrl##usart.pRsQueueHead = &(g_uCtrl##usart.rsevQueue[0]); \
|
|||
|
|
g_uCtrl##usart.pRsQueueTail = g_uCtrl##usart.pRsQueueHead; \
|
|||
|
|
g_uCtrl##usart.lenRsQueue = 0; \
|
|||
|
|
g_uCtrl##usart.ctrlRsFlag = TRUE; \
|
|||
|
|
\
|
|||
|
|
g_uCtrl##usart.sEnFlag = FLAG_ENABLE; \
|
|||
|
|
g_uCtrl##usart.resvexproc = NULL; \
|
|||
|
|
\
|
|||
|
|
INITUSART(usart); \
|
|||
|
|
return 0; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pDatBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
/* len, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */ \
|
|||
|
|
/* <20><><EFBFBD>أ<EFBFBD> >= 0, ʵ<>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
/* <20><><EFBFBD>أ<EFBFBD> -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
/* -2, <20><><EFBFBD><EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>*/ \
|
|||
|
|
/* -3, <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>*/ \
|
|||
|
|
int Usart##usart##SendData(u8 * pDatBuf, int len) \
|
|||
|
|
{ \
|
|||
|
|
int i; \
|
|||
|
|
u8 * pSDat; \
|
|||
|
|
\
|
|||
|
|
if (pDatBuf == NULL || len < 0) \
|
|||
|
|
{ \
|
|||
|
|
return -1; \
|
|||
|
|
} \
|
|||
|
|
if (g_uCtrl##usart.sEnFlag != FLAG_ENABLE) \
|
|||
|
|
{ \
|
|||
|
|
return -2; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> */ \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
if (g_uCtrl##usart.lenSdQueue+len > g_uCtrl##usart.squeueLen) \
|
|||
|
|
{ \
|
|||
|
|
len = 0; /*g_uCtrl##usart.squeueLen - g_uCtrl##usart.lenSdQueue;*/ \
|
|||
|
|
} \
|
|||
|
|
pSDat = g_uCtrl##usart.pSdQueueTail; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
\
|
|||
|
|
if (len < 0) \
|
|||
|
|
{ \
|
|||
|
|
return -3; \
|
|||
|
|
} \
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
for (i = 0; i < len; i++) \
|
|||
|
|
{ \
|
|||
|
|
*pSDat++ = *pDatBuf++; \
|
|||
|
|
if (pSDat > &(g_uCtrl##usart.sendQueue[g_uCtrl##usart.squeueLen-1])) \
|
|||
|
|
{ \
|
|||
|
|
pSDat = &(g_uCtrl##usart.sendQueue[0]); \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
if (len != 0) \
|
|||
|
|
{ \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
g_uCtrl##usart.pSdQueueTail = pSDat; \
|
|||
|
|
g_uCtrl##usart.lenSdQueue += len; \
|
|||
|
|
if (g_uCtrl##usart.ctrlSdFlag != TRUE && g_uCtrl##usart.lenSdQueue != 0) \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.ctrlSdFlag = TRUE; /* <20><><EFBFBD>ñ<EFBFBD>־ */ \
|
|||
|
|
EnableItTrans(g_uCtrl##usart.USARTx); /* <20><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3>൱<EFBFBD><E0B5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
} \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
} \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴӽ<DDB4><D3BD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> */ \
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pDat<61><74><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>*/ \
|
|||
|
|
/* expectLen<65><6E>ϣ<EFBFBD><CFA3><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݵĴ<DDB5>С */ \
|
|||
|
|
/* <20><><EFBFBD>أ<EFBFBD> >= 0<><30>ʵ<EFBFBD>ʵõ<CAB5><C3B5><EFBFBD><EFBFBD>ݵĴ<DDB5>С */ \
|
|||
|
|
/* -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ \
|
|||
|
|
/* -2, <20><><EFBFBD><EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>*/ \
|
|||
|
|
/* -3, <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>*/ \
|
|||
|
|
\
|
|||
|
|
int Usart##usart##GetData(u8 * pDat, int expectLen) \
|
|||
|
|
{ \
|
|||
|
|
int i, len; \
|
|||
|
|
u8 * pSDat; \
|
|||
|
|
\
|
|||
|
|
if (pDat == NULL || expectLen < 0) \
|
|||
|
|
{ \
|
|||
|
|
return -1; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
if (g_uCtrl##usart.sEnFlag != FLAG_ENABLE) \
|
|||
|
|
{ \
|
|||
|
|
return -2; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
EnterCritical(); \
|
|||
|
|
pSDat = g_uCtrl##usart.pRsQueueHead; \
|
|||
|
|
len = g_uCtrl##usart.lenRsQueue; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
\
|
|||
|
|
if (len < 0) \
|
|||
|
|
{ \
|
|||
|
|
return -3; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
if (expectLen > len) /* <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
{ \
|
|||
|
|
return 0; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */ \
|
|||
|
|
for (i = 0; i < expectLen; i++) \
|
|||
|
|
{ \
|
|||
|
|
*pDat++ = *pSDat; \
|
|||
|
|
pSDat++; \
|
|||
|
|
if (pSDat > &(g_uCtrl##usart.rsevQueue[g_uCtrl##usart.rqueueLen-1])) \
|
|||
|
|
{ \
|
|||
|
|
pSDat = &(g_uCtrl##usart.rsevQueue[0]); \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
EnterCritical(); \
|
|||
|
|
g_uCtrl##usart.pRsQueueHead = pSDat; \
|
|||
|
|
g_uCtrl##usart.lenRsQueue -= expectLen; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
\
|
|||
|
|
return expectLen; \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
int Usart##usart##CleanRsBuf(void) \
|
|||
|
|
{ \
|
|||
|
|
int len; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
g_uCtrl##usart.pRsQueueHead = g_uCtrl##usart.pRsQueueTail; \
|
|||
|
|
len = g_uCtrl##usart.lenRsQueue; \
|
|||
|
|
g_uCtrl##usart.lenRsQueue = 0; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD> */ \
|
|||
|
|
int Usart##usart##GetRsLen(void) \
|
|||
|
|
{ \
|
|||
|
|
int len; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
len = g_uCtrl##usart.lenRsQueue; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20><><EFBFBD>շ<EFBFBD><D5B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
int Usart##usart##CleanSdBuf(void) \
|
|||
|
|
{ \
|
|||
|
|
int len; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
g_uCtrl##usart.pSdQueueHead = g_uCtrl##usart.pSdQueueTail; \
|
|||
|
|
len = g_uCtrl##usart.lenSdQueue; \
|
|||
|
|
g_uCtrl##usart.lenSdQueue = 0; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD> */ \
|
|||
|
|
int Usart##usart##GetSdFreeLen(void) \
|
|||
|
|
{ \
|
|||
|
|
int len; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
len = g_uCtrl##usart.squeueLen - g_uCtrl##usart.lenSdQueue; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20>жϷ<D0B6><CFB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA> */ \
|
|||
|
|
int IsUsart##usart##SendBufEmpty(void) \
|
|||
|
|
{ \
|
|||
|
|
int len; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
len = g_uCtrl##usart.lenSdQueue; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
if (len != 0) \
|
|||
|
|
{ \
|
|||
|
|
return FALSE; \
|
|||
|
|
} \
|
|||
|
|
else \
|
|||
|
|
{ \
|
|||
|
|
return TRUE; \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
int IsUsart##usart##SendOver(void) \
|
|||
|
|
{ \
|
|||
|
|
int flag; \
|
|||
|
|
EnterCritical(); \
|
|||
|
|
flag = g_uCtrl##usart.ctrlSdFlag; \
|
|||
|
|
ExitCritical(); \
|
|||
|
|
if (flag == TRUE) \
|
|||
|
|
{ \
|
|||
|
|
return FALSE; \
|
|||
|
|
} \
|
|||
|
|
else \
|
|||
|
|
{ \
|
|||
|
|
return TRUE; \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* <20>жϴ<D0B6><CFB4><EFBFBD> */ \
|
|||
|
|
void USART##usart##IntProc(void) \
|
|||
|
|
{ \
|
|||
|
|
u8 dat; \
|
|||
|
|
if (IsUsartRxneFlag(g_uCtrl##usart.USARTx) != RESET) /* USART <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */ \
|
|||
|
|
{ \
|
|||
|
|
dat = ReceiveData(g_uCtrl##usart.USARTx); \
|
|||
|
|
if (g_uCtrl##usart.sEnFlag != FLAG_ENABLE) \
|
|||
|
|
{ \
|
|||
|
|
return; \
|
|||
|
|
} \
|
|||
|
|
if (g_uCtrl##usart.lenRsQueue < g_uCtrl##usart.rqueueLen) \
|
|||
|
|
{ \
|
|||
|
|
*(g_uCtrl##usart.pRsQueueTail) = dat; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
g_uCtrl##usart.pRsQueueTail++; \
|
|||
|
|
if (g_uCtrl##usart.pRsQueueTail > &(g_uCtrl##usart.rsevQueue[g_uCtrl##usart.rqueueLen-1])) \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.pRsQueueTail = &(g_uCtrl##usart.rsevQueue[0]); \
|
|||
|
|
} \
|
|||
|
|
g_uCtrl##usart.lenRsQueue++; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
} \
|
|||
|
|
if (g_uCtrl##usart.resvexproc != NULL) \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.resvexproc(dat); \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
if (IsUsartTxeFlag(g_uCtrl##usart.USARTx) != RESET) /* USART <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */ \
|
|||
|
|
{ \
|
|||
|
|
if (g_uCtrl##usart.sEnFlag != FLAG_ENABLE) \
|
|||
|
|
{ \
|
|||
|
|
DisableItTrans(g_uCtrl##usart.USARTx); /* <20>ر<EFBFBD><D8B1>ж<EFBFBD> */ \
|
|||
|
|
return; \
|
|||
|
|
} \
|
|||
|
|
if (g_uCtrl##usart.lenSdQueue != 0) \
|
|||
|
|
{ \
|
|||
|
|
TransmitData(g_uCtrl##usart.USARTx, *(g_uCtrl##usart.pSdQueueHead)); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
g_uCtrl##usart.pSdQueueHead++; /* ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
if (g_uCtrl##usart.pSdQueueHead > &(g_uCtrl##usart.sendQueue[g_uCtrl##usart.squeueLen-1])) \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.pSdQueueHead = &(g_uCtrl##usart.sendQueue[0]); \
|
|||
|
|
} \
|
|||
|
|
g_uCtrl##usart.lenSdQueue--; /* <20><><EFBFBD>ȼ<EFBFBD>С */ \
|
|||
|
|
g_uCtrl##usart.ctrlSdFlag = TRUE; /* <20><><EFBFBD>ñ<EFBFBD>־ */ \
|
|||
|
|
} \
|
|||
|
|
else \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.ctrlSdFlag = FALSE; /* <20><><EFBFBD>ñ<EFBFBD>־ */ \
|
|||
|
|
DisableItTrans(g_uCtrl##usart.USARTx); /* <20>ر<EFBFBD><D8B1>ж<EFBFBD> */ \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
} \
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
void RegUsart##usart##ResvExFunc(ResvExProc proc) \
|
|||
|
|
{ \
|
|||
|
|
g_uCtrl##usart.resvexproc = proc; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/*------------------------------------------------------------------------------------------*/ \
|
|||
|
|
/* USARTxͬ<78><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
int Usart##usart##SendDataSync(u8 * pDatBuf, int len) \
|
|||
|
|
{ \
|
|||
|
|
DisableItTrans(g_uCtrl##usart.USARTx); /* <20>ر<EFBFBD><D8B1>ж<EFBFBD> */ \
|
|||
|
|
while(len != 0) \
|
|||
|
|
{ \
|
|||
|
|
while(IsUsartTcFlag(g_uCtrl##usart.USARTx) == RESET); \
|
|||
|
|
TransmitData(g_uCtrl##usart.USARTx, *pDatBuf); \
|
|||
|
|
pDatBuf++; \
|
|||
|
|
len--; \
|
|||
|
|
} \
|
|||
|
|
return len; \
|
|||
|
|
} \
|
|||
|
|
\
|
|||
|
|
/* USARTxͬ<78><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ \
|
|||
|
|
int Usart##usart##GetDataSync(u8 * pDat, int expectLen) \
|
|||
|
|
{ \
|
|||
|
|
int count = 0; \
|
|||
|
|
DisableItReceive(g_uCtrl##usart.USARTx); /* <20>ر<EFBFBD><D8B1>ж<EFBFBD> */ \
|
|||
|
|
while(expectLen != 0) \
|
|||
|
|
{ \
|
|||
|
|
while(IsUsartTcFlag(g_uCtrl##usart.USARTx) == RESET); \
|
|||
|
|
*pDat = ReceiveData(g_uCtrl##usart.USARTx); \
|
|||
|
|
pDat++; \
|
|||
|
|
expectLen--; \
|
|||
|
|
count++; \
|
|||
|
|
} \
|
|||
|
|
return count; \
|
|||
|
|
}\
|
|||
|
|
/*------------------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART1
|
|||
|
|
USART_PROC(1);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART2
|
|||
|
|
USART_PROC(2);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART3
|
|||
|
|
USART_PROC(3);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART4
|
|||
|
|
USART_PROC(4);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART5
|
|||
|
|
USART_PROC(5);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef COMM_USART6
|
|||
|
|
USART_PROC(6);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|