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(); //等待数据发送完成
}
-
-
看了2天手册了没看到说这个口要特殊配置啥的啊,实在是没法了。。
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.