各位高手:
关于LPC1114的串口使用,碰到一个很奇怪的问题,百度好久都没找到解决方法,还请各位答个疑,感谢!
问题:使用周立功提供的TinyM0_Routine的串口例程,使用中断方式接收,查询方式进行发送。在调用发送接口后,会产生接收中断,导致TX发送出来的内容又被串口自身的RX中断接收了,好像产生了回环现象。
附上周立功TinyM0_Routine里UART的例程代码:
#include "LPC11xx.h" /* LPC11xx外设寄存器 */
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define UART_BPS 115200 /* 串口通信波特率 */
/*********************************************************************************************************
全局变量
*********************************************************************************************************/
volatile uint8_t GucRcvNew; /* 串口接收新数据的标志 */
uint8_t GucRcvBuf[10] ; /* 串口接收数据缓冲区 */
uint32_t GulNum; /* 串口接收数据的个数 */
/*********************************************************************************************************
** Function name: myDelay
** Descriptions: 软件延时
** input parameters: ulTime - 延时时间
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void myDelay(uint32_t ulTime)
{
uint32_t i;
i = 0;
while (ulTime--) {
for (i = 0; i < 5000; i++);
}
}
/*********************************************************************************************************
** Function name: uartInit
** Descriptions: 串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uartInit (void)
{
uint16_t usFdiv;
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16); /* 使能IOCON时钟 */
LPC_IOCON->PIO1_6 |= 0x01; /* 将P1.6 1.7配置为RXD和TXD */
LPC_IOCON->PIO1_7 |= 0x01;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); /* 打开UART功能部件时钟 */
LPC_SYSCON->UARTCLKDIV = 0x01; /* UART时钟分频 */
LPC_UART->LCR = 0x83; /* 允许设置波特率 */
usFdiv = (SystemFrequency/LPC_SYSCON->UARTCLKDIV/16)/UART_BPS; /* 设置波特率 */
LPC_UART->DLM = usFdiv / 256;
LPC_UART->DLL = usFdiv % 256;
LPC_UART->LCR = 0x03; /* 锁定波特率 */
LPC_UART->FCR = 0x87; /* 使能FIFO,设置8个字节触发点 */
NVIC_EnableIRQ(UART_IRQn); /* 使能UART中断,并配置优先级 */
NVIC_SetPriority(UART_IRQn, 1);
LPC_UART->IER = 0x01; /* 使能接收中断 */
}
/*********************************************************************************************************
** Function name: uartSendByte
** Descriptions: 向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters: ucDat: 要发送的数据
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uartSendByte (uint8_t ucDat)
{
LPC_UART->THR = ucDat; /* 写入数据 */
while ((LPC_UART->LSR & 0x40) == 0); /* 等待数据发送完毕 */
}
/*********************************************************************************************************
** Function name: uartSendStr
** Descriptions: 向串口发送字符串
** input parameters: pucStr: 要发送的字符串指针
** ulNum: 要发送的数据个数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uartSendStr (uint8_t const *pucStr, uint32_t ulNum)
{
uint32_t i;
for (i = 0; i < ulNum; i++){ /* 发送指定个字节数据 */
uartSendByte (*pucStr++);
}
}
/*********************************************************************************************************
* Function Name: UART_IRQHandler
* Description: UART中断服务函数
* Input: 无
* Output: 无
* Return: 无
*********************************************************************************************************/
void UART_IRQHandler (void)
{
GulNum = 0;
while ((LPC_UART->IIR & 0x01) == 0){ /* 判断是否有中断挂起 */
switch (LPC_UART->IIR & 0x0E){ /* 判断中断标志 */
case 0x04: /* 接收数据中断 */
GucRcvNew = 1; /* 置接收新数据标志 */
for (GulNum = 0; GulNum < 8; GulNum++){ /* 连续接收8个字节 */
GucRcvBuf[GulNum] = LPC_UART->RBR;
}
break;
case 0x0C: /* 字符超时中断 */
GucRcvNew = 1;
while ((LPC_UART->LSR & 0x01) == 0x01){ /* 判断数据是否接收完毕 */
GucRcvBuf[GulNum] = LPC_UART->RBR;
GulNum++;
}
break;
default:
break;
}
}
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 串口中断例程。
** 串口参数:UART波特率115200、8个数据位、1个停止位、无奇偶校验位;
** 跳线连接:分别将P1.7与串口TXD、P1.6与串口RXD短接;
** 操作方法:打开串口调试软件,运行程序,向下位机发送n字节数据,观察接收显示窗口
** 串口调试软件显示下位机返回的数据是否一致。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main(void)
{
SystemInit(); /* 初始化系统 */
uartInit (); /* 串口初始化 */
while (1){
if (GucRcvNew == 1) { /* 判断是否有新数据 */
GucRcvNew = 0; /* 清除标志 */
uartSendStr(GucRcvBuf, GulNum); /* 向串口发送数据 */
}
}
}
/*********************************************************************************************************
End Of File
*********************************************************************************************************/
是不是用的自测模式啊?好多单片机都有这个模式,即把发送和接收端在内部连到一块,一般都是例程中这样做。LPC1114好像是U0MCR寄存器的第4位-Loopback Mode Select。看看例程中这一位是不是置1了。
U0MCR[4] 为0,没有使用Modem Loopback Mode。真是奇了怪了。。
那就不知道了,372497009 这个是周立功技术支持群。你去问问
我也是用了这个程序,但是太长的数据接收不全你知道是什么原因吗