最近使用NXP Kinetis的 单片机MKE14F512VLL16开发项目
使用的IDE
MCUXpresso v11.3.0使用的SDK软件开发包
SDK_2.x_MKE14F512XXX16 ,v2.8.8有一个应用程序, 必须在两个不同的端口中 使用相同的 LPUART 模块
不同的外围设备连接到每个端口 我不想同时使用它们
外设 1(P1) 连接到:
PTA3 (ALT6)- LPUART0-TX PTA2 (ALT6)- LPUART0-RX外设 2(P2) 连接到:
PTB0 (ALT2)- LPUART0-RX PTB1 (ALT2)- LPUART0-TX在我的应用程序中 先使用以下代码 使用端口 A2 和 A3 初始化 LPUART0 模块
void InitLPUART0(void){ PCC->CLKCFG[PCC_LPUART0_INDEX] |= PCC_CLKCFG_PCS(3); //System Oscillator Bus Clock PCC->CLKCFG[PCC_LPUART0_INDEX] |= PCC_CLKCFG_CGC(1); //PCC Configuration – Enable Clock PORTA->PCR[2] |= PORT_PCR_MUX(6); /* LPUART – ALT6 */ PORTA->PCR[3] |= PORT_PCR_MUX(6); LPUART0->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); LPUART0->BAUD = BAUD_115200; //48M/(26*16)Baud rate for 115200bps LPUART0->CTRL |= LPUART_CTRL_RIE(1); /* Receiver Interrupt Enable */ LPUART0->CTRL |= LPUART_CTRL_TE(1); /* Transmitter enable */ LPUART0->CTRL |= LPUART_CTRL_RE(1); /* Receiver Enable */ NVIC_EnableIRQ(LPUART0_RX_IRQn); }最初,这是按预期工作的。 系统正在通过端口按预期发送数据。
当我需要使用其他外设时, 我将 LPUART0 转移到另一个端口, 如下所示进行初始化。
LPUART0->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); /* Disable Tranceiver */ PORTA->PCR[3] |= PORT_PCR_MUX(1); /* LPUART – ALT1 – GPIO */ PORTA->PCR[2] |= PORT_PCR_MUX(1); PORTB->PCR[0] |= PORT_PCR_MUX(2); /* LPUART – ALT2 – UART */ PORTB->PCR[1] |= PORT_PCR_MUX(2); LPUART0->CTRL |= (LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); /* Enable Tranceiver */安装配置后, MCU系统应该通过端口 B 将数据发送到外设 2 发现即使传输代码正在运行, LPUART 线路也是空闲的
切换端口后 如果我使用相同的方法切换回端口 A 中的外设 1, 它也不会响应。
如果使用其中一个端口而不切换到另一个, 则系统正在工作
4.解决方案修改PORTx_PCR寄存器中的MUX设置 相对应的第 8、9 和 10 位
而不是清除它们 更正的方法贴在下面
void SelectCOMPort(COMPORT_TYPE CPort){ /* Directs LPUART0 to the required port and disables others */ LPUART0->CTRL &= ~(LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); /* Disable Tranceiver */ switch (CPort) { case PORT_1: PORTB->PCR[0] &= ~(BIT8 | BIT9 | BIT10); /* LPUART – Disable */ PORTB->PCR[1] &= ~(BIT8 | BIT9 | BIT10); PORTA->PCR[3] |= PORT_PCR_MUX(6); /* LPUART – ALT6 – to UART */ PORTA->PCR[2] |= PORT_PCR_MUX(6); break; case PORT_2: PORTA->PCR[3] &= ~(BIT8 | BIT9 | BIT10); /* LPUART – Disable */ PORTA->PCR[2] &= ~(BIT8 | BIT9 | BIT10); PORTB->PCR[0] |= PORT_PCR_MUX(2); /* LPUART – ALT2 – to UART */ PORTB->PCR[1] |= PORT_PCR_MUX(2); break; default: break; } LPUART0->CTRL |= (LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK); }<