单片机
返回首页

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

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章