📄 uart1.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 + -