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

📄 lld_uart.c

📁 本程序为ST公司开发的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*______________________________________________________________________
| 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 + -