⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart0.c

📁 EasyARM615的KEIL下的调试程序,包含IO口,串口,SPI口等
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: Uart0.c
**创   建   人: 周绍刚
**最后修改日期: 2006年10月12日
**描        述: LM3S单片机下UART0底层驱动 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 周绍刚
** 版  本: V1.0
** 日 期: 2006年10月12日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日 期: 
** 描 述: 
**
********************************************************************************************************/

#include "../config.h"
uint8 Uart0_Rec_Queue[UART0_REC_QUEUE_LEN];

/*********************************************************************************************************
** 函数名称: Uart0Init
** 功能描述: 初始化Uart0 
** 输 入:   BaudRate: 波特率
**           Prio:     中断优先级,越小优先级越高。0-7
** 输 出:   TRUE :成功
**           FALSE:失败
** 全局变量: Uart0_Rec_Queue,UART0_REC_QUEUE_LEN
** 调用模块: QueueCreate
**
** 作 者: 周绍刚
** 日 期: 2006年10月12日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 Uart0Init(uint32 BaudRate, uint8 Prio)
{
  if(BaudRate>115200)                                        //波特率太高,错误返回   
    return(FALSE);
  
  if (QueueCreate(Uart0_Rec_Queue,                           //初且化接收队列失败,错误返回
                  UART0_REC_QUEUE_LEN,
                  0,
                  0)==NOT_OK)
  	return(FALSE);                                           
    
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);               //使能串口0外围设备
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);               //使能GPIOA

  GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); //设置PA0,PA1为RXD0,TXD0
  
  UARTConfigSet(UART0_BASE, BaudRate, (UART_CONFIG_WLEN_8 |  //配置串口0,8位数据,1位起始位,1位停止位,用户波特率
                                       UART_CONFIG_STOP_ONE |
                                       UART_CONFIG_PAR_NONE) & 0xFFFFFFEF);

  UARTFifoLevelSet(UART0_BASE, 8, 8);
  IntEnable(INT_UART0);                                      //使能串口0系统中断
  UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);      //使能串口0接收中断和接收超时中断
  IntPrioritySet(INT_UART0, Prio);                           //设置中断优先级     
  UARTEnable(UART0_BASE);                                
  
  return(TRUE);
}


/*********************************************************************************************************
** 函数名称: Uart0Send
** 功能描述: 发送多个字节数据
** 输 入:   Buffer:发送数据存储位置
**           NByte:发送数据个数
** 输 出:   无
** 全局变量: 无
** 调用模块: 无
**
** 作 者:   周绍刚
** 日 期:   2006年10月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:   
** 日 期: 
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void Uart0Send(uint8 *Buffer, uint16 NByte)
{
  while(NByte)
  {
    if( UARTSpaceAvail(UART0_BASE) )
    {
      UARTCharNonBlockingPut(UART0_BASE, *Buffer++);
      NByte--;
    }
  }

  while( !UARTTraFifoEmp(UART0_BASE) );
}

/*********************************************************************************************************
** 函数名称: Uart0SendQueue
** 功能描述: 发送数据队列中的数据
** 输 入:   Buffer: 队列首地址
**           NByte: 发送数据个数
** 输 出:   TRUE:成功
             FALSE:失败
** 全局变量: 无
** 调用模块: QueueRead, QueueNData
**
** 作 者:   周绍刚
** 日 期:   2006年10月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:   
** 日 期: 
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 Uart0SendQueue(void *Buffer, uint16 NByte)
{
   uint8 uTemp;
   
   if( (Buffer != NULL) && (NByte <= QueueNData(Buffer)) ) //队列非空,且要发送的数据 不多于 队列中已有的数据
   {
      while (NByte-- > 0)
    	{
            if(QueueRead(&uTemp, Buffer)==NOT_OK)    //读队列失败,错误返回
            	return(FALSE); 
        	UARTCharPut(UART0_BASE, uTemp);
    	}
    	
    	return(TRUE);
    } 	
    
    else
    	return(FALSE);
}

/*********************************************************************************************************
** 函数名称: CheckXor
** 功能描述: 异或效验
** 输 入:   Buffer:异或效验数据存储首地址
**           NByte: 异或效验数据个数
** 输 出:   8位异或结果
** 全局变量: 无
** 调用模块: 无
**
** 作 者:   周绍刚
** 日 期:   2006年10月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:   
** 日 期: 
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 CheckXor(uint8 *Buffer, uint16 NByte)
{
  uint8 uTemp=0;
    
  while(NByte-- >0)
  {
   uTemp ^=*Buffer++;   		
  }

  return(uTemp);
}


/*********************************************************************************************************
** 函数名称: UART0_ISR
** 功能描述: 串口0中断服务函数
** 输 入:   无
** 输 出:   无
** 全局变量: Uart0_Rec_Queue
** 调用模块: QueueWrite
**
** 作 者: 周绍刚
** 日 期: 2006年10月12日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void UART0_ISR(void)
{
 
  unsigned long ulStatus;
   
  ulStatus = UARTIntStatus(UART0_BASE, true);   //读取已使能的串口0中断状态
  UARTIntClear(UART0_BASE, ulStatus);           //清除当前的串口0中断

  if((ulStatus & UART_INT_RX) || (ulStatus & UART_INT_RT))               //接收中断
  {
   while( UARTCharsAvail(UART0_BASE) )
   {
    QueueWrite(Uart0_Rec_Queue, (uint8)UARTCharNonBlockingGet(UART0_BASE));//FIFO中的数据入队列
   }
  }
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -