|
大家好,本人最近刚学习LPC1768,现在利用它的串口3进行串口的数据收发,有些问题请教大家?
这是中断初始化程序:
void uart3Init (void)
{
uint16_t usFdiv;
LPC_PINCON->PINSEL0 |= (0x02 << 0)|(0x02 << 2);
LPC_SC->PCONP |= (1<<25); /* 开启UART3的功率寄存器控制位 */
LPC_UART3->LCR = 0x83; /* 允许设置波特率 */
usFdiv = (SystemFrequency/4/16) / UART_BPS; /* 设置波特率 */
LPC_UART3->DLM = usFdiv / 256;
LPC_UART3->DLL = usFdiv % 256;
LPC_UART3->LCR = 0x03; /* 锁定波特率 */
LPC_UART3->FCR = 0x87; /* 使能FIFO,设置8个字节触发点 */
LPC_UART3->IER = 0x01; /* 使能接收中断 */
LPC_UART3->IER |= (1UL << 1); //使能发送中断
NVIC_EnableIRQ(UART3_IRQn);
NVIC_SetPriority(UART3_IRQn, 7);
}
这是中断服务程序:
void UART3_IRQHandler (void)
{
GulNum = 0;
while ((LPC_UART3->IIR & 0x01) == 0){ /* 判断是否有中断挂起 */
switch (LPC_UART3->IIR & 0x0E){ /* 判断中断标志 */
case 0x04: /* 接收数据中断 */
GucRcvNew = 1; /* 置接收新数据标志 */
for (GulNum = 0; GulNum < 8; GulNum++){ /* 连续接收8个字节 */
GucRcvBuf[GulNum] = LPC_UART3->RBR;
}
break;
case 0x0C: /* 字符超时中断 */
while ((LPC_UART3->LSR & 0x01) == 0x01)
{ /* 判断数据是否接收完毕 */
if(LPC_UART3->LSR & 0x80) == 0x80)
/* 接收到的数据包含错误 */
temp = LPC_UART0->RBR; /* 丢弃接收到的错误字节 */
else
GucRcvBuf[GulNum] = LPC_UART3->RBR;
GulNum++;
}
break;
case 0x02: //发送中断
for(i = 0; i < 8; i++)
{ // 连续发送8个字节
LPC_UART3->THR = g_Uart3Buffer.TxBuffer[pUartDCB->TxCounter++];
}
default:
break;
}
}
}
这是主循环程序:
for(i = 0;i < 8;i++)
{
LPC_UART3->THR = g_Uart3Buffer.TxPtr[g_Uart3DCB.TxCounter++];
}
下面是我请教的问题:
1)初始化时,设置FIFO为8个字节触发,是不是发送时要往THR中送8个字节,才会触发发送中断产生?像下面这个样子:
for(i = 0; i < 8; i++)
{ // 连续发送8个字节
LPC_UART3->THR = g_Uart3Buffer.TxBuffer[pUartDCB->TxCounter++];
}
2)在接收中断中:
发生case 0x0C: /* 字符超时中断 */
是否意味着接受的尾部了,比如对方发送了30个字节,我用case 04:每次接受8个字节,
当发生0c中断时,是不是FIFO里面是最后的6个字节了?
3)在接收中断中:
发生case 0x0C: /* 字符超时中断 */
还要判断 if(LPC_UART3->LSR & 0x80) == 0x80)
/* 接收到的数据包含错误 */
temp = LPC_UART0->RBR; /* 丢弃接收到的错误字节 */
这时发生一次数据错,丢弃了数据,是否意味着对放送了30字节,我只能收到29个了?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|