/******************************************************************
** 文件名:uart.c
** Copyright (c) 2001-2002 无锡中太通讯有限公司
** 创建人:张树龙
** 日期:2012.4.7
** 修改人:
** 日期:
** 描述: 串口处理
**
** 版本: 1.0
** 修改人:张树龙
** 日期:2012.10.17
** 描述: 1、增加对命令输入的参数进行检测;
** 2、设置PCB版本号的输入由十六进制改为十进制方式
**
** 版本: 1.1
**-----------------------------------------------------------------------------
** 函数:
******************************************************************/
#include "config.h"
#include <stdio.h>
#include "uart.h"
#include <string.h>
#include "timer.h"
#include "lib.h"
#include "eeprom.h"
#include "led.h"
#include "I2C.h"
#include "temp.h"
UINT32 g_UartRxBuffer[UART_BUFFER_LENGTH] = {0}; /*串口接收寄存器*/
UINT32 g_UartLastRxBuffer[UART_BUFFER_LENGTH] = {0};/*串口上次接收数据保存寄存器*/
CHART g_UartCmd[UART_BUFFER_LENGTH] = {0}; /*命令行字符*/
UINT32 g_UartCmdDataFlag = 0; /*进入串口命令参数区标志位,1表示参数区,0表示命令行*/
//UINT32 g_UartCmdData = 0; /*命令参数*/
UINT32 g_UartCmdData[UART_CMD_PARAM_CNT] = {0}; /*modify by licui,2012.10,27*/
UINT32 g_UartRxIdex = 0; /*串口接收指针*/
UINT32 g_UartLastRxIdex = 0; /*串口上次接收指针*/
UINT32 g_UartCmdDataIdex = 0; /*串口命令参数接收指针*/
//UINT32 g_UartCmdDatas[3] = {0}; /*参数字符串数组*/
UINT32 g_UartCmdDatas[UART_CMD_PARAM_CNT][UART_CMD_PARAM_CNT] = {0} ; /*参数字符串数组,用于存放多个参数,modify by licui,2012.10.27*/
UINT32 g_Return = TRUE; /*函数返回标志,modify by licui,2012.10.27*/
UINT32 g_LeftKeyFlag = 0;
static UINT32 g_BackUpFlag = 0; /*↑按键标识符,1表示上次按下↑按键,0表示上次不是↑按键*/
//static UINT32 g_UartCmdDataError = 0; /*参数正确性标志位,1表示参数错误或无参数输入,0表示参数正确*//*modify by licui,2012.10.27*/
static UINT32 g_CmdParaCnt = 0; /*新增命令参数个数统计,modify by licui,2012.10.27*/
/*函数声明*/
static void E2promTest(void);
static void UartCmdProcess(void);
static void HelpCommandProcess(void);
static void SetCommandProcess(void);
static void GetCommandProcess(void);
static void TestCommandProcess(void);
static void TestLed(UINT32 *buffer);
static void PrintTempValue(void);
static void SetDataToEeprom(UINT32 address,UINT32 regaddress,UINT32 data);
static void PrintAllInfo(void);
static void ContrlFanSpeedTest(void);
static void AlarmSwitchSet(UINT32 key,UINT32 addr);
static void EepromInit(void);
static void OtherUartCmdProcess(void);
/*****************************************************************
** 函数名: UartInit
** 输入: 无
** 输出: 无
** 描述: 串口0初始化函数
**
** 全局变量:
** 调用模块:
** 作者:张树龙
** 日期:2012.4.5
** 修改:
** 日期:
******************************************************************/
void UartInit(void)
{
U0FDR = 0x10;
U0IER = 0x05; /*使能接收中断和接收线中断*/
U0FCR = 0x81; /*使用UART0的FIFO,并配置接收FIFO为8字节长度*/
U0LCR = 0x83; /*选择帧长度为8位、停止位为1位、使能偶校验*/
U0TER = 0x80; /*使能串口发送*/
U0DLL = (Fpclk / (16 * UART_BAUDRATE)) % 256; /*得到波特率低位寄存器的值*/
U0DLM = (Fpclk / (16 * UART_BAUDRATE)) / 256; /*得到波特率高位寄存器的值*/
U0LCR = 0x03; /*禁止设置波特率*/
PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | 0x05; /*设置I/O连接到UART0*/
return;
}
/*****************************************************************
** 函数名: UartIrq
** 输入: 无
** 输出: 无
** 描述: 串口0中断处理函数
**
** 全局变量:g_UartRxIdex、g_UartRxBuffer、g_UartLastRxIdex
** 调用模块:ResetWatchDog、DelayUs、UartRxLineProcess、UartDataPrintf
** Uart0RxProcess、RebootI2cBus
** 作者:张树龙
** 日期:2012.4.5
** 修改:
** 日期:
******************************************************************/
void UartIrq(void)
{
UINT32 status = 0,i = 0,backup = 0;
ResetWatchDog();
backup = VICIntEnable; /*保存VICIntEnable当前值*/
VICIntEnClr = (1 << UART0_INT); /*禁止当前中断*/
while(FALSE == ((status = U0IIR) & 0x01)) /*中断标志位检测*/
{
DelayUs(100); /*延时,等待中断类型确定*/
switch(U0IIR & 0x0E) /*中断类别判断*/
{
case LINE_STATE_ERROR_IRQ: /*接收线状态错误*/
UartRxLineProcess();
break;
case UART_RECEIVE_IRQ: /*接收中断*/
for(g_UartRxIdex = 0;g_UartRxIdex < UART_REC_FIFO_LENGTH;g_UartRxIdex++)
{
g_UartRxBuffer[g_UartRxIdex] = U0RBR; /*读取数据*/
}
break;
case UART_REC_TIMEOUT_IRQ: /*接收超时中断*/
while(TRUE == (U0LSR & 0x01))
{
g_UartRxBuffer[g_UartRxIdex++] = U0RBR; /*数据读取*/
}
UartDataPrintf(g_UartRxBuffer[g_UartRxIdex - 1]); /*打印输入的数据*/
break;
default:
break;
}
if((ENTER == g_UartRxBuffer[g_UartRxIdex - 1]) && (1 != g_UartRxIdex)) /*enter接收到*/
{
g_UartRxBuffer[g_UartRxIdex - 1] = '\0'; /*清除回车按键*/
for(i = 0;i < g_UartRxIdex + 1;i++) /*清除打印的数据*/
{
printf("\b%c",0x20);
printf("\b"); /*打印退格*/
}
printf("\r\n#");
for(i = 0;i < g_UartRxIdex;i++) /*重新打印数据*/
{
printf("%c",g_UartRxBuffer[i]);
}
printf("\r\n");
Uart0RxProcess(); /*命令处理*/
g_UartLastRxIdex = g_UartRxIdex;
g_UartRxIdex = 0; /*清零接收指针*/
}
else if((ENTER == g_UartRxBuffer[g_UartRxIdex - 1]) && (1 == g_UartRxIdex)) /*接收到回车按键且总长达为1*/
{
g_UartRxBuffer[g_UartRxIdex - 1] = '\0'; /*清除回车按键*/
printf("\r\n#");
g_UartRxIdex = 0; /*清零接收指针*/
}
}
VICVectAddr = 0x00; /*中断结束,中断地址清零*/
VICIntEnable = backup; /*恢复原来中断使能*/
ResetWatchDog();
return;
}
/*****************************************************************
** 函数名: UartRxLineProcess
** 输入: 无
** 输出: 无
** 描述: 串口0接收线状态错误处理
**
** 全局变量:g_UartRxIdex
** 调用模块:printf
** 作者:张树龙
** 日期:2012.4.5
** 修改:
** 日期:
******************************************************************/
void UartRxLineProcess(void)
{
if(FALSE != OE_ERROR) /*溢出错误*/
{
printf("Warning:uart0 OE_error!\r\n");
}
else if(FALSE != PE_ERROR) /*奇偶错误*/
{
printf("Warning:uart0 PE_error!\r\n");
}
else if(FALSE != FE_ERROR) /*帧错误*/
{
printf("Warning:uart0 FE_error!\r\n");
}
else if(FALSE != BI_ERROR) /*间隔中断错误*/
{
printf("Warning:uart0 BI_error!\r\n");
}
g_UartRxIdex = 0;
return;
}
/*****************************************************************
** 函数名: Uart0RxProcess
** 输入: 无
** 输出: 无
** 描述: 串口0接收数据处理
**
** 全局变量:g_UartCmdDataFlag、g_UartRxIdex、g_UartRxBuffer
** g_UartCmdDatas、g_UartCmd、g_UartLastRxBuffer
** g_UartCmdData、g_UartCmdDataIdex
** 调用模块:StringsToData、UartCmdProcess
** 作者:张树龙
** 日期:2012.4.5
** 修改:增加参数检测处理,多于1个参数的处理为参数错误
** 日期:2012.10.17
** 作者:张树龙
** 修改:修改输入多个命令参数的处理
** 作者:李翠
** 日期:2012.10.27
******************************************************************/
void Uart0RxProcess(void)
{
UINT32 i = 0,j = 0,SpaceOver = 0,CmdFlag = 0,CmdStart = 0;
g_UartCmdDataFlag = 0;
g_CmdParaCnt = 0; /*命令参数个数统计,modify by licui,2012.10.27*/
g_UartCmdDataIdex = 0; /*modify by licui,2012.10.27*/
for(i = 0;i < g_UartRxIdex ;i++)
{
if(SPACE == g_UartRxBuffer[i]) /*等于空格,进入到参数区*/
{
if(TR
- 1
- 2
- 3
- 4
前往页