📄 uart.c
字号:
}
if (uiParaData[Parity] > 4) {
uiParaData[Parity] = 0;
}
if (uiParaData[RtsControl] != 0) {
uiParaData[RtsControl] = 0;
}
if (OPERATE_FAIL == (__uartBandRate(PUartInfo,uiParaData[BaudRate]))) {
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_NOK;
}
if(OPERATE_FAIL == (__uartMode(PUartInfo,uiParaData))) {
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_NOK;
}
puiAddrBase[__B_UART_FCR << uiOffBase] = ((__GuiUartFifoTab[uiId] << 6) | 0x07);
/* 初始化FIFO为N个字节触发,WO
发送和接收的FIFO都使能 */
puiAddrBase[__B_UART_IER << uiOffBase] = 0x05; /* 使能接收中断,不使能发送中断 */
PUartInfo->uiUartFlag |= 0x10; /* 4位置位表示发送队列使能 */
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
} // end of if ( PUartInfo->pUartSem!=0 )
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartInit
** Descriptions: 串口初始化及中断设置
** input parameters: uiId: 子设备号
** pcArg: 字符串指针
** pRsv: 保留参数
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
** Example: char pUart[]="BaudRate=9600,DataBits=8,StopBits=1,Parity=NONE,RtsControl=NONE";
** uartInit(0,pUart,0);
*********************************************************************************************************/
#define MAX_UART_STR_NUM 5 /* 字符串中包含5个参数 */
extern int32 uartInit (uint32 uiId,
char *pcArg,
void *pRsv)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定义一个数组存放字符串的参数*/
char cCopyStr[80]; /* 用于备份字符串 */
if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
strcpy(cCopyStr,pcArg); /* 复制字符串 */
__GpuiUartInfoTab[uiId]->puiAddrBase = (uint32 *)__GuiUartBaseAddrTab[uiId];
/* 定基址 */
__GpuiUartInfoTab[uiId]->uiOffBase = 0; /* 地址偏移量 */
__GpuiUartInfoTab[uiId]->uiUartFlag = 0; /* 清0标志 */
__GpuiUartInfoTab[uiId]->uiQueueReviceFifoLen = __GuiQueueReviceFifoTab[uiId];
/* 软件FIFO接收长度 */
__GpuiUartInfoTab[uiId]->uiQueueSendFifoLen = __GuiQueueSendFifoTab[uiId];
/* 软件FIFO发送长度 */
__GpuiUartInfoTab[uiId]->PdqReviceBuf = (DataQueue *)GpuiUartReviceTab[uiId];
/* 记录接收缓存 */
__GpuiUartInfoTab[uiId]->PdqSendBuf = (DataQueue *)GpuiUartSendTab[uiId];
/* 记录发送缓存 */
__GpuiUartInfoTab[uiId]->uiUartId = uiId; /* 记录下自己的ID号 */
ImpCmd(Tab_UART,cCopyStr,uiParaData); /* 从字符串中提取参数 */
if (__uartInit(__GpuiUartInfoTab[uiId], uiParaData,
__GuiQueueReviceFifoTab[uiId], __GuiQueueSendFifoTab[uiId]) == OPERATE_FAIL) {
return(UART_NOK);
}
else {
return(UART_OK);
}
}
else {
return(UART_NOK);
}
}
/*********************************************************************************************************
** Function name: uartSetMode
** Descriptions: 设置串口的参数
** input parameters: uiId : 子设备号
** uiCmd :设置参数宏:CTMODE--串口模式;BAUDRATE--串口波特率
** pcArg :字符串指针
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
** Example1: char pUartBps[] = "BaudRate=9600";
** WdtSetMode( 0, BAUDRATE, pUartBps);
** Example2: char pUart[]="DataBits=8 StopBits=1 Parity=NONE RtsControl=NONE";
** WdtSetMode( 0, CTMODE, pUart);
*********************************************************************************************************/
#define BAUDRATE 0
#define CTMODE 1
extern int32 uartSetMode (uint32 uiId,
uint32 uiCmd,
char *pcArg)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定义一个数组存放字符串的参数*/
char cCopyStr[80]; /* 用于备份字符串 */
if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
strcpy(cCopyStr,pcArg); /* 复制字符串 */
ImpCmd(Tab_UART,cCopyStr,uiParaData); /* 从字符串中提取参数 */
switch(uiCmd) {
case BAUDRATE:
return(__uartBandRate(__GpuiUartInfoTab[uiId],uiParaData[BaudRate]));
break;
case CTMODE:
return(__uartMode(__GpuiUartInfoTab[uiId],uiParaData));
break;
default:
break;
}
}
return UART_NOK;
}
/*********************************************************************************************************
** Function name: __uartGetState
** Descriptions: 从底层串口寄存器获取当前串口的参数
** input parameters: uiId: 子设备号
** uiParaData: 字符串指针
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
int32 __uartGetState (uint32 uiId, uint32 *uiParaData)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint32 uiBak = 0;
puiAddrBase = __GpuiUartInfoTab[uiId]->puiAddrBase;
uiOffBase = __GpuiUartInfoTab[uiId]->uiOffBase;
uiBak = puiAddrBase[__B_UART_LCR << uiOffBase];
puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80; /* 允许访问分频因子寄存器 */
uiParaData[BaudRate] = ((Fpclk /(puiAddrBase[__B_UART_DLL << uiOffBase]
| (puiAddrBase[__B_UART_DLM << uiOffBase] << 8)) / 16));
uiParaData[DataBits] = (uiBak & 0x03) + 5;
uiParaData[StopBits] = ((uiBak >> 2) & 0x01) + 1;
if (( (uiBak >> 3) & 0x01) == 0)
uiParaData[Parity] = 0;
else
{
uiParaData[Parity] = (((uiBak >> 4) & 0x03) + 1);
}
puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7F; /* 禁止访问分频因子寄存器 */
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartGetState
** Descriptions: 获取当前串口的参数
** input parameters: uiId: 子设备号
** pcArg: 字符串指针
** Output parameters: pcArg: 输出字符串参数
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
extern int32 uartGetState (uint32 uiId, char * pcArg)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定义一个数组存放字符串的参数 */
if (uiId < __UART_MAX_NUM) {
__uartGetState(uiId, uiParaData);
ExpCmd(Tab_UART, pcArg, uiParaData);
}
else
return UART_NOK;
return UART_OK;
}
/*********************************************************************************************************
** Function name: _uartQueueStatus
** Descriptions: 获取Queue队列的状态
** input parameters: PUartInfo : 指向uart信息结构体的指针
** uiWhichFifo : 1-发送队列;0-接收队列
** Returned value: 发送队列中可操作的空间大小,或接收队列中可用数据个数
*********************************************************************************************************/
static int32 _uartQueueStatus (__PUART_INFO PUartInfo, uint32 uiWhichFifo)
{
#if defined(UART_SEMCONTROL)
INT8U UartErr;
#endif // end #if defined(UART_SEMCONTROL)
#if defined(QUEUE_NEW_OPRT)
uint16 uiCurNData = 0;
uint16 uiMaxData;
uint8 *pucIn, *pucOut;
#endif // end of #if defined(QUEUE_NEW_OPRT)
#if defined(QUEUE_NEW_OPRT)
#if defined(UART_SEMCONTROL)
OSSemPend(PUartInfo->pUartSem, 0, &UartErr);
#else
OS_ENTER_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
if ((uiWhichFifo == TX_FIFO) && ((PUartInfo->uiUartFlag) < 0x80))
{
pucIn = PUartInfo->PdqSendBuf->In;
pucOut = PUartInfo->PdqSendBuf->Out;
uiMaxData = PUartInfo->PdqSendBuf->MaxData;
if ( pucIn > PUartInfo->PdqSendBuf->Out ) {
uiCurNData = uiMaxData - (pucIn - pucOut);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -