查看: 5325|回复: 4

[求助] ucos ii LPC1768-SK, UART3问题

[复制链接]

该用户从未签到

3

主题

10

帖子

0

注册会员

Rank: 2

积分
59
最后登录
2017-7-3
发表于 2016-3-1 14:18:07 | 显示全部楼层 |阅读模式
本帖最后由 LeoZhou34 于 2016-6-12 17:15 编辑

大家好!

我刚接触ucos不久,我从Micrium官方下载了一个基于NXP LPC1768的示例工程文件Micrium_LPC1768-SK_uCOS-II,编译下载到测试板上,无意间发现串口UART3有些问题,详细如下:

1、我编写的用户程序中没有对串口3进行相关配置,但依然可以进行数据通讯。用USB-RS232模块连接PC和LPC1768的测试板,通过串口助手发送数据,发送后,串口助手可以接收到返回值,且与串口助手发送的数据一致。例如:串口助手发送的数据是01 02 03 04 05,然后接收的数据也是01 02 03 04 05,即接收数据与发送数据一致。另外,随意改变串口助手的波特率设置,此串口上接收的数据依然与发送数据一致。

2、基于上述,我以为是我的程序出错了,然后直接使用了官方示例工程文件,编译下载到测试板上,该串口3的现象与上述一致,即接收和发送一致,且与波特率的更改无影响。

3、我将以前的程序下载到这个测试板上,这个串口3没有上述问题,即我的测试板子是正常的。

请问,有谁遇到过此问题,请给予帮助!
谢谢!

我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-3-1 15:20:01 | 显示全部楼层
很奇怪的现象,楼主可以将在调试的时候看看UART3各寄存器的配置的截图分享一下吗?!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16701
    最后登录
    1970-1-1
    发表于 2016-3-1 22:15:57 | 显示全部楼层
    这么神奇
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    59
    最后登录
    2017-7-3
     楼主| 发表于 2016-3-4 13:15:54 | 显示全部楼层
    1、LPC1768的串口初始化配置,如下:

    #define  BSP_SER_U2_PINS                 (DEF_BIT_10 | DEF_BIT_11)      // P0.10-->TXD2, P0.11-->RXD3
    #define  BSP_SER_U3_PINS                 (DEF_BIT_00 | DEF_BIT_01)      // P0.0-->TXD3,P0.1-->RXD3

    void  BSP_SerInit (CPU_INT08U  ser_id, CPU_INT32U  baud_rate)
    {   
        CPU_INT16U  div;                                            /* Baud rate divisor                                  */
        CPU_INT08U  divlo;
        CPU_INT08U  divhi;
        CPU_INT32U  pclk_freq;  

        BSP_SerRxData  = 0;
        BSP_Ser2RxData = 0;
        BSP_Ser3RxData = 0;
                                                                    /* ------------ COMPUTE DIVISOR BAUD RATE ----------- */
                                                                    /* Get the peripheral frequency                       */
        switch (ser_id)
        {   
            case BSP_SER_COMM_UART_00:         
                  pclk_freq  = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART0);
                  break;
                
            case BSP_SER_COMM_UART_01:
                  pclk_freq  = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART1);
                  break;
                
            case BSP_SER_COMM_UART_02:
                  pclk_freq  = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART2);
                  break;
                
            case BSP_SER_COMM_UART_03:
                  pclk_freq  = BSP_PM_PerClkFreqGet(BSP_PM_PER_NBR_UART3);
                  break;
                
            default:
                  break;
        }
       
       
        div       = (CPU_INT16U)(((2 * pclk_freq / 16 / baud_rate) + 1) / 2);
        divlo     =  div & 0x00FF;                                  /* Split divisor into LOW and HIGH bytes              */
        divhi     = (div >> 8) & 0x00FF;
          
        if (ser_id == BSP_SER_COMM_UART_00)
        {         
              BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART0);
                                                                    /* ------------------- ENABLE UART0 I/Os ------------------ */
            BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U0_PINS, BSP_GPIO_OPT_FNCT_2);
            
                                                                    /* --------------------- SETUP UART0 ---------------------- */
            BSP_SER_REG_U0_LCR = DEF_BIT_07;                        /* Set divisor access bit                                   */
            BSP_SER_REG_U0_DLL = divlo;                             /* Load divisor                                             */
            BSP_SER_REG_U0_DLM = divhi;
                BSP_SER_REG_U0_LCR = 0x03;                              /* 8 Bits, 1 Stop, No Parity                                */
            BSP_SER_REG_U0_IER = 0x00;                              /* Disable both Rx and Tx interrupts                        */
            BSP_SER_REG_U0_FDR = DEF_BIT_NONE;
            BSP_SER_REG_U0_FCR = DEF_BIT_00;                        /* Enable FIFO, flush Rx & Tx                               */

            BSP_IntVectSet((CPU_INT08U   )BSP_INT_SRC_NBR_UART0,
                              (CPU_FNCT_VOID)BSP_SerISR_Handler );

            BSP_IntEn(BSP_INT_SRC_NBR_UART0);
        }
        else if (ser_id == BSP_SER_COMM_UART_01)
        {
                BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART1);
                                                                    /* ------------------- ENABLE UART1 I/Os ------------------ */
            BSP_GPIO_Cfg(BSP_GPIO_PORT2_FAST, BSP_SER_U1_PINS, BSP_GPIO_OPT_FNCT_3);
            
                                                                    /* --------------------- SETUP UART1 ---------------------- */
            BSP_SER_REG_U1_LCR = DEF_BIT_07;                        /* Set divisor access bit                                   */
                BSP_SER_REG_U1_DLL = divlo;                             /* Load divisor                                             */
            BSP_SER_REG_U1_DLM = divhi;
            BSP_SER_REG_U1_LCR = 0x03;                              /* 8 Bits, 1 Stop, No Parity                                */
            BSP_SER_REG_U1_IER = 0x00;                              /* Disable both Rx and Tx interrupts                        */
            BSP_SER_REG_U1_FDR = DEF_BIT_NONE;
            BSP_SER_REG_U1_FCR = DEF_BIT_00;                        /* Enable FIFO, flush Rx & Tx                               */

            BSP_IntVectSet((CPU_INT08U   )BSP_INT_SRC_NBR_UART1,
                              (CPU_FNCT_VOID)BSP_SerISR_Handler );

            BSP_IntEn(BSP_INT_SRC_NBR_UART1);
        }
        else if (ser_id == BSP_SER_COMM_UART_02)
        {
            BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART2);
                                                                    /* ------------------- ENABLE UART2 I/Os ------------------ */
            BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U2_PINS, BSP_GPIO_OPT_FNCT_2);
            
                                                                    /* --------------------- SETUP UART2 ---------------------- */
            BSP_SER_REG_U2_LCR = DEF_BIT_07;                        /* Set divisor access bit                                   */
                BSP_SER_REG_U2_DLL = divlo;                             /* Load divisor                                             */
            BSP_SER_REG_U2_DLM = divhi;
            BSP_SER_REG_U2_LCR = 0x03;                              /* 8 Bits, 1 Stop, No Parity                                */
            BSP_SER_REG_U2_IER = 0x01;                              /* Enable Rx interrupt, and disable Tx interrupt            */
            BSP_SER_REG_U2_FDR = DEF_BIT_NONE;
            BSP_SER_REG_U2_FCR = DEF_BIT_NONE;                      /* Disable FIFO, flush Rx & Tx                              */

            BSP_IntVectSet((CPU_INT08U   )BSP_INT_SRC_NBR_UART2,
                              (CPU_FNCT_VOID)BSP_IntHandlerUART2 );

            BSP_IntEn(BSP_INT_SRC_NBR_UART2);
        }
        else if (ser_id == BSP_SER_COMM_UART_03)
        {
            BSP_PM_PerClkEn(BSP_PM_PER_NBR_UART3);
                                                                    /* ------------------- ENABLE UART3 I/Os ------------------ */
            BSP_GPIO_Cfg(BSP_GPIO_PORT0_FAST, BSP_SER_U3_PINS, BSP_GPIO_OPT_FNCT_3);
            
                                                                    /* --------------------- SETUP UART3 ---------------------- */
            BSP_SER_REG_U3_LCR = DEF_BIT_07;                        /* Set divisor access bit                                   */
                BSP_SER_REG_U3_DLL = divlo;                             /* Load divisor                                             */
            BSP_SER_REG_U3_DLM = divhi;
            BSP_SER_REG_U3_LCR = 0x03;                              /* 8 Bits, 1 Stop, No Parity                                */
            BSP_SER_REG_U3_IER = 0x01;                              /* Enable Rx interrupt, and disable Tx interrupt            */
            BSP_SER_REG_U3_FDR = DEF_BIT_NONE;
            BSP_SER_REG_U3_FCR = DEF_BIT_NONE;                      /* Disable FIFO, flush Rx & Tx                              */
            
            BSP_IntVectSet((CPU_INT08U   )BSP_INT_SRC_NBR_UART3,
                              (CPU_FNCT_VOID)BSP_IntHandlerUART3 );

            BSP_IntEn(BSP_INT_SRC_NBR_UART3);
        }
    }

    2、串口3的中断服务程序
    static  void  BSP_IntHandlerUART3 (void)
    {
        CPU_INT08U  lsr;
        CPU_INT08U  iir;
        OS_CPU_SR    cpu_sr;
       
        OS_ENTER_CRITICAL();
        OSIntEnter();
        OS_EXIT_CRITICAL();
            
        iir = BSP_SER_REG_U3_IIR & 0x0F;
       
        while (iir != 1)
        {
            switch (iir)
            {
                case  2:                                            /* Transmitted character?                                   */
                    break;

                case  4:                                            /* Received a character?                                    */   
                    lsr            = BSP_SER_REG_U3_LSR;
                    BSP_Ser3RxData = BSP_SER_REG_U3_RBR;
                    bsp_ser_net_rx_data (BSP_Ser3RxData);
                    (void)lsr;
                    break;

                default:
                    break;
            }
            
            iir = BSP_SER_REG_U3_IIR & 0x0F;      
        }
       
        OSIntExit();
    }

    3、串口2的中断服务程序
    static  void  BSP_IntHandlerUART2 (void)
    {
        CPU_INT08U  lsr;
        CPU_INT08U  iir;
        OS_CPU_SR    cpu_sr;
       
        OS_ENTER_CRITICAL();
        OSIntEnter();
        OS_EXIT_CRITICAL();
       
        iir = BSP_SER_REG_U2_IIR & 0x0F;
       
        while (iir != 1)
        {
            switch (iir)
            {
                case  2:                                            /* Transmitted character?                                   */   
                    break;

                case  4:                                            /* Received a character?                                    */
                    lsr            = BSP_SER_REG_U2_LSR;
                    BSP_Ser2RxData = BSP_SER_REG_U2_RBR;
                    bsp_ser_plc_rx_data (BSP_Ser2RxData);
                    (void)lsr;
                    break;

                default:
                    break;
            }
            
            iir = BSP_SER_REG_U2_IIR & 0x0F;      
        }
       
        OSIntExit();
    }

    4、串口2和串口3初始化后,UART2和UART3的寄存器配置如附件照片。


    问题:
    1)上述程序中是已经使用了ucos:UART2和UART3具有相同的配置形式,UART2可以正常接收和发送,但UART3不可以(将UART3的TX和RX对接后,TX发出的数据后,不能进入到接收中断。另外,有时能进入到中断服务器程序,但识别不到任何中断源:RBR Interrupt,THRE Interrupt, 还是RX LINE Status Interrupt)。

    2)直接使用未嵌入ucos的工程,在相同的测试板上UART3可以正常发送数据和接收中断接收数据。

    这个问题已经困扰我很久了,一直未得到解决。
    请求帮助!


    IMG_20160304125317.jpg
    IMG_20160304125251.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    半小时前
  • 签到天数: 1847 天

    连续签到: 2 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112625
    最后登录
    2025-7-20
    发表于 2019-2-5 16:08:03 | 显示全部楼层
    了解学习一下~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

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

    GMT+8, 2025-7-20 23:24 , Processed in 0.108703 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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