📄 uart.c
字号:
/***********************************************Copyright (c)*********************************************
** Guangzou ZLG-MCU Development Co.,LTD.
**
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: uart.c
** Last modified Date: 2007-10-15
** Last Version: 1.0
** Descriptions: 串口的C文件
**
**--------------------------------------------------------------------------------------------------------
** Created by: wengshujie
** Created date: 2007-10-15
** Version: 1.0
** Descriptions: 无
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "Config.h"
#include "uart.h"
/*********************************************************************************************************
定义操作UART器件的结构体,有多个器件就需要声明多个结构体
*********************************************************************************************************/
static __UART_INFO __UART0Info; /* 定义UART0的一个结构体 */
static __UART_INFO __UART1Info;
static __UART_INFO __UART2Info;
static __UART_INFO __UART3Info;
/*********************************************************************************************************
下面使用指针数组来保存结构体指针,方便对该驱动的扩展
*********************************************************************************************************/
__PUART_INFO __GpuiUartInfoTab[__UART_MAX_NUM] = {&__UART0Info, &__UART1Info,
&__UART2Info, &__UART3Info};
/*********************************************************************************************************
下面定义了UART基地址值,如果想增加UART器件可以在该位置添加相应的基地址即可
*********************************************************************************************************/
const uint32 __GuiUartBaseAddrTab[__UART_MAX_NUM] = {UART0_BASE_ADDR, UART1_BASE_ADDR,
UART2_BASE_ADDR, UART3_BASE_ADDR};
/*********************************************************************************************************
下面定义了UART硬件FIFO值,如果想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32 __GuiUartFifoTab[__UART_MAX_NUM] = {UART0FIFOLENFUN, UART1FIFOLENFUN,
UART2FIFOLENFUN, UART3FIFOLENFUN};
/*********************************************************************************************************
下面定义了UART软件接收FIFO大小值,如果有想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32 __GuiQueueReviceFifoTab[__UART_MAX_NUM] = {QUEUE0REVICEFIFOLENFUN,
QUEUE1REVICEFIFOLENFUN,
QUEUE2REVICEFIFOLENFUN,
QUEUE3REVICEFIFOLENFUN};
/*********************************************************************************************************
下面定义了UART软件发送FIFO值,如果有想增加UART器件可以在该位置添加相应的值即可
*********************************************************************************************************/
const uint32 __GuiQueueSendFifoTab[__UART_MAX_NUM] = {QUEUE0SENDFIFOLENFUN, QUEUE1SENDFIFOLENFUN,
QUEUE2SENDFIFOLENFUN, QUEUE3SENDFIFOLENFUN};
/*********************************************************************************************************
下面定义了UART0的软件FIFO数组
*********************************************************************************************************/
uint32 uiUatr0RxBuf[QUEUE0REVICEFIFOLENFUN];
uint32 uiUatr0TxBuf[QUEUE0SENDFIFOLENFUN];
/*********************************************************************************************************
下面定义了UART1的软件FIFO数组
*********************************************************************************************************/
uint32 uiUatr1RxBuf[QUEUE1REVICEFIFOLENFUN];
uint32 uiUatr1TxBuf[QUEUE1SENDFIFOLENFUN];
/*********************************************************************************************************
下面定义了UART2的软件FIFO数组
*********************************************************************************************************/
uint32 uiUatr2RxBuf[QUEUE2REVICEFIFOLENFUN];
uint32 uiUatr2TxBuf[QUEUE2SENDFIFOLENFUN];
/*********************************************************************************************************
下面定义了UART3的软件FIFO数组
*********************************************************************************************************/
uint32 uiUatr3RxBuf[QUEUE3REVICEFIFOLENFUN];
uint32 uiUatr3TxBuf[QUEUE3SENDFIFOLENFUN];
/*********************************************************************************************************
下面使用指针数组来保存UART软件FIFO数组的首地址
*********************************************************************************************************/
const uint32 *GpuiUartReviceTab[__UART_MAX_NUM] = {uiUatr0RxBuf, uiUatr1RxBuf,
uiUatr2RxBuf, uiUatr3RxBuf};
const uint32 *GpuiUartSendTab[__UART_MAX_NUM] = {uiUatr0TxBuf, uiUatr1TxBuf,
uiUatr2TxBuf,uiUatr3TxBuf};
/*********************************************************************************************************
** Function name: __uartBandRate
** Descriptions: 初始化UART波特率参数
** input parameters: PUartInfo: 指向uart信息结构体的指针
** uibps: 波特率值
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
static int32 __uartBandRate (__PUART_INFO PUartInfo, uint32 uibps)
{
volatile uint32 uiOffBase;
volatile uint32 *puiAddrBase;
puiAddrBase = PUartInfo->puiAddrBase; /* 获取结构体参数 */
uiOffBase = PUartInfo->uiOffBase;
if ((uibps <= 115200) && (uibps >= 9600)) { /* 参数过滤 */
puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80; /* 允许访问分频因子寄存器 */
/* 设置波特率 */
puiAddrBase[__B_UART_DLM << uiOffBase] = ((Fpclk / uibps) / 16) / 256;
puiAddrBase[__B_UART_DLL << uiOffBase] = ((Fpclk / uibps) / 16) % 256;
puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7f; /* 禁止访问分频因子寄存器 */
return UART_OK;
}
return UART_NOK;
}
/*********************************************************************************************************
** Function name: __uartMode
** Descriptions: 初始化UART的模式参数
** input parameters: PUartInfo: 指向uart信息结构体的指针
** uiParaData: 参数指针
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
static int32 __uartMode (__PUART_INFO PUartInfo, uint32 *uiParaData)
{
volatile uint32 uiOffBase;
volatile uint32 *puiAddrBase;
uint32 uiBak;
puiAddrBase = PUartInfo->puiAddrBase; /* 获取结构体参数 */
uiOffBase = PUartInfo->uiOffBase;
/* 参数过滤 */
if ((uiParaData[DataBits] <5) || (uiParaData[DataBits] > 8)) {
return UART_NOK;
}
if ((uiParaData[StopBits] == 0) || (uiParaData[StopBits] > 2)) {
return UART_NOK;
}
if (uiParaData[Parity] > 4) {
return UART_NOK;
}
uiBak = uiParaData[DataBits] - 5;
if (uiParaData[StopBits] == 2) { /* 判断是否为2位停止位 */
uiBak |= 0x04;
}
if (uiParaData[Parity] != 0) {
uiParaData[Parity] = uiParaData[Parity] - 1;
uiBak |= 0x08; /* 使能奇偶校验 */
}
uiBak |= uiParaData[Parity] << 4; /* 设置奇偶校验 */
puiAddrBase[__B_UART_LCR << uiOffBase] = uiBak; /* 禁止访问分频因子寄存器 */
return UART_OK;
}
/*********************************************************************************************************
** Function name: __uartInit
** Descriptions: 初始化UART,此函数供UartInit调用,不提供给用户
** input parameters: PUartInfo: 指向uart信息结构体的指针
** uiParaData: 参数指针
** uiReBufSize: uart的接收缓冲区大小
** uiSeBufSize: uart的发送缓冲区大小
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
*********************************************************************************************************/
static uint32 __uartInit (__PUART_INFO PUartInfo,
uint32 *uiParaData,
uint32 uiReBufSize,
uint32 uiSeBufSize)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint32 uiId;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
uiId = PUartInfo->uiUartId;
OS_ENTER_CRITICAL(); /* 关中断 */
if (QueueCreate((void *)PUartInfo->PdqReviceBuf, uiReBufSize, NULL, NULL) == NOT_OK) {
/* 创建接收缓冲区 */
return UART_NOK;
}
if (QueueCreate((void *)PUartInfo->PdqSendBuf, uiSeBufSize, NULL, NULL) == NOT_OK) {
/* 创建发送缓冲区 */
return UART_NOK;
}
PUartInfo->uiUartFlag = 0x80; /* 7位置位表示不用发送队列缓冲
也就是禁止发送中断 */
/* 参数过滤 */
if ((uiParaData[BaudRate] < 9600 ) || (uiParaData[BaudRate] > 115200)) {
uiParaData[BaudRate] = 115200;
}
if ((uiParaData[DataBits] < 5) || (uiParaData[DataBits] > 8)) {
uiParaData[DataBits] = 8;
}
if ((uiParaData[StopBits] == 0) || (uiParaData[StopBits] > 2)) {
uiParaData[StopBits] = 1;
}
if (uiParaData[Parity] > 4) {
uiParaData[Parity] = 0;
}
if (uiParaData[RtsControl] != 0) {
uiParaData[RtsControl] = 0;
}
if (OPERATE_FAIL == (__uartBandRate(PUartInfo,uiParaData[BaudRate]))) {
return UART_NOK;
}
if(OPERATE_FAIL == (__uartMode(PUartInfo,uiParaData))) {
return UART_NOK;
}
puiAddrBase[__B_UART_FCR << uiOffBase] = ((__GuiUartFifoTab[uiId] << 6) | 0x07);
/* 初始化FIFO为N个字节触发,WO
发送和接收的FIFO都使能 */
puiAddrBase[__B_UART_IER << uiOffBase] = 0x05; /* 使能接收中断,不使能发送中断 */
PUartInfo->uiUartFlag |= 0x10; /* 4位置位表示发送队列使能 */
OS_EXIT_CRITICAL();
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartInit
** Descriptions: 串口初始化及中断设置
** input parameters: uiId: 子设备号
** pcArg: 字符串指针
** pRsv: 保留参数
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失败
** Example: char pUart[]="BaudRate=9600,DataBits=8,StopBits=1,Parity=NONE,RtsControl=NONE";
** uartInit(0,pUart,0);
*********************************************************************************************************/
#define MAX_UART_STR_NUM 5 /* 字符串中包含5个参数 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -