您的位置:首页 > 其它

NUC100RE3AN串口驱动库修改

2015-08-05 16:31 405 查看
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。我将在了另外一篇文章中说明如何接收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息