This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我在使用 MSPM0L1306的 UART0模块时遇到了一些问题。
如果我 将 UART0 RX 引脚映射到 PA9、一切都正常。 一旦接收到数据、就会按照配置引发中断。 但是、如果我将 UART0_RX 引脚重新配置为在 PA18上、则不再接收任何数据。 传输仍然正常。 UART 的所有寄存器配置完全相同、唯一的区别是 IO MUX 19现在设置为备用功能2 (UART0_RX)。
其他人是否遇到过同样的问题?
PA18不工作
PA9工作正常
尊敬的 Luca:
很抱歉延迟回答您的问题。 您能否共享用于配置 PA9以及 PA18的代码部分? (我不需要整个项目、只需要使用几行代码来设置 UART 和 IO 引脚。
GPIO 代码:
/// Constructor /// /// @param port GPIO port struct (e.g. GPIOA) /// @param pin The pin number (e.g. 1 for PA1) Gpio(GPIO_Regs* const port, const uint32_t pin) : M_PORT{port}, M_PIN_INDEX{pin}, M_PIN_MASK{static_cast<uint32_t>(1U) << pin} { ASSERT(pin < 32U); } /// Configure the pin as an digital input pin /// /// @param function Alternate function selection (0 ... 15) /// @param pull Pull resistor (see #Pull) /// @param inversion Input inversion (see #Inversion) /// @param hysteresis Input hysteresis (see #Hysteresis) void ConfigureAsInput(const uint32_t function, const Pull pull = Pull::NONE, const Inversion inversion = Inversion::DISABLE, const Hysteresis hysteresis = Hysteresis::TTL) { uint32_t reg{}; reg |= IOMUX_PINCM_INENA_ENABLE; reg |= IOMUX_PINCM_PC_CONNECTED; reg |= static_cast<uint32_t>(function); reg |= static_cast<uint32_t>(pull); reg |= static_cast<uint32_t>(inversion); reg |= static_cast<uint32_t>(hysteresis); SetMux(reg); } /// Configure the pin as an digital output pin /// /// @param function Function selection (0 ... 15) /// @param outputType Output type for pin (see #OutputType) /// @param inversion Output inversion (see #Inversion) void ConfigureAsOutput(const uint32_t function, const OutputType outputType = OutputType::PUSH_PULL, const Inversion inversion = Inversion::DISABLE) { uint32_t reg{}; reg |= IOMUX_PINCM_PC_CONNECTED; reg |= static_cast<uint32_t>(function); reg |= static_cast<uint32_t>(outputType); reg |= static_cast<uint32_t>(inversion); SetMux(reg); EnableOutput(); } /// Set the mux register /// /// @param reg The value to write to the mux register void SetMux(const uint32_t reg) { IOMUX->SECCFG.PINCM[M_PIN_INDEX] = reg; }
初始化:
mcal:Common::ResetPeripheral(GPIOA); // Enable power mcal::Power::EnableGpioA(); // Wait 16 cycles for the power to be enabled mcal::Common::DelayCycles(16U); // UART Pins mcal::Gpio uartTxPin(GPIOA, 17U); mcal::Gpio uartRxPin(GPIOA, 18U); // GPIO MUX Function 2 is UART uartTxPin.ConfigureAsOutput(2U); uartRxPin.ConfigureAsInput(2U);
多路复用到其他引脚的 UART 未引起任何问题、因此我很确定这不是 UART 问题。
尊敬的 Luca:
不确定问题是什么、但似乎在您身边。 我可以针对 RX 引脚在 PA9和 PA18之间切换、并使用预期的中断接收数据。
我使用的代码是"uart_external_loopback_interrupt"示例工程、位于 SDK 中的 driverlib 示例下。
使用 SysConfig 工具、以下是为工程生成的定义:
/* Defines for UART_0 RX = PA9 */ #define UART_0_INST UART0 #define UART_0_INST_IRQHandler UART0_IRQHandler #define UART_0_INST_INT_IRQN UART0_INT_IRQn #define GPIO_UART_0_RX_PORT GPIOA #define GPIO_UART_0_TX_PORT GPIOA #define GPIO_UART_0_RX_PIN DL_GPIO_PIN_9 #define GPIO_UART_0_TX_PIN DL_GPIO_PIN_8 #define GPIO_UART_0_IOMUX_RX (IOMUX_PINCM10) #define GPIO_UART_0_IOMUX_TX (IOMUX_PINCM9) #define GPIO_UART_0_IOMUX_RX_FUNC IOMUX_PINCM10_PF_UART0_RX #define GPIO_UART_0_IOMUX_TX_FUNC IOMUX_PINCM9_PF_UART0_TX /* Defines for UART_0 RX = PA18*/ #define UART_0_INST UART0 #define UART_0_INST_IRQHandler UART0_IRQHandler #define UART_0_INST_INT_IRQN UART0_INT_IRQn #define GPIO_UART_0_RX_PORT GPIOA #define GPIO_UART_0_TX_PORT GPIOA #define GPIO_UART_0_RX_PIN DL_GPIO_PIN_18 #define GPIO_UART_0_TX_PIN DL_GPIO_PIN_8 #define GPIO_UART_0_IOMUX_RX (IOMUX_PINCM19) #define GPIO_UART_0_IOMUX_TX (IOMUX_PINCM9) #define GPIO_UART_0_IOMUX_RX_FUNC IOMUX_PINCM19_PF_UART0_RX #define GPIO_UART_0_IOMUX_TX_FUNC IOMUX_PINCM9_PF_UART0_TX
在这个项目中、当我来回切换时、唯一能看到的区别是:
#define GPIO_UART_0_IOMUX_RX (IOMUX_PINCM19)// PA18
#define GPIO_UART_0_IOMUX_RX (IOMUX_PINCM10)// PA9
您好,Dennis
UART 问题已得到解决、感谢您的参与。
最后是原理图错误、UART0被标记为 UART1。 我对此表示歉意。
此致、
卢卡