NUC100RE3AN串口驱动库修改

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。我将在了另外一篇文章中说明如何接收。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值