📄 lld_uart.c
字号:
/*______________________________________________________________________
| FILE: lld_uart.c
| PROJECT: OS20_ACCORDO+
| SW-COMPONENT:
|_______________________________________________________________________
| DESCRIPTION: uart functionality
|_______________________________________________________________________
| COPYRIGHT: (c) 2005 STMicroelectronics, Arzano (ITALY)
| HISTORY:
| Date | Modification | Author
|_______________________________________________________________________
| 05.10.28 | Initial revision | M. De Martino
|______________________________________________________________________*/
#include "lld_uart.h" /* UART LLD interface/declaration */
#include "lld_eic.h"
#include "lld_gpio.h"
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************
|defines and macros (scope: module-local)
|-----------------------------------------------------------------------*/
/************************************************************************
|types (scope: module-local)
|-----------------------------------------------------------------------*/
typedef struct rUart
{
tU16 UART_BR; /* addr offset = 0x00 */
intra16;
struct
{ /* addr offset = 0x04*/
tU16 TxData:8;
tU16 UART_TxBuffer8:1;
tU16 reserved:7;
} UART_TxBUFR;
intra16;
struct
{ /* addr offset = 0x08*/
tU16 RxData:8;
tU16 UART_RxBuffer8:1;
tU16 reserved:7;
} UART_RxBUFR;
intra16;
struct
{ /* addr offset = 0x0C */
tU16 Mode:3;
tU16 StopBits:2;
tU16 ParityOdd:1;
tU16 LoopBack:1;
tU16 Run:1;
tU16 RxEnable:1;
tU16 reserved1:1;
tU16 FifoEnable:1;
tU16 reserved2:5;
} UART_CR;
intra16;
struct
{ /* addr offset = 0x10 */
tU16 RxBuffFullIE:1;
tU16 TxEmptyIE:1;
tU16 TxHalfEmptyIE:1;
tU16 ParityErrorIE:1;
tU16 FrameErrorIE:1;
tU16 OverrunErrorIE:1;
tU16 TimeoutNotEmptyIE:1;
tU16 TimeouIdleIE:1;
tU16 RxHalfFullIE:1;
tU16 reserved:7;
} UART_IER;
intra16;
struct
{ /* addr offset = 0x14 */
tU16 RxBuffFull:1;
tU16 TxEmpty:1;
tU16 TxHalfEmpty:1;
tU16 ParityError:1;
tU16 FrameError:1;
tU16 OverrunError:1;
tU16 TimeoutNotEmpty:1;
tU16 TimeouIdle:1;
tU16 RxHalfFull:1;
tU16 TxFull:1;
tU16 reserved:6;
} UART_SR;
gap(3);
struct
{ /* addr offset = 0x1C */
tU16 UART_TOR:8;
tU16 reserved:8;
} UART_TOR;
intra16;
tU16 UART_TxRSTR; /* addr offset = 0x20 */
intra16;
tU16 UART_RxRSTR; /* addr offset = 0x24 */
}rUart;
/* Place Uart1 pheripheral according to scatter file */
#pragma arm section zidata = "Uart1_map"
volatile rUart Uart1;
#pragma arm section zidata
/* Place Uart0 pheripheral according to scatter file */
#pragma arm section zidata = "Uart0_map"
volatile rUart Uart0;
#pragma arm section zidata
/* "Floor" approx to baud rate generator */
/* @@@@ 04.09.2002 Ka: Corrected for optimal calculation */
#define UART_M_BR_2_UARTBR(BaudRate) \
(tU16)((((S_APB_CLK*10)/(16*(const tS32)BaudRate))+5)/10)
/************************************************************************
|typedefs (scope: module-local)
|-----------------------------------------------------------------------*/
/* Uart comunication control block struct definition */
typedef struct
{
tS8 *ps8wrBuffer; /* write buffer start address */
tU32 u32wrBuffSize; /* Size of write-Buffer */
tS8 *ps8wrBufferISR; /* Pointer to Tx Fifo buffer used by ISR */
tS8 *ps8wrBufferDEV; /* Pointer to Tx Fifo buffer used by DEVICE */
tU32 u32wrNbytes; /* Number of bytes to be Tx */
/* Info's */
tU32 u32TransmitBytes; /* Total Number of bytes transmitted */
tU32 u32wrNumberOfOverflowBytes; /* Number of bytes thrown away because of buffer overflow */
tU32 u32wrNumberOfOverflows; /* Number of Buffer-overflow situations */
tS8 *ps8rdBuffer; /* Rx Fifo buffer start address */
tU32 u32rdBuffSize; /* Size of Read-Buffer */
tS8 *ps8rdBufferISR; /* Pointer to Rx Fifo buffer used by ISR */
tS8 *ps8rdBufferDEV; /* Pointer to Rx Fifo buffer used by DEVICE */
tU32 u32rdNbytes; /* Number of Bytes in Read buffer */
/* Info's */
tU32 u32ReceivedBytes; /* Total Number of bytes received */
tU32 u32rdNumberOfOverflowBytes; /* Number of bytes thrown away because of buffer overflow */
tU32 u32rdNumberOfOverflows; /* Number of Buffer-overflow situations */
} UART_trBuffCtrl;
typedef struct
{
UART_tenStatus enTxState; /* Tx current state */
tBool enTxFull; /* Buffer is full */
UART_tenStatus enRxState; /* Rx current state */
tBool enRxFull; /* Buffer is full */
} UART_trStatus;
typedef struct
{
tS32 s32Baudrate; /* Baudrate */
tU16 u16Timeout; /* Timeout */
UART_tenParity tParity; /* Parity setting */
UART_tenStopBits tStopBits; /* Number of Stop-Bits */
UART_tenMode tMode; /* Mode */
} UART_trSetting;
/************************************************************************
| variable definition (scope: global)
|-----------------------------------------------------------------------*/
/*
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (4800,8,N,1)
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (4800,8,N,2)
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (4800,8,O,1)
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (4800,8,O,2)
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (4800,8,E,1)
UART_BAUD_4800, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (4800,8,E,2)
UART_BAUD_4800, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (4800,7,O,1)
UART_BAUD_4800, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (4800,7,O,2)
UART_BAUD_4800, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (4800,7,E,1)
UART_BAUD_4800, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (4800,7,E,2)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (9600,8,N,1)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (9600,8,N,2)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (9600,8,O,1)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (9600,8,O,2)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (9600,8,E,1)
UART_BAUD_9600, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (9600,8,E,2)
UART_BAUD_9600, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (9600,7,O,1)
UART_BAUD_9600, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (9600,7,O,2)
UART_BAUD_9600, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (9600,7,E,1)
UART_BAUD_9600, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (9600,7,E,2)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (19200,8,N,1)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (19200,8,N,2)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (19200,8,O,1)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (19200,8,O,2)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (19200,8,E,1)
UART_BAUD_19200, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (19200,8,E,2)
UART_BAUD_19200, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (19200,7,O,1)
UART_BAUD_19200, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (19200,7,O,2)
UART_BAUD_19200, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (19200,7,E,1)
UART_BAUD_19200, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (19200,7,E,2)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (38400,8,N,1)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (38400,8,N,2)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (38400,8,O,1)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (38400,8,O,2)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (38400,8,E,1)
UART_BAUD_38400, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (38400,8,E,2)
UART_BAUD_38400, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (38400,7,O,1)
UART_BAUD_38400, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (38400,7,O,2)
UART_BAUD_38400, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (38400,7,E,1)
UART_BAUD_38400, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (38400,7,E,2)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (57600,8,N,1)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (57600,8,N,2)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (57600,8,O,1)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (57600,8,O,2)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (57600,8,E,1)
UART_BAUD_57600, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (57600,8,E,2)
UART_BAUD_57600, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (57600,7,O,1)
UART_BAUD_57600, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (57600,7,O,2)
UART_BAUD_57600, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (57600,7,E,1)
UART_BAUD_57600, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (57600,7,E,2)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_ONE_STOP_BITS, (115200,8,N,1)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_NONE, UART_EN_TWO_STOP_BITS, (115200,8,N,2)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (115200,8,O,1)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (115200,8,O,2)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (115200,8,E,1)
UART_BAUD_115200, UART_EN_EIGHT_BITS, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (115200,8,E,2)
UART_BAUD_115200, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_ONE_STOP_BITS, (115200,7,O,1)
UART_BAUD_115200, UART_EN_SEVEN_BITS_PA, UART_EN_ODD, UART_EN_TWO_STOP_BITS, (115200,7,O,2)
UART_BAUD_115200, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_ONE_STOP_BITS, (115200,7,E,1)
UART_BAUD_115200, UART_EN_SEVEN_BITS_PA, UART_EN_EVEN, UART_EN_TWO_STOP_BITS, (115200,7,E,2)
*/
/************************************************************************
| variable definition (scope: module-local)
|-----------------------------------------------------------------------*/
/* Low level driver internal variables */
static UART_trBuffCtrl arUartBuffCtrl[2];
static UART_trStatus arUartStatus[2] = {UART_EN_UNKNOWN,FALSE,UART_EN_UNKNOWN,FALSE};
static UART_trSetting arUARTSetting[2];
/************************************************************************
|function prototype (scope: module-local)
|-----------------------------------------------------------------------*/
/* Isr for UART driver */
tVoid INT_vUartTxEmpty(UART_tenId enId);
tVoid INT_vUartRxHalf2Full(UART_tenId enId);
/* Al: custom interrupt manager */
static tVoid INT_vUart_Default_manager (tU8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -