optical/NxBase/serial.c

462 lines
11 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#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