LPC1125串口0 配置IO口为 PIO3.4(RXD)和PIO3.5(TXD)不能接收数据

2019-03-25 20:08发布

LPC1125串口0 配置IO口为 PIO3.4(TXD)和PIO3.5(RXD)可以发送数据,但是不能就收数据。

换成1.6和1.7口则能正常收发,不知道哪里设置有误还是啥原因?求助。。。以下是配置代码:



IO配置:

LPC_IOCON->PIO3_4=0xd2;                                                                                                                        //设置PIO3.4为U0_RXD

LPC_IOCON->PIO3_5=0xd2;                                                                                                                        //设置PIO3.5为U0_TXD

LPC_GPIO3->DIR  &=!(1<<4);                                                                                                                 //设置GPIO3.4为输入

LPC_GPIO3->DIR  |=(1<<5);                                                                                                                         //设置GPIO3.5为输出



UART0串口初始化:


/******************************************************/

/*函数名称 :MUART0init                                                                                                                         */

/*函数功能 :初始化模块串口                                                                                        */

/*函数说明 :初始化波特率等参数(UART0)                                                */

/*输入参数1:baudrate - 波特率值                                                                                        */

/*输入参数2:无                                                                                                                                                        */

/*输入参数3:无                                                                                                                                                        */

/*输入参数4:无                                                                                                                                                        */

/*输入参数5:无                                                                                                                                                        */

/*输出参数 :无                                                                                                                                                        */

void MUART0init(uint32_t baudrate0)

{       

        uint32_t DL_value0,Clear0=Clear0;                                                                                //Clear0=Clear0解决Clear0=0时编译出现警告

        /*使能并设置串口0时钟*/

        //使能串口0时钟

        LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);                               

        //串口0时钟分频为1:1

        LPC_SYSCON->UART0CLKDIV    = 0x01;                                                               

        //8位传输,1个停止位,无奇偶校验,允许访问除数寄存器

        LPC_UART0->LCR = 0x83;                       

        LPC_UART0->MCR=0x00;

        //计算该波特率要求的除数锁存寄存器值

        DL_value0 = 48000000/16/baudrate0;

        //写除数锁存寄存器高位值

        LPC_UART0->DLM = DL_value0/256;

        //写除数锁存寄存器低位值

        LPC_UART0->DLL = DL_value0%256;

        //DLAB位置0,禁止对除数锁存寄存器的访问

        LPC_UART0->LCR = 0x03;

        //允许FIFO,清空Rx0FIFO 和 Tx0FIFO

        LPC_UART0->FCR = 0x07;

        //读UART0状态寄存器清空残留状态

        Clear0 = LPC_UART0->LSR;

        //开串口接收中断

        LPC_UART0->IER=0x05;

        //开串口中断

        NVIC_EnableIRQ(UART_IRQn);

        NVIC_SetPriority(UART_IRQn, 5);

}




中断函数:


/******************************************************/

/*函数名称 :UART_IRQHandler                                                                                                        */

/*函数功能 :UART0中断服务函数                                                                                  */

/*函数说明 :MUL_UART0中断服务函数                                                                   */

/*输入参数1:无                                                                                                                                                        */

/*输入参数2:无                                                                                                                                                        */

/*输入参数3:无                                                                                                                                                        */

/*输入参数4:无                                                                                                                                                        */

/*输入参数5:无                                                                                                                                                        */

/*输出参数 :无                                                                                                                                                        */

void UART_IRQHandler(void)

{

        uint32_t IRQ_ID0=0;

        IRQ_ID0=LPC_UART0->IIR;                                                                                                                        //读中断状态

        IRQ_ID0=((IRQ_ID0>>1)&0x07);

        if(IRQ_ID0 == 0x02)

        {

                //置位计数标志

                TimeTickU0mark=1;

                //清零计数器

                TimeTickU0=0;               

                MULbuf[MULrxOK][MULcount]=LPC_UART0->RBR;                                  //读取并存储数据

                MULcount++;                                                                                                                                                                //计数器自加

        }

}




//串口数据发送函数


/******************************************************/

/*函数名称 :MULsend                                                                                                                                   */

/*函数功能 :模块串口发送函数                                                                                */

/*函数说明 :                                                                                                                                                                        */

/*输入参数1:无                                                                                                                                                        */

/*输入参数2:无                                                                                                                                                        */

/*输入参数3:无                                                                                                                                                        */

/*输入参数4:无                                                                                                                                                        */

/*输入参数5:无                                                                                                                                                        */

/*输出参数 :无                                                                                                                                                        */

void MULsend(uint8_t *BufferMUL,uint32_t LengthMUL)

{

        do                                                                                                                                                                                            

        {

                while(!(LPC_UART0->LSR & (1<<5)));                                                          //等待上一次数据发送完成

                LPC_UART0->THR = *BufferMUL;                                                                                        //把数据写入发送寄存器

                BufferMUL++;                                                                                                                                                   //取下一个数据

                LengthMUL--;                                                                                                                                                        //取下一个数据

        }while(LengthMUL > 0);                                                                                                                        //观察数据有没有发送完

        while(!(LPC_UART0->LSR & (1<<5)))__nop();                                          //等待数据发送完成

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yufuming007
1楼-- · 2019-03-25 22:27
 精彩回答 2  元偷偷看……
fxyc87
2楼-- · 2019-03-26 01:39
仔细看手册吧,肯定IO没配置好,
yufuming007
3楼-- · 2019-03-26 02:07
fxyc87 发表于 2015-7-3 14:56
仔细看手册吧,肯定IO没配置好,

看了2天手册了没看到说这个口要特殊配置啥的啊,实在是没法了。。
yufuming007
4楼-- · 2019-03-26 04:56
求帮助
15818427644
5楼-- · 2019-03-26 09:21
6.4.51 RXD_LOC
Table 103. IOCON SSP1_MOSI location register (MOSI1_LOC, address 0x4004 40DC) bit
description
Bit Symbol Value Description Reset
value
1:0 MOSI1LOC Selects pin location for the SSP1_MOSI function. 00
0x0 PIO2_3. Selects SSP1_MOSI1 function in pin location
PIO2_3.
0x1 PIO1_9. Selects SSP1_MOSI function in pin location
PIO1_9.
0x2 Reserved.
0x3 Reserved.
31:2 - - Reserved. -
Table 104. IOCON CT32B0_CAP0 location register (CT32B0_CAP0_LOC, address 0x4004
40E0) bit description
Bit Symbol Value Description Reset
value
1:0 CT32B0_CAP0LOC Selects pin location for the CT32B0_CAP0
function.
00
0x0 PIO1_5. Selects CT32B0_CAP0 function in pin
location PIO1_5.
0x1 PIO2_9. Selects CT32B0_CAP0 function in pin
location PIO2_9.
0x2 Reserved.
0x3 Reserved.
31:2 - - Reserved. -
Table 105. IOCON U0_RXD location register (RXD_LOC, address 0x4004 40E4) bit
description
Bit Symbol Value Description Reset
value
1:0 RXDLOC Selects pin location for the U0_RXD function. 00
0x0 PIO1_6. Selects U0_RXD function in pin location PIO1_6.
0x1 PIO2_7. Selects U0_RXD function in pin location PIO2_7.
0x2 Reserved.
0x3 PIO3_4. Selects U0_RXD function in pin location PIO3_4.
31:2 - - Reserved.

一周热门 更多>