历史上的今天
返回首页

历史上的今天

今天是:2024年08月24日(星期六)

2021年08月24日 | LPC1788---串口设置

2021-08-24 来源:eefocus

LPC1788学习之串口学习-寄存器操作


接收数据使用中断接收---发送暂时是直接发送--简单的寄存器操作-记下不忘记!


#include "uart_lpc1788.h"


uint32_t Receive_Sign; //接收数据下标--接收数据个数

uint8_t  Receive_Buf[UART_RING_BUFSIZE]; //接收数组


/*-----------------------串口0初始化------------------*/

void Uart0_Init(uint32_t clk, uint32_t baudrate)

{

    uint32_t tmp;

    uint16_t divisorInt;


    LPC_IOCON->P0_2=0X21;

    LPC_IOCON->P0_3=0X21;


    LPC_SC->PCONP |= (1<<3); //外设时钟使能

//--------------------------------------------- 

    LPC_UART0->FCR=0X07;

    LPC_UART0->FCR=0X00;

    while (LPC_UART0->LSR & 0X01)

    {

        tmp = LPC_UART0->RBR;  //假读取去清空

    }

    LPC_UART0->TER = 0x80;

    while (!(LPC_UART0->LSR & 0x20));

    LPC_UART0->TER = 0;

    LPC_UART0->IER = 0;

    LPC_UART0->LCR = 0;

    LPC_UART0->ACR = 0;

    LPC_UART0->RS485CTRL = 0;

    LPC_UART0->RS485DLY = 0;

    LPC_UART0->ADRMATCH = 0;

    tmp = LPC_UART0->LSR;  //获取线状态寄存器

//-------------------------------------

    divisorInt =Uart0GetDivisorByBaudrate(clk,baudrate);   

    LPC_UART0->LCR |= 0x80; //使能访问除数寄存器


    LPC_UART0->DLM = (divisorInt>>8) & 0xFF;

    LPC_UART0->DLL = divisorInt & 0xFF;


    LPC_UART0->LCR &= (~0x80) & 0xFF; //禁止访问

//------------------------------------------ 

    tmp = (LPC_UART0->LCR & (0x80 | 0x40)) & 0xFF;

    tmp |= 0x03;  //8位数据-1个停止位-禁止奇偶校验

    LPC_UART0->LCR = (uint8_t)(tmp & 0xFF);

//----------------------------------------------

    tmp=0;

    tmp |= 0x01; //使能FIFO

    tmp |= 0x00; //触发点0-一个字符触发中断

    tmp |= 0x04; //发送缓存

    tmp |= 0x02; //接收缓存

    LPC_UART0->FCR = tmp & 0xFF;

//------------------------------------------------

    LPC_UART0->TER |= 0x80;//发送使能

    LPC_UART0->IER|= 0x01& 0x307; //使能RD数据接收中断

    LPC_UART0->IER|= 0x04& 0x307;  //使能RX线状态中断

//----------------------------------------------------

    Receive_Sign=0; 

//--------------------------------------

    NVIC_SetPriority(UART0_IRQn, ((0x01<<3)|0x01));

    NVIC_EnableIRQ(UART0_IRQn);

}

/*-------------------串口0中断函数----------------------*/

void UART0_IRQHandler(void)

{

    uint32_t  tmp, tmp1;


    tmp = ((LPC_UART0->IIR) & 0x3CF) & (7<<1);   //获取中断标识


    if (tmp == (3<<1)) //线状态中断

    {

        tmp1 = ((LPC_UART0->LSR) & 0xFF);

        tmp1 &= ((1<<1) | (1<<2) | (1<<3)| (1<<4) | (1<<7));

        if (tmp1)  //有错误

        {

            while (1){}

        }

    }

    if ((tmp == (2<<1)) || (tmp == (6<<1)))//接收数据中断--超时中断

    {

        Receive_Buf[Receive_Sign]= (LPC_UART0->RBR & 0xFF);  //读取数据

        Receive_Sign++;

    }

    if (tmp == (1<<1))//THRE发送中断

    {

        //UART_IntTransmit(); //发送数据--未使用

    }

}

/*-----------发送指定数组----------------*/

void UART0_SendStr(uint8_t *txbuf)

{

    uint8_t *pChar = txbuf;



    while(*pChar!='')

    {

        while (!(LPC_UART0->LSR & (1<<5)));//发送保持寄存器为空

        LPC_UART0->THR = (*pChar) & 0xFF; //发送数据

        pChar++; 

    }

}

/*---------发送指定数组的指定长度-----不知道为啥-buflen不能使用sizeof函数----------*/

void UART0_SendStrNum(uint8_t *txbuf,uint32_t buflen)

{

    uint16_t i;

    uint8_t *pChar = txbuf;



    for(i=0;i    {

        while (!(LPC_UART0->LSR & (1<<5)));//发送保持寄存器为空

        LPC_UART0->THR = (*pChar) & 0xFF; //发送数据

        pChar++;

    }

}


/*----------根据外设频率与波特率计算分频寄存器的值----------*/

uint16_t Uart0GetDivisorByBaudrate(uint32_t clk, uint32_t baudrate)

{

    float divisor;

    uint16_t divisorInt;

    

    divisor = (float)clk/(baudrate*16);    

    divisorInt = (uint16_t)(divisor/256);    

    divisor-=(divisorInt*256);

    

    if ((divisor - (uint32_t)divisor) > 0.5F)  //四舍五入

    {

        divisorInt = (divisorInt << 8) | ((uint8_t)divisor + 1);

    }

    else

    {

        divisorInt = (divisorInt << 8) | (uint8_t)divisor;

    }    

    return divisorInt;  //高8位-DLM--低8位-DLL

}

推荐阅读

史海拾趣

Danube Enterprise Co Ltd公司的发展小趣事

在稳固了国内市场地位之后,Danube开始将目光投向了全球市场。他们通过设立海外办事处、与当地企业合作等方式,积极开拓国际市场。Danube的产品凭借其卓越的品质和创新的设计,逐渐在国际市场上崭露头角。同时,公司还根据不同国家和地区的市场需求,推出了定制化的产品和服务,进一步增强了其市场竞争力。这些努力让Danube在全球电子行业中逐渐崭露头角,成为了一家备受瞩目的企业。

Fortiming Corporation公司的发展小趣事

背景:在电子行业,成本控制和供应链管理是企业竞争力的重要体现。

发展:Fortiming不断优化供应链管理流程,与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还通过技术创新和工艺改进,降低生产成本,提高产品竞争力。这些措施使得Fortiming在激烈的市场竞争中保持了良好的盈利能力。

Blaze Display Technology Co Ltd公司的发展小趣事

自1982年起,Blaze Display Technology Co., Ltd.(以下简称“Blaze公司”)以其前瞻性的视野和坚定的决心,踏入了LCD显示屏领域。创立初期,公司面临着资金短缺、技术瓶颈以及市场竞争的诸多挑战。然而,凭借创始团队对技术的深刻理解和对市场的敏锐洞察,Blaze公司逐步攻克难关,研发出了一系列具有竞争力的LCD显示屏产品。

GWM Associates公司的发展小趣事
在设计完成后,进行详细的测试和调试,以确保放大器的性能符合设计要求。
Enterpoint公司的发展小趣事

作为一家有社会责任感的企业,Enterpoint公司始终关注可持续发展问题。他们积极推广绿色、环保的生产方式,减少对环境的影响。同时,公司还积极参与社会公益活动,通过捐赠物资、支持教育等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

BELLING LEE公司的发展小趣事

在激烈的市场竞争中,BELLING LEE公司始终坚持品质至上的原则。公司从原材料采购、生产制造到售后服务都严格把关,确保每一款产品都能达到高品质标准。这种对品质的执着追求赢得了客户的信任和好评,也为公司赢得了良好的口碑和品牌形象。

问答坊 | AI 解惑

matlab第六课-图形的修饰

这个好多学问,不过你不想花哨的话,我就简单来几个最常用的了啊…

查看全部问答>

nRF2401 无线传输模块

本帖最后由 paulhyde 于 2014-9-15 03:53 编辑 包括原理图,PCB图和程序,比较全面的资料,内部资料啊!  …

查看全部问答>

求助

马上要毕业了,我是学通信的女生,工作很难找啊,我想好好做一下毕业设计,我的毕业设计的题目是射频技术的研究与应用,看似简单的题目,我却犯难了,不是想网上找些资料随便拼凑一下了事,真的很喜欢这个专业,所以想好好的做,希望各位同仁能够给 ...…

查看全部问答>

整流输出推挽式变压器开关电源 开关电源原理与设计(连载28)

0.2.整流输出推挽式变压器开关电源 整流输出推挽式变压器开关电源,由于两个开关管轮流交替工作,相当于两个开关电源同时输出功率,其输出功率约等于单一开关电源输出功率的两倍。因此,推挽式变压器开关电源输出功率很大,工作效率很高,经桥式 ...…

查看全部问答>

pxa270下键盘编程问题

请问pxa270下键盘编程问题 这个模块是: 按下PXA270下4*4键盘的某个键,运行开发板一个GPRS程序模块,GPRS是用来发短信和打电话的。 请高手指点下,键盘这个如何操作,???…

查看全部问答>

江湖救急!!!请问谁有WAVECOM Q2403A的硬件资料???

江湖救急!!!请问谁有WAVECOM Q2403A的硬件电路资料?做毕业设计用,哪位大侠有的话请发给一份 huwj1986@126.com,小弟感激不尽!!!…

查看全部问答>

RasSetEntryProperties()函数问题?

函数原型 DWORD RasSetEntryProperties(   LPWSTR lpszPhoneBook,   LPWSTR szEntry,   LPRASENTRY lpbEntry,   DWORD dwEntrySize,   LPBYTE lpb,   DWORD dwSize ); ...…

查看全部问答>

通用TFT液晶驱动!!!!

我们公司开发的m600驱动模组能驱动1024*768以下不同厂家不同分辨率的TFT。需要资料的可以跟我联系。 boy_201a@163.com  13501104029 qq 781558807 张凯…

查看全部问答>

做了一块CPLD+ARM的LED显示屏控制卡,但是不会移动显示,求助!

做了一块CPLD+ARM的LED显示屏控制卡,静态显示已经OK,但是不会移动显示,求助!…

查看全部问答>

请各位大侠帮帮忙

上面是主电路图 下面是两个控制信号波形 这两个波形的周期是10us 由于仿真已经仿真过了,现在想要做实验的 请大家介绍款比较简单易用的单片机!! 谢谢 …

查看全部问答>