#ifndef __DEBUGSERIAL_H_
#define __DEBUGSERIAL_H_
#include "sys.h"
#include "stdio.h"
extern u8 serialBuffer[256];
extern u16 serialStatus;
//?
void Debug_Serial_Init(u32 baud);
void Debug_Serial_Send_Byte(u8 dat);
void Debug_Serial_Send_Buffer(u8 length,u8*buffer);
#endif
#include "debugSerial.h"
//加入printf支持
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
FILE __stdout;
_sys_exit(int x)
{
x=x;
}
int fputc(int ch,FILE*f)
{
while(!((LPC_UART0->LSR)&0x20)); //等待判斷LSR[5](即THRE)是否是1,1時表示THR中為空
LPC_UART0->THR=(u8)ch; //發(fā)送數(shù)據(jù)
returnch;
}
//定義一個256字節(jié)的緩沖區(qū)用于存放接收到的串口數(shù)據(jù)信息
//定義一個16位數(shù)據(jù)同時保存接收數(shù)據(jù)長度以及接收數(shù)據(jù)的狀態(tài)
u8 serialBuffer[256]={0};
u16 serialStatus=0;
//16字節(jié)的狀態(tài)
//低八位為當前存儲的有效數(shù)據(jù)長度
//15位為接收完成等待處理標志
//8位表示當前已經接受到回車符r
//第9到十四位表示在等待處理期間系統(tǒng)冗余發(fā)送的數(shù)據(jù)量
//用于后期通訊系統(tǒng)的負載自適應
void TransSerialsCommand(u8 res)
{
u8 lostCount;
u8 receiveCount;
//接收數(shù)據(jù)處理
if(serialStatus&(1<<15))//已經接收完成,這個數(shù)據(jù)被拋棄
{
lostCount=((u8)(serialStatus>>9))&0x3f;//漏掉的數(shù)據(jù)計數(shù)
if(lostCount<0x3f)lostCount++;
serialStatus&=~(0x3f<<9);
serialStatus|=(lostCount<<9);
}
else//上一個命令沒有接收完
{
if(serialStatus&(1<<8))//接收到r
{
//等待接收N
if(res=='n')
{
//接收完成
serialStatus|=0x8000;
}
else//不是n,這一次命令作廢
{
serialStatus=0;
}
}
else//沒收到r
{
if(res=='r')
{
serialStatus|=0x0100;
}
else
{
receiveCount=(u8)(serialStatus&0xff);
if(receiveCount<255)
{
serialBuffer[receiveCount]=res;
receiveCount++;
serialStatus&=0xff00;
serialStatus|=receiveCount;
}
else
{
//數(shù)據(jù)溢出,清空
serialStatus=0;
}
}
}
}
}
void UART0_IRQHandler(void)
{
u8 status=0;
u8 res=0;
//清除串口中斷掛起
NVIC_ClearPendingIRQ(GPIO_IRQn);
//清除串口接收中斷
if(!(LPC_UART0->IIR&0x01))//確認有中斷發(fā)生
{
status=LPC_UART0->IIR&0x0e;
if(status==0x04)//確認是RDA中斷
{
//讀取串口接收值
res=(LPC_UART0->RBR&0xff);
//處理串口接收值
TransSerialsCommand(res);
}
}
}
void Debug_Serial_Init(u32 baud)
{
LPC_SC->PCONP|=(1<<3)|(1<<15); //打開時鐘
//配置io口
LPC_IOCON->P0_2=0x00; //選擇TXD功能,禁止遲滯 不反向 正常推挽
LPC_IOCON->P0_2|=(1<<0)|(2<<3); //上拉
LPC_IOCON->P0_3=0x00; //選擇RXD功能,禁止遲滯 不反向 正常推挽
LPC_IOCON->P0_3|=(1<<0)|(2<<3); //上拉
LPC_UART0->LCR=0x83; //設置串口數(shù)據(jù)格式,8位字符長度,1個停止位,無校驗,使能除數(shù)訪問
LPC_UART0->DLM=((ApbClock/16)/baud)/256; //除數(shù)高八位 , 沒有小數(shù)情況
LPC_UART0->DLL=((ApbClock/16)/baud)%256; //除數(shù)第八位
LPC_UART0->LCR=0x03; //禁止訪問除數(shù)鎖存器,鎖定波特率
LPC_UART0->FCR=0x00; //禁止FIFO
LPC_UART0->IER = 0x01; //使能接收中斷RDA