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位停止位。
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。我将在了另外一篇文章中说明如何接收。
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。我将在了另外一篇文章中说明如何接收。
相关文章推荐
- Linux串口通信
- PHP通过串口实现发送短信
- python简单程序读取串口信息的方法
- Python操作串口的方法
- python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
- 51单片机的中断整理
- 时钟+温度+遥控设置,综合时钟例子
- 温度传感器+I2C+串口+PC上位机(pyserial)例子
- linux串口编程(termios)相关的使用问题
- QT 串口的监控
- 51单片机中data,idata,xdata,pdata的区别
- 什么叫51单片机最小系统
- linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解
- 电脑串口及并口连接线大全
- 用串口连接GSM手机发送和接收短消息,在应用程序中如何编程实现?
- MCU之心路分享
- 按键led
- 单片机学会释放CPU
- 单片机无线串行接口电路设计
- vmware虚拟机配置串口