lPC1788的串口通讯

#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;                    //发送数据    

    return ch;

}

 

 

 

 

 

 

 

//定义一个256字节的缓冲区用于存放接收到的串口数据信息

//定义一个16位数据同时保存接收数据长度以及接收数据的状态

u8 serialBuffer[256] = {0};

u16 serialStatus = 0;

//16字节的状态

//低八位为当前存储的有效数据长度

//15位为接收完成等待处理标志

//8位表示当前已经接受到回车符

//第9到十四位表示在等待处理期间系统冗余发送的数据量

//用于后期通讯系统的负载自适应

 

 

 

void TransSerialsCommand(u8 res)

{

    u8 lostCount;

    u8 receiveCount;

    //接收数据处理

    if(serialStatus & (1<<15))//已经接收完成,这个数据被抛弃

    {

        lostCount = ((u8)(serialStatus>>9))&0x3f;//漏掉的数据计数

        if(lostCount < 0x3f)lostCount++;

        serialStatus &= ~(0x3f<<9);

        serialStatus |= (lostCount<<9);

    }

    else//上一个命令没有接收完

    {

        if(serialStatus & (1<<8))//接收到

        {

            //等待接收N

            if(res == ' ')

            {

                //接收完成

                serialStatus |= 0x8000;

            }

            else//不是 ,这一次命令作废

            {

                serialStatus = 0;

            }

        }

        else//没收到

        {

            if(res == ' ')

            {

                serialStatus |= 0x0100;

            }

            else

            {

                receiveCount = (u8)(serialStatus&0xff);

                if(receiveCount < 255)

                {

                    serialBuffer[receiveCount] = res;

                    receiveCount++;

                    serialStatus &= 0xff00;

                    serialStatus |= receiveCount;

                }

                else

                {

                    //数据溢出,清空

                    serialStatus = 0;

                }

            }

        }

       

    }

}

 

 

 

 

 

 

 

void UART0_IRQHandler(void)

{

    u8 status = 0;

    u8 res = 0;

    //清除串口中断挂起

    NVIC_ClearPendingIRQ(GPIO_IRQn);

    //清除串口接收中断

    if(!(LPC_UART0->IIR & 0x01))//确认有中断发生

    {

        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;                          //设置串口数据格式,8位字符长度,1个停止位,无校验,使能除数访问

   

    LPC_UART0->DLM = ((ApbClock/16)/baud) / 256;    //除数高八位  , 没有小数情况

    LPC_UART0->DLL = ((ApbClock/16)/baud) % 256;    //除数第八位

   

    LPC_UART0->LCR = 0x03;                          //禁止访问除数锁存器,锁定波特率

   

    LPC_UART0->FCR  = 0x00;                         //禁止FIFO

   

    LPC_UART0->IER = 0x01;                          //使能接收中断RDA

    NVIC_EnableIRQ(UART0_IRQn);                     //打开IRQ中断

}

 

void Debug_Serial_Send_Byte(u8 dat)

{

    //当检测到UARTn THR已空时,THRE就会立即被设置。写UnTHR会清零THRE

    //0  -  UnTHR包含有效字符

    //1  -  UnTHR为空

    while(!((LPC_UART0->LSR) & 0x20));      //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空     

    LPC_UART0->THR = dat;                   //发送数据

}

 

void Debug_Serial_Send_Buffer(u8 length,u8* buffer)

{

    u8 i = 0;

    for(i = 0; i < length; i++)

    {

        Debug_Serial_Send_Byte(buffer[i]);

    }

    printf(" ");

}

 

 

 

原文地址:https://www.cnblogs.com/dengxiaojun/p/4338702.html