首页 > 技术知识 > 正文

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

1.前言 2.硬件说明 3.代码编写 4.解决方案 1.前言

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

使用的IDE

MCUXpresso v11.3.0

使用的SDK软件开发包

SDK_2.x_MKE14F512XXX16 ,v2.8.8

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

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

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

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

2.硬件说明

外设 1(P1) 连接到:

PTA3 (ALT6)- LPUART0-TX PTA2 (ALT6)- LPUART0-RX

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

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

外设 2(P2) 连接到:

PTB0 (ALT2)- LPUART0-RX PTB1 (ALT2)- LPUART0-TX

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

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); }
<

猜你喜欢