📄 uart.c
字号:
else
break;
}
OS_EXIT_CRITICAL();
}
return uiReviceNum;
}
/*********************************************************************************************************
** Function name: __uartWrite
** Descriptions: 发送多个字节数据
** input parameters: PUartInfo: 指向uart信息结构体的指针
** puiData: 要发送的数据的首地址
** uiNumByte: 发送数据的个数
** Output parameters: NONE
** Returned value: 成功发送数据的个数
*********************************************************************************************************/
static uint16 __uartWrite (__PUART_INFO PUartInfo, uint8 *puiData, uint32 uiNumByte)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint32 uiSendNumbyte;
uint8 uiTemp;
uiSendNumbyte = uiNumByte;
PUartInfo->uiUartFlag &= (~0x80); /* 使用队列做为缓冲 */
if((PUartInfo->uiUartFlag) < 0x80) {
OS_ENTER_CRITICAL();
while (uiSendNumbyte > 0) {
if (QueueWrite((void *)PUartInfo->PdqSendBuf, *puiData++) == QUEUE_FULL) {
break;
}
uiSendNumbyte--;
}
PUartInfo->uiUartFlag |= 0x10; /* 使能发送队列 */
if (PUartInfo->uiUartFlag > 0x0f) {
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
if ((puiAddrBase[__B_UART_IER << uiOffBase] & 0x02) == 0) {
if (QUEUE_OK == QueueRead(&uiTemp, PUartInfo->PdqSendBuf)) {
puiAddrBase[__B_UART_IER << uiOffBase] |= 0x02; /* 开发送中断 */
puiAddrBase[__B_UART_THR << uiOffBase] = uiTemp;
}
}
}
OS_EXIT_CRITICAL();
}
return (uiNumByte - uiSendNumbyte);
}
/*********************************************************************************************************
** Function name: uartWrite
** Descriptions: 向串口设备写数据
** input parameters: uiId: 子设备号
** puiBuf: 输出数据的字符串指针地址
** uiNum: 一次写入的数据个数
** pRsv: 保留参数
** Output parameters: NONE
** Returned value: 实际发送的数据个数
*********************************************************************************************************/
extern int32 uartWrite (uint32 uiId,
uint8 *puiBuf,
uint32 uiNum,
void *pRsv)
{
if (uiId < __UART_MAX_NUM){
return (__uartWrite(__GpuiUartInfoTab[uiId], puiBuf, uiNum));
}
else
return 0;
}
/*********************************************************************************************************
** Function name: __uartDirectWrite
** Descriptions: 直接发送一个字节数据
** input parameters: PUartInfo : 指向uart信息结构体的指针
** uiData : 要发送的数据
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
static uint8 __uartDirectWrite (__PUART_INFO PUartInfo, uint8 uiData)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
OS_ENTER_CRITICAL();
puiAddrBase[__B_UART_LCR << uiOffBase] &= (~0x80); /* DLAB = 0 */
puiAddrBase[__B_UART_THR << uiOffBase] = uiData;
while ((puiAddrBase[__B_UART_LSR << uiOffBase] & 0x20) == 0); /* 等待发送完 */
OS_EXIT_CRITICAL();
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartDirectWrite
** Descriptions: 向串口设备直接发送数据
** input parameters: uiId : 子设备号
** uiData : 输出的数据
** Output parameters: NONE
** Returned value: 实际发送的数据个数(1或0);
*********************************************************************************************************/
extern int32 uartDirectWrite (uint32 uiId, uint8 uiData)
{
if (uiId < __UART_MAX_NUM) {
return (__uartDirectWrite(__GpuiUartInfoTab[uiId], uiData));
}
else
return 0;
}
/*********************************************************************************************************
** Function name: __uartIsr
** Descriptions: UART中断服务程序
** input parameters: PUartInfo: 指向uart信息结构体的指针
** Output parameters: NONE
** Returned value: 无
*********************************************************************************************************/
static void __uartNone (__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
{
PUartInfo = PUartInfo;
puiAddrBase = puiAddrBase;
uiOffBase = uiOffBase;
}
static void __uartThre (__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 发送中断 */
{
uint16 uiNum;
DataQueue *dqSend;
uint8 *pucOut, *pucEnd;
PUartInfo-> uiUartState = 1; /* 发状态 */
if (PUartInfo->uiUartFlag < 0x10) {
puiAddrBase[__B_UART_IER << uiOffBase] &= ~0x02;
return;
}
dqSend = PUartInfo->PdqSendBuf;
uiNum = PUartInfo->uiQueueSendFifoLen;
if ( uiNum > dqSend->NData) {
uiNum = dqSend->NData;
}
if (uiNum == 0) {
puiAddrBase[__B_UART_IER << uiOffBase] &= ~0x02;
return;
}
dqSend->NData -= uiNum;
pucOut = dqSend->Out;
pucEnd = dqSend->End;
do {
puiAddrBase[__B_UART_THR << uiOffBase] = *pucOut++;
while((puiAddrBase[__B_UART_LSR << uiOffBase]&0x40)==0); /* 数据是否发出去 */
if (pucOut >= pucEnd) {
pucOut = dqSend->Buf;
}
} while (--uiNum != 0);
dqSend->Out = pucOut;
}
static void __uartRevice(__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 接收中断 */
{
uint8 ucData;
DataQueue *pdqRevice;
uint16 uiNum, uiMaxData;
uint8 *pucIn, *pucEnd;
PUartInfo-> uiUartState = 0; /* 收状态 */
pdqRevice = PUartInfo->PdqReviceBuf;
pucIn = pdqRevice->In;
pucEnd = pdqRevice->End;
uiNum = pdqRevice->NData;
uiMaxData = pdqRevice->MaxData;
do
{
ucData = puiAddrBase[__B_UART_RBR << uiOffBase];
if (uiNum < uiMaxData) {
*pucIn++ = ucData;
if (pucIn >= pucEnd) {
pucIn = pdqRevice->Buf;
}
uiNum++;
}
} while ((puiAddrBase[__B_UART_LSR << uiOffBase] & 0x00000001) != 0);
pdqRevice->In = pucIn;
pdqRevice->NData = uiNum;
}
static void __uartLine(__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 接收线状态 */
{
uint8 uiState;
uiState = puiAddrBase[__B_UART_LSR << uiOffBase];
}
static void (* const __uartFucTiom[16])(__PUART_INFO PUartInfo,
volatile uint32 *puiAddrBase,
uint32 uiOffBase) =
{__uartNone, __uartNone, __uartThre, __uartNone,
__uartRevice, __uartNone, __uartLine, __uartNone,
__uartNone, __uartNone, __uartNone, __uartNone,
__uartRevice, __uartNone, __uartNone, __uartNone};
void __uartIsr (__PUART_INFO PUartInfo)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint8 uiState;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
uiState = puiAddrBase[__B_UART_IIR << uiOffBase] & 0x0f;
__uartFucTiom[uiState](PUartInfo, puiAddrBase, uiOffBase);
}
/*********************************************************************************************************
** Function name: uartIsr
** Descriptions: UART中断服务程序
** input parameters: uiId : 子设备号
** Output parameters: NONE
** Returned value: 无
*********************************************************************************************************/
extern void uartIsr (uint32 uiId)
{
if (uiId < __UART_MAX_NUM) {
__uartIsr(__GpuiUartInfoTab[uiId]);
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -