NUC100RE3AN这款芯片库函数对串口2的支持并不完善,需要自己修改添加。
1、DrvUART.c文件中的 int32_t DrvUART_Open(UART_PORT port, STR_UART_T *sParam) 将函数最后一个else修改成如下形式。其他串口也出现同样的问题。
该问题会导致无法配置奇偶校验,停止位等等,不改的话只能无校验,1位停止位。
else
{
/* Set Rx Trigger Level */
UART2->FCR.RFITL = sParam->u8cRxTriggerLevel;
/* Set Parity & Data bits & Stop bits */
UART2->LCR.PBE =sParam->u8cParity >> 3;
UART2->LCR.EPE =sParam->u8cParity >> 4;
UART2->LCR.SPE =sParam->u8cParity >> 5;
UART2->LCR.WLS =sParam->u8cDataBits;
UART2->LCR.NSB =sParam->u8cStopBits >> 2;
/* Set Time-Out */
UART2->TOR =sParam->u8TimeOut;
/* Set BaudRate */
BaudRateCalculator(GetUartCLk(), sParam->u32BaudRate, &UART2->BAUD);
}
2、如果需要用到串口接收,还需要以下修改
DrvUART.c文件中 int32_t DrvUART_EnableInt(UART_PORT port,uint32_t u32InterruptFlag,PFN_DRVUART_CALLBACK pfncallback) 添加一个分支
if(port == UART_PORT0) /* Set Specified Interrupt */
{
UART0->IER.RDA_IEN =(u32InterruptFlag & DRVUART_RDAINT)?1:0 ;
UART0->IER.THRE_IEN =(u32InterruptFlag & DRVUART_THREINT)?1:0;
UART0->IER.RLS_IEN =(u32InterruptFlag & DRVUART_RLSNT)?1:0;
UART0->IER.MS_IEN =(u32InterruptFlag & DRVUART_MOSINT)?1:0;
UART0->IER.TOC_EN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out count enable */
UART0->IER.RTO_IEN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out INT enable */
UART0->IER.BUF_ERR_IEN =(u32InterruptFlag & DRVUART_BUFERRINT)?1:0;
UART0->IER.WAKE_IEN =(u32InterruptFlag & DRVUART_WAKEUPINT)?1:0;
UART0->IER.LIN_RX_BRK_IEN=(u32InterruptFlag & DRVUART_LININT)?1:0;
}
else if(port == UART_PORT1)
{
UART1->IER.RDA_IEN =(u32InterruptFlag & DRVUART_RDAINT)?1:0 ;
UART1->IER.THRE_IEN =(u32InterruptFlag & DRVUART_THREINT)?1:0;
UART1->IER.RLS_IEN =(u32InterruptFlag & DRVUART_RLSNT)?1:0;
UART1->IER.MS_IEN =(u32InterruptFlag & DRVUART_MOSINT)?1:0;
UART1->IER.TOC_EN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out count enable */
UART1->IER.RTO_IEN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out INT enable */
UART1->IER.BUF_ERR_IEN =(u32InterruptFlag & DRVUART_BUFERRINT)?1:0;
UART1->IER.WAKE_IEN =(u32InterruptFlag & DRVUART_WAKEUPINT)?1:0;
UART1->IER.LIN_RX_BRK_IEN=(u32InterruptFlag & DRVUART_LININT)?1:0;
}
else if(port == UART_PORT2)//添加此分支
{
UART2->IER.RDA_IEN =(u32InterruptFlag & DRVUART_RDAINT)?1:0 ;
UART2->IER.THRE_IEN =(u32InterruptFlag & DRVUART_THREINT)?1:0;
UART2->IER.RLS_IEN =(u32InterruptFlag & DRVUART_RLSNT)?1:0;
UART2->IER.MS_IEN =(u32InterruptFlag & DRVUART_MOSINT)?1:0;
UART2->IER.TOC_EN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out count enable */
UART2->IER.RTO_IEN =(u32InterruptFlag & DRVUART_TOUTINT)?1:0; /* Time-out INT enable */
UART2->IER.BUF_ERR_IEN =(u32InterruptFlag & DRVUART_BUFERRINT)?1:0;
UART2->IER.WAKE_IEN =(u32InterruptFlag & DRVUART_WAKEUPINT)?1:0;
UART2->IER.LIN_RX_BRK_IEN=(u32InterruptFlag & DRVUART_LININT)?1:0;
}
注意,后面串口2判断中,有个语句 NVIC_EnableIRQ(UART0_IRQn); 这个语句不用改,原因查数据手册。。
3、int32_t DrvUART_Read(UART_PORT u16Port,uint8_t *pu8RxBuf, uint32_t u32ReadBytes) 函数中有个bug,该bug导致读不到串口数据时会陷入死循环中。这里贴出其中一段来进行说明。
<span style="white-space:pre"> </span>for (u32Count=0; u32Count < u32ReadBytes; u32Count++)
{
u32delayno = 0;
while (UART1->FSR.RX_EMPTY ==1)
{
u32delayno++;
if ( u32delayno >= 0x40000000 )
return E_DRVUART_ERR_TIMEOUT;
}
pu8RxBuf[u32Count] = UART1->DATA;
}
0x40000000这个值实在是太大了。导致出现类似死循环的现象,根据自己需求将这个值改小即可。我采用的是十进制的100000
4、若串口采用中断式接收的话,使用DrvUART_Read函数连续接收一串数据时,将出现许多bug。我将在了另外一篇文章中说明如何接收。