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.

[参考译文] TM4C123GH6PM:UART2问题

Guru**** 2350610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/607050/tm4c123gh6pm-uart2-problem

器件型号:TM4C123GH6PM

大家好、我设计了定制板、完成了所有焊接等工作 我使用 uart2 (PD6、PD7)建立了 UART 连接、并将 uart0和 uart1引脚用于其他目的。 在设计电路时、我很复杂地忘记了 PD7已锁定、需要解锁。 Uart0示例代码工作正常、但当我尝试将其转换为 uart2并在 startup.c 文件中进行所需的更改时、代码不起作用。 我搜索论坛、发现有人遇到相同的问题、并且没有工作代码共享。 我尝试解锁 PD7、但仍然无法正常工作。 您是否有有效的 uart2代码? 或者、您能帮助我使我的工作正常吗?  

#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"

#include "driverlib/include "driverlib/driver.h"#include"#driverlib/driverlib.rom/driverlib"#include"#driverlib.intrl.driverlib/#include"#driverlib/driverlib/#include "driverlib/#driver.h"#include "driverlib.rom.rom.rom.include"






//
//! \addtogroup example_list
//! 

UART 回波(UART_ECHO)

//! //! 此示例应用利用 UART 来回显文本。 第一个 UART //! (连接到评估板上的 USB 调试虚拟串行端口) //! 将配置为115、200波特、8-n-1模式。 所有字符均接收于 //! UART 被发送回 UART。 //// ***************** // // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *pcFilename、uint32_t ui32Line) { #endif void UARTIntHandler (void); void uart2_init (){ //初始化 UART2 //设置发送和接收中断 //。 初始化 UART2的时钟和端口 D SysCtlPeripheralEnable (SYSCTL_Periph_UART2); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); //为时钟提供启动 SysCtlDelay 的时间(10); //在编程 UARTDisable (UART2_base)之前禁用 UART; //1。 设置波特率、TXE/RXE、stp2 (清除然后再清除)和 wlen (8位_) UARTConfigSetExpClk (UART2_base、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);UART2_Disable (UART2_FOC)/ UARTFOL_DISABLE)。 这应该会在每次我获得一个字节时产生中断。 //1.5。 将 AFSEL 设置为 D6、D7并解锁 D7 HWREG (GPIO_PORTD_BASE_GPIO_LO_LOCK)= GPIO_LOCK_KEY; HWREG (GPIO_PORTD_BASE_GPIO_CR)|= GPIO_PIN_7; GPIOPIN_Configure (GPIO_PD6_U2RX);GPIOPIN_OUT7_GPIOPT_IN_OUTX/INP7 (GPIOP_IN_OUT7_IN_IN_OUTX/INPPT_IN_OUTX/IN_OUTx)无源冗余 ) 。 GPIOOT PinTypeUART (GPIO_PORTD_base、GPIO_PIN_6 | GPIO_PIN_7); //启用全局 NVIC 中断 IntEnable (INT_UART2); //启用本地中断 UARTIntEnable (UART2_base、(UART_INT_TX | UART_INT_RX);//启用 UARTx1_ET_UARTx1_TX_8 、UARTx1_UARTx1_UARTx1_UARTx1_FO_TX_TX_EMBLE/UARTx_TX_TX_TX_TS/ UARTx_TS_TS_EMBLE/UARTxTX_TX_TX_TX_TX_TX_TXD、UARTx8、UARTx_TS_TS_TR_EM_TS_TR_EM_TR_EM_EM_FO_TX_TR UARTIntDisable (UART2_base、UART_INT_TX); //将函数链接到 UART 中断 UARTIntRegister (UART2_base、UARTIntHandler); //启用 UART2 UARTEnable (UART2_base); } void GPIOPinUnlockGPIO (uint32_t ui32port、uint8_t ui8pins){ HWREG (ui32Port + GPIO_LOCK)= GPIO_LOCK_KEY; //解锁端口 HWREG (ui32Port + GPIO_CR)|= ui8引脚; //解锁引脚 HWREG (ui32Port + GPIO_LOCK)= 0; //锁定端口 } //********* // // UART 中断处理程序。 //// ***************** 空 UARTIntHandler (void) { uint32_t ui32Status; // //获取中断状态。 // ui32Status = ROM_UARTIntStatus (UART2_base、true); // //清除已发出的中断。 // ROM_UARTIntClear (UART2_base、ui32Status); // //在接收 FIFO 中有字符时循环。 // while (ROM_UARTCharsAvail (UART2_base)) { // //从 UART 读取下一个字符并将其写回 UART。 // ROM_UARTCharPutNonBlocking (UART2_base、 ROM_UARTCharGetNonBlocking (UART2_base)); // //闪烁 LED 以显示字符传输正在发生。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2); // //延迟1毫秒。 每个 SysCtlDelay 大约为3个时钟。 // SysCtlDelay (SysCtlClockGet ()/(1000 * 3)); // //关闭 LED // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0); } } //********* // //向 UART 发送字符串。 //// ***************** void UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count) { // //循环,同时有更多字符要发送。 // while (ui32Count---) { // //将下一个字符写入 UART。 // ROM_UARTCharPutNonBlocking (UART2_base、* pui8Buffer++); } } //********* // //此示例演示了如何将一串数据发送到 UART。 //// ***************** int main (void) { // //为中断处理程序启用怠惰堆栈。 这允许使用浮点 //在中断处理程序中使用的指令,但代价是 //额外的堆栈用法。 // ROM_FPUEnable(); ROM_FPULazyStackingEnable(); // //将时钟设置为直接从晶体运行。 // ROM_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); // //启用用于板载 LED 的 GPIO 端口。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); // //为 LED 启用 GPIO 引脚(PF2)。 // ROM_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2); // //启用此示例使用的外设。 // // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART2); // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // // ////启用处理器中断。 //// ////// ROM_IntMasterEnable (); // // GPIOPinUnlockGPIO (GPIO_PORTD_base、GPIO_PIN_7); // |解锁 PD7 GPIO //// GPIOPinConfigure (GPIO_PD7_NMI);// HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= 0x4C4F434B;// HWREG (GPIO_PORTD_BASE + GPIO_PO_LOCK)= 0xFF;// HW4C4F_34B;// HWREG (GPIO_P0x80)/GPIO_GPBLE_GPIORT/ GPIORT/ 0xGP_GP_GPIORT/ 0xGP_GPIORT/ 0xGP_GPIORT/ 0xGP_GPD + GPIORP= 0x80;//配置 GPIORT/ GPIORT/ GPIORT/ GPIORP= 0xGP_GPIORT/ 0xGP_GP_GP_GP_GP_GP_GP_GPIORT/ 0x7 (0xGP_GP_GP_GP_GPD + GPIORT/ 0xGP_GP_GP_GPD + GPIORT/ 0xGP_GP_GP_GP // // //////////重新锁定提交寄存器 // // HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= 0; // //// ////// //////// // //////////将 GPIO A0和 A1设置为 UART 引脚。 //// // ////////// ROM_GPIOPORTD_BASE,GPIO_PIN_6 | GPIO_PIN_7); // // //////////////将 UART 配置为115,200,8-N-1操作。 //// ////// ROM_UARTConfigSetExpClk (UART2_base、ROM_SysCtlClockGet ()、9600、 // (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | // UART_CONFIG_PAR_NONE); // ////// ////启用 UART 中断。 //// ////// ROM_IntEnable (INT_UART2); // ROM_UARTIntEnable (UART2_base、UART_INT_RX | UART_INT_RT); // //// ////提示输入文本。 uart2_init (); //// UARTSend ((uint8_t *)"\033[2JEnter 文本:"、16); // //循环通过 UART 永久回显数据。 // while (1) { UARTSend ((uint8_t *)"\033[2JEnter 文本:"、16); SysCtlDelay (1000); } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感受您的痛苦-但您的写作无法实现"最佳质量"的回应。    下面列出的建议尝试在您的帮助中"帮助他人"-并指导您的进一步著作。

    [引用 user="Furkan Erman"]我尝试解锁 PD7,但仍然无法正常工作

    "不起作用"(该术语-不是您的发明)提供"小"的诊断价值!    更有用的是您对具体细节的描述-这更好地澄清了您的问题。  (即不显示信号输出-波特率不符合规格、数据格式非法等)

    此外、我们没有明确告知"如何连接到 UART_2"。   UART_2的输出和输入信号电平为 CMOS -必须连接到符合该规范的器件。  (不是 RS232!)

    示波器提供了监控 UART_2的理想方式。   如果没有这种情况-波特率大幅降低-可能会按下 LED 来工作。

    需要注意的是、您的代码中包含(main)的关键字是对 UART_2的"注释离开"(浪费审阅者的时间)、并且仅在最后(很少)行中正确转向。   这既没有帮助、也没有考虑。

    最后、您选择了涉及此 UART 的许多方面。   这并不适合"kiss"、而是获得 UART_2运行所需的最简单、最直接的设置和配置。  (即减少"出错"-将您扣为人质。)

    关于"解锁成功与否"-在注意结果的同时、将 PD7配置为 GPIO 输出、然后切换、可以很容易地判断出这一点。   如果解锁失败-"您的所有 UART 工作都注定要失败"-因此这项快速检查可能证明是值得的...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。 我在不同的帖子中阅读了您的一些答案、并且很难理解。 你有不寻常的写作风格,我的英语不太好理解。 我想您希望我通过写入 Plz Standby 来等待
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是-是(曾经)正确-网络是在我"在空中"时进入/离开的。 帖子现已完成-并提供了供您考虑的项目。
    祝你好运。

    当"挣扎"(这是我无法知道的)时、您可以始终写信-并请求澄清。  我签订了许多技术合同(有几家小企业)-这些合同要求细节和准确性。   在这里为那些"刚开始使用英语"的人撰写文章时、证明"换档"既耗时又压力大。   您的"PM"始终得到响应-这由您决定...  (即"提问"-随后将进行澄清...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     感谢您让我自己解决问题。 对于在 Tiva Launchpad 上使用 TX、Rx icdi 引脚的用户、请注意:连接 Tx -> Tx 和 Rx -> Rx。 工作代码如下。 不要忘记在 startup.c 文件中进行必要的更改。  

    #include 
    #include 
    #include "inc/hw_ints.h"
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/debug.h"
    #include "driverlib/fpu.h"
    #include "inc/hw_gpio.h"
    #include "driverlib/gpio.h"
    
    #include "driverlib/include "driverlib/driver.h"#include"#driverlib/driverlib.rom/driverlib"#include"#driverlib.intrl.driverlib/#include"#driverlib/driverlib/#include "driverlib/#driver.h"#include "driverlib.rom.rom.rom.include"
    
    
    
    
    
    
    //
    //! \addtogroup example_list
    //! 

    UART 回波(UART_ECHO)

    //! //! 此示例应用利用 UART 来回显文本。 第一个 UART //! (连接到评估板上的 USB 调试虚拟串行端口) //! 将配置为115、200波特、8-n-1模式。 所有字符均接收于 //! UART 被发送回 UART。 //// ***************** // // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *pcFilename、uint32_t ui32Line) { #endif void GPIOPinUnlockGPIO (uint32_t ui32Port、uint8_t ui8pins){ HWREG (ui32Port + GPIO_LOCK)= GPIO_LOCK_KEY; //解锁端口 HWREG (ui32Port + GPIO_CR)|= ui8引脚; //解锁引脚 HWREG (ui32Port + GPIO_LOCK)= 0; //锁定端口 } //********* // //向 UART 发送字符串。 //// ***************** void UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count) { // //循环,同时有更多字符要发送。 // while (ui32Count---) { // //将下一个字符写入 UART。 // ROM_UARTCharPutNonBlocking (UART2_base、* pui8Buffer++); } } //********* // // UART 中断处理程序。 //// ***************** 空 UARTIntHandler (void) { uint32_t ui32Status; // //获取中断状态。 // ui32Status = ROM_UARTIntStatus (UART2_base、true); // //清除已发出的中断。 // ROM_UARTIntClear (UART2_base、ui32Status); // //在接收 FIFO 中有字符时循环。 // while (ROM_UARTCharsAvail (UART2_base)) { // //从 UART 读取下一个字符并将其写回 UART。 // ROM_UARTCharPutNonBlocking (UART2_base、ROM_UARTCharGetNonBlocking (UART2_base)); SysCtlDelay (SysCtlClockGet ()/(1000 * 3)); } } void uart2_init(){ //初始化 UART2 //设置发送和接收中断 //。 UART2和端口 D 的初始化时钟 SysCtlPeripheralEnable (SYSCTL_Periph_UART2); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); //给时钟启动 SysCtlDelay (10)的时间; //将 AFSEL 设置为 D6、D7并解锁 D7 GPIOPinUnlockGPIO (GPIO_PORTD_base、GPIO_PIN_7); GPIOPinConfigure (GPIO_PD6_U2RX); GPIOPinConfigure (GPIO_PD7_U2TX); GPIOPinTypeUART (GPIO_PORTD_base、 GPIO_PIN_6 | GPIO_PIN_7); //设置波特率、TXE/RXE、stp2 (清除然后和 fen)和 wlen (8位_) UARTConfigSetExpClk (UART2_base、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); // UARTFIFOEnable (UART2_base); // UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_FIFO); // UARTFIFOLEVELSet (UART2_base、UART_FIFO_TX1_8、UART_FIFO_RX1_8);//将 Rx 设置为用两个字节触发 //启用全局 NVIC 中断 IntEnable (INT_UART2); //启用本地中断 //UARTIntEnable (UART2_base、(UART_INT_TX);//启用本地中断/INT_RX | INT_RX) UARTIntEnable (UART2_base、UART_INT_RX);//启用 Rx int UARTIntDisable (UART2_base、UART_INT_TX);//启用 Rx int //启用 UART2 UARTEnable (UART2_base); UARTFIFODisable (UART2_base); } //********* // //此示例演示了如何将一串数据发送到 UART。 //// ***************** int main (void) { // //为中断处理程序启用怠惰堆栈。 这允许使用浮点 //在中断处理程序中使用的指令,但代价是 //额外的堆栈用法。 // ROM_FPUEnable(); ROM_FPULazyStackingEnable(); // //将时钟设置为直接从晶体运行。 // SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz); uart2_init(); // //循环通过 UART 永久回显数据。 // ROM_IntMasterEnable(); UARTSend ((uint8_t *)"\033[2JEnter 文本:"、16); while (1) { } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Furkan Erman"]对于在 Tiva Launchpad 上使用 TX、Rx icdi 引脚的用户、请注意:连接 Tx -> Tx 和 Rx -> Rx。

    (几乎)似乎"反直觉"将 MU 的 TX 连接到(远程) RX 和 MCU 的 RX 连接到(远程) TX 是否"正常"?

    然而、更容易-在改变电路板的 ICDI 连接之前-请仔细注意它们-以便"切换到不同的 UART"变得更加简单!

    您最初的帖子指出:"我使用 uart2 (PD6、PD7)建立了 UART 连接、并将 uart0和 uart1引脚用于其他目的。"

    您的是定制板-不太可能包含 ICDI MCU -这就是为什么我问"您是如何连接 UART_2的?"    这是一个关键的诊断-是不是吗?   (但未授予验证...)   完全没有提到 PD6/PD7连接到 ICDI MCU -这很可能在第二块电路板上!   (奇怪/不同寻常!)

    所有其他"提示"都保留-对于那些具有类似"UART 问题"的提示...