请选择 进入手机版 | 继续访问电脑版
查看: 48|回复: 1

[分享] 【IRD-LPC1768-DEV】3 串口中断收发

[复制链接]
  • TA的每日心情

    昨天 08:33
  • 签到天数: 63 天

    [LV.6]常住居民II

    15

    主题

    182

    帖子

    23

    金豆

    高级会员

    Rank: 4

    积分
    503
    最后登录
    2019-3-25
    发表于 2019-3-14 23:02:27 | 显示全部楼层 |阅读模式
    分享下串口的设置
           #define IER_RBR                0x01
    #define IER_THRE        0x02
    #define IER_RLS                0x04

    #define IIR_PEND        0x01
    #define IIR_RLS                0x03
    #define IIR_RDA                0x02
    #define IIR_CTI                0x06
    #define IIR_THRE        0x01

    #define LSR_RDR                0x01
    #define LSR_OE                0x02
    #define LSR_PE                0x04
    #define LSR_FE                0x08
    #define LSR_BI                0x10
    #define LSR_THRE        0x20
    #define LSR_TEMT        0x40
    #define LSR_RXFE        0x80




            PINCON->PINSEL0 = 0x00000050;       /* RxD0 is P0.3 and TxD0 is P0.2 */

             UART0->LCR = 0x83;                /* 8 bits, no Parity, 1 Stop bit */
            /* By default, the PCLKSELx value is zero, thus, the PCLK for
            all the peripherals is 1/4 of the SystemFrequency. */
        Fdiv = ( SystemFrequency/4/16 ) / baudrate ;        /*baud rate, Fpclk: 18MHz */
        UART0->DLM = Fdiv / 256;                                                       
        UART0->DLL = Fdiv % 256;
        UART0->LCR = 0x03;                /* DLAB = 0 */
        UART0->FCR = 0x07;                /* Enable and reset TX and RX FIFO. */
       NVIC_EnableIRQ(UART0_IRQn);
        UART0->IER = IER_RBR | IER_THRE | IER_RLS;        /* Enable UART0 interrupt */
        return (TRUE);



    上面主要是设置gpio   设置串口为 baudrate 波特率   8 no 1 模式  使能fifo 中断  
    下面看下中断处理函数



    uint8_t IIRValue, LSRValue;
      uint8_t Dummy = Dummy;
           
      IIRValue = UART0->IIR;

      IIRValue >>= 1;                        /* skip pending bit in IIR */
      IIRValue &= 0x07;                        /* check bit 1~3, interrupt identification */
      if ( IIRValue == IIR_RLS )                /* Receive Line Status */
      {
            LSRValue = UART0->LSR;
            /* Receive Line Status */
            if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
            {

             //这里处理一些错误 打断的
              /* There are errors or break interrupt */
              /* Read LSR will clear the interrupt */
              UART0Status = LSRValue;
              Dummy = UART0->RBR;                /* Dummy read on RX to clear
                                                            interrupt, then bail out */
              return;
            }
           //准备接收数据
            if ( LSRValue & LSR_RDR )        /* Receive Data Ready */                       
            {
              /* If no error on RLS, normal ready, save into the data buffer. */
              /* Note: read RBR will clear the interrupt */
              UART0Buffer[UART0Count] = UART0->RBR;
              UART0Count++;
              if ( UART0Count == BUFSIZE )
              {
                    UART0Count = 0;                /* buffer overflow */
              }       
            }
      }
    //接收数据
      else if ( IIRValue == IIR_RDA )        /* Receive Data Available */
      {
            /* Receive Data Available */
            UART0Buffer[UART0Count] = UART0->RBR;
            UART0Count++;
            if ( UART0Count == BUFSIZE )
            {
              UART0Count = 0;                /* buffer overflow */
            }
      }
    //超时
      else if ( IIRValue == IIR_CTI )        /* Character timeout indicator */
      {
            /* Character Time-out indicator */
            UART0Status |= 0x100;                /* Bit 9 as the CTI error */
      }
      else if ( IIRValue == IIR_THRE )        /* THRE, transmit holding register empty */
      {
            /* THRE interrupt */
            LSRValue = UART0->LSR;                /* Check status in the LSR to see if
                                                            valid data in U0THR or not */
            if ( LSRValue & LSR_THRE )
            {
              UART0TxEmpty = 1;
            }
            else
            {
              UART0TxEmpty = 0;
            }
      }




    主函数内

                    if(UART0Count != 0)//如果有数据进入
                    {
                   
                    UART0->IER = IER_THRE | IER_RLS;                        /* Disable RBR */  //清除标志
              UARTSend( 0, (uint8_t *)UART0Buffer, UART0Count );//发送接收到的数据
              UART0Count = 0;
              UART0->IER = IER_THRE | IER_RLS | IER_RBR;        /* Re-enable RBR *///使能标志
                    }



    WX20190314-224609.png




    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 21:57
  • 签到天数: 133 天

    [LV.7]常住居民III

    28

    主题

    1318

    帖子

    63

    金豆

    金牌会员

    Rank: 6Rank: 6

    积分
    7164
    最后登录
    2019-3-25
    发表于 2019-3-15 08:58:22 | 显示全部楼层
    支持一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|恩智浦技术社区

    GMT+8, 2019-3-26 04:56 , Processed in 0.135568 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表