MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块

1.前言

最近使用NXP Kinetis的 单片机MKE14F512VLL16开发项目

使用的IDE MCUXpresso v11.3.0

使用的SDK软件开发包 SDK_2.x_MKE14F512XXX16 ,v2.8.8

有一个应用程序, 必须在两个不同的端口中 使用相同的 LPUART 模块

不同的外围设备连接到每个端口 我不想同时使用它们

MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块
MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块

2.硬件说明

外设 1(P1) 连接到: PTA3 (ALT6)- LPUART0-TX PTA2 (ALT6)- LPUART0-RX

MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块
MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块

外设 2(P2) 连接到: PTB0 (ALT2)- LPUART0-RX PTB1 (ALT2)- LPUART0-TX

MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块

3.代码编写

在我的应用程序中 先使用以下代码 使用端口 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); }>

免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:MKE14F512VLL16单片机用不同的端口使用相同的 LPUART 模块 https://www.yhzz.com.cn/a/11731.html

上一篇 2023-04-27 08:44:51
下一篇 2023-04-27 10:05:45

相关推荐

联系云恒

在线留言: 我要留言
客服热线:400-600-0310
工作时间:周一至周六,08:30-17:30,节假日休息。