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

📄 uart1.c

📁 LM3S_uCOS2 for 485总线源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:          UART1.c
** Last modified Date: 2006-11-18
** Last Version:       v1.0
** Description:        串口驱动源文件
** 
**------------------------------------------------------------------------------------------------------
** Created By:         Zhou Shaogang
** Created date:       2006-11-18
** Version:            v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include <includes.h>

#ifndef NOT_OK
#define NOT_OK              0xff                        /* 参数错误                                     */
#endif

#ifndef UART1_REC_QUEUE_LEN
#define UART1_REC_QUEUE_LEN   100 
#endif
uint8 UART1_Rec_Queue[UART1_REC_QUEUE_LEN];

#define	RS485_GPIO_PORT		GPIO_PORTC_BASE	
#define RS485_RE_DE             GPIO_PIN_7

#ifndef UART_FR_BUSY
  #define UART_FR_BUSY 0x00000008  
#endif
#define UARTTraBUSY(ulBase) ( (HWREG(ulBase + UART_O_FR) & UART_FR_BUSY) ? true : false )
void RS485PortIni(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);               //使能GPIOC
  GPIODirModeSet(RS485_GPIO_PORT, RS485_RE_DE, GPIO_DIR_MODE_OUT);
  GPIOPinWrite(RS485_GPIO_PORT, RS485_RE_DE, 0); // RS485 接收数据
}
void RS485SendEnable(void)
{
  GPIOPinWrite(RS485_GPIO_PORT, RS485_RE_DE, RS485_RE_DE);
}

void RS485SendDisable(void)
{
  while( UARTTraBUSY(UART1_BASE) );
  GPIOPinWrite(RS485_GPIO_PORT, RS485_RE_DE, 0);	
}

/************************************************************************************
** Function name: UART1Init
** Descriptions:  初始化UART1 
** Input:         BaudRate: 波特率
**                Prio:     中断优先级
** Output:        TRUE :成功
**                FALSE:失败
** Created by:    Zhou Shaogang
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
uint8 UART1Init(uint32 BaudRate, uint8 Prio)
{
  if(BaudRate>115200)                                        //波特率太高,错误返回   
    return(FALSE);
  
  if (QueueCreate(UART1_Rec_Queue,                           //初且化接收队列失败,错误返回
                  UART1_REC_QUEUE_LEN,
                  0,
                  0)==NOT_OK)
  	return(FALSE);                                           
    
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);               //使能串口1外围设备
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);               //使能GPIOD

  
  GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_3); //设置PD2,PD3为RXD1,TXD1
  RS485PortIni();
  UARTConfigSet(UART1_BASE, BaudRate, (UART_CONFIG_WLEN_8 |  //配置串口1,8位数据,1位起始位,1位停止位,用户波特率
                                       UART_CONFIG_STOP_ONE |
                                       UART_CONFIG_PAR_NONE) & 0xFFFFFFEF);

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


/************************************************************************************
** Function name: UART1Send
** Descriptions:  发送多个字节数据
** Input:         Buffer:发送数据存储位置
**                NByte:发送数据个数
** Output:        无
** Created by:    Zhou Shaogang 
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
void UART1Send(uint8 *Buffer, uint16 NByte)
{
  RS485SendEnable();
  while(NByte)
  {
    if( UARTSpaceAvail(UART1_BASE) )
    {
      UARTCharNonBlockingPut(UART1_BASE, *Buffer++);
      NByte--;
    }
  }
  while( !UARTTraFifoEmp(UART1_BASE) );
  RS485SendDisable();
   
}



/************************************************************************************
** Function name: UART1_ISR
** Descriptions:  串口1中断服务函数
** Input:         无 
** Output:        无 
** Created by:    Zhou Shaogang 
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
void UART1_ISR(void)
{
 
  unsigned long ulStatus;
 
  ulStatus = UARTIntStatus(UART1_BASE, true);   //读取已使能的串口1中断状态
  UARTIntClear(UART1_BASE, ulStatus);           //清除当前的串口1中断

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

⌨️ 快捷键说明

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