📄 uart.c
字号:
uiSendNumbyte = uiNumByte;
PUartInfo->uiUartFlag &= (~0x80); /* 使用队列做为缓冲 */
if ((PUartInfo->uiUartFlag) < 0x80) {
IRQDisable(); /* 关中断 */
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;
}
}
}
IRQEnable(); /* 开中断 */
}
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;
IRQDisable(); /* 关中断 */
puiAddrBase[__B_UART_LCR << uiOffBase] &= (~0x80); /* DLAB = 0 */
puiAddrBase[__B_UART_THR << uiOffBase] = uiData;
while ((puiAddrBase[__B_UART_LSR << uiOffBase] & 0x20) == 0); /* 等待发送完 */
IRQEnable(); /* 开中断 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** 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 = (uint16)PUartInfo->uiQueueSendFifoLen;
if ( uiNum > dqSend->NData) {
uiNum = dqSend->NData;
}
if (uiNum == 0) {
puiAddrBase[__B_UART_IER << uiOffBase] &= ~0x02;
return;
}
dqSend->NData = (uint16)(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)
/* 接收中断 */
{
uint32 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++ = (uint8)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)
/* 接收线状态 */
{
uint32 uiTemp;
uiTemp = 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;
uint32 uiTemp;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
uiTemp = puiAddrBase[__B_UART_IIR << uiOffBase] & 0x0f;
__uartFucTiom[uiTemp](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]);
}
}
/*********************************************************************************************************
** Function name: uart0Isr
** Descriptions: UART0中断入口函数
** input parameters: NONE
** Output parameters: NONE
** Returned value: 无
********************************************************************************************************/
extern void uart0Isr (void)
{
uartIsr(UART0); /* 系统中断处理函数 */
uart0Hook (); /* 用户钩子函数 */
VICVectAddr = 0x00; /* 中断处理结束 */
}
/*********************************************************************************************************
** Function name: uart1Isr
** Descriptions: UART1中断入口函数
** input parameters: NONE
** Output parameters: NONE
** Returned value: 无
********************************************************************************************************/
extern void uart1Isr (void)
{
uartIsr(UART1);
uart1Hook (); /* 用户钩子函数 */
VICVectAddr = 0x00; /* 中断处理结束 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -