lPC1788的串口通讯

发布者:JoyfulHearted最新更新时间:2017-01-13 来源: eefocus关键字: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位表示当前已经接受到回车符\r

//第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))//接收到\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

                {

                    //数据溢出,清空

                    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("\r\n");

}


关键字:lPC1788  串口通讯 引用地址:lPC1788的串口通讯

上一篇:LPC1788的ADC和DAC使用
下一篇:LPC1788 nand驱动

推荐阅读最新更新时间:2024-03-16 15:30

两机串口通讯程序
;=============两机串口通讯程序(主机)===================== ; ; 功 能: 使用串行中断,接收数据并显示 ; 硬件环境: 自制 单片机 实验板 ; 软件环境: 伟福 V3.20 ; Create date: 2004_07_26 ; First Modify: 2004_07_26 ; second Modify: ; Last Modify: 2004_07_26 ; Author: Sujiande ; ;===========预定义=================== LED0 EQU 40H ;预定义数码管 LED1 EQU 41H ;预定义数码管 LED2 EQU 42H ;预定义
[单片机]
LPC1788--I2C设置驱动PCF8574 与特别注意事项
简单记录LPC1788学习过程的寄存器操作---I2C学习 寄存器的直接操作可以比较直观学习,深入了解芯片功能! 特别注意事项:如果使用I2C0的P0_27与P0_28时一定要加外部上拉电阻! #include i2c_lpc1788.h /*------------I2C0初始化-------------*/ void I2C0_Init(uint32_t clk, uint32_t clockrate) { uint32_t temp; LPC_IOCON- P0_27=0x21; LPC_IOCON- P0_28=0x21;//配置IO LPC_SC- PCONP |=(1
[单片机]
LPC1788--I2C设置驱动PCF8574 与特别注意事项
单片机和PC机串口通讯试验
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所
[单片机]
单片机和PC机<font color='red'>串口通讯</font>试验
ARM学习《六》——从头文件开始自己动手设置STM32串口通讯
运用STM32的库函数时,有时候为了看懂一句语句需要翻遍整个头文件,找到头文件中预定义的名字到底代表的是什么意思,具体寄存器设置的数值是多少,相当麻烦。我花了一天的时间才明白串口设置的具体过程,只是库函数想的比较周全。下面是我调试好的串口设置程序,头文件是我自己定义的,舍去了库文件中繁琐的结构体定义 首先定义头文件: / RCC_CFGR &= (uint32_t)0xF8FF0000; RCC_CR &= (uint32_t)0xFEF6FFFF; // RCC_CR &= (uint32_t)0xFFFBFFFF; // RCC_CFGR &= (uint32_t)0
[单片机]
#C51串口通讯1-#一串数据#接收与发送(基础概念)
一.场景 测试一帧数据(字符串、字符)、固定长度收/发(不建议),基础概念篇 1.方案设计 方案1:检测固定字节的数据,下位机接收并加1返回至上位机 方案2:检测回车符结束/固定帧尾的数据,下位机接收并加1返回至上位机 2.代码设计 2.1方案1: 2.1.1 中断服务函数传输一帧数据(1Byte),寄存器SBUF 2.1.2 建立缓冲区数组recv_buf 。其中,MAX_LENGTH***数组长度大小要大于实际接收的数据长度***。因为字符串结尾是’’,否则会出错 unsigned char recv_buf ; #define MAX_NUM 3 //一串数组数据最大的索引号 #define MAX_LEN
[单片机]
#C51<font color='red'>串口通讯</font>1-#一串数据#接收与发送(基础概念)
   恩智浦半导体NXP Semiconductors N.V.近日发布了LPC1788微控制器,这是业界首款采用ARM® Cortex™-
   QNX软件系统有限公司今日宣布QNX® Neutrino® RTOS Secure Kernel™6.5.0版本正式商用,该产品是该公司共通准则认证实时操作系统的增强版。QNX® Neutrino® RTOS Secure Kernel™6.5.0版本主要针对发电厂、防御系统,地铁控制中心、政府网络及其它关键性任务应用所设计,使开发人员在基于ARM、Power和x86架构的单核或多核处理器方面有更多的选择,并充分利用QNX操作系统技术的最新功能和增强性能。    QNX Neutrino RTOS Secure Kernel是唯一由共通准则ISO/IEC 15408评估保证级别(EAL)4+授权并能够支持自适应分区的实时操作系
[工业控制]
基于51串口通讯编程软件架构剖析
前言: 串口通讯对于所有的 嵌入式 工程师十分常见,对于一个与外界交互的系统必须依赖一些手段,比如串口、USB、红外、GPRS之类的数据通讯传输方式。而串口作为一种廉价的短距离可靠的通讯方式得到了广泛应用。 废话少说了,就此打住,进入正题。 本文主要从软件结构上讲解如何在资源比较缺乏的系统上实现通讯协议的串口通讯编程,以及如何优化程序效率,从而使系统更快、更稳定运行。 正文: 我们以51 单片机 为例。51中一般针对串口通讯编程,通常采取中断接受查询发送的方式。中断函数在接受数据到达时被重复调用,其实是个重复入栈的过程,所以不宜将函数写的太长,函数太长一般会导致栈太深占用系统资源,二是处理时间过长,可能导致通讯出错。为了防止
[单片机]
Cortex-M3 (NXP LPC1788)之IIS应用--UDA1380进行音频数据播放
LPC1788发送到I2S总线上的音频数据要通过音频解码芯片才能输出模拟音频信号。开发板上使用的是UDA1380,对它的寄存器的配置可以通过L3总线或者I2C总线进行,这里使用I2C总线进行控制,对于I2C总线的操作可以参考之前I2C的介绍。UDA1380的寄存器主要分成3类,系统控制、插值滤波(interpolation filter)、抽取滤波(decimator filter)。插值滤波和DAC转换有关,用于控制控制声音的输出参数。抽取滤波和ADC有关,用于控制对音频的采样。寄存器的地址和功能如图1所示。 图1:UDA1380寄存器地址和功能 根据图1的红色标记中的内容,可以知道两个滤波器的正常使用需要
[单片机]
Cortex-M3 (NXP <font color='red'>LPC1788</font>)之IIS应用--UDA1380进行音频数据播放
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved