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.

[参考译文] TM4C1294NCPDT:UARTCharPut 挂起、好像 UART 未启用

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/695475/tm4c1294ncpdt-uartcharput-hangs-as-though-uart-is-not-enabled

器件型号:TM4C1294NCPDT

我已成功使用 UARTCharGet 和 UARTCharPut 来发送和接收小于 FIFO 大小16的少量字节。

现在我要发送16个字节以上的数据、 UARTCharPut 函数会无限期挂起、等待 FIFO 中有一个可用的点。  有时会提出 FaultISR。

UARTEnable 函  数好像没有被调用(但位于 UARTConfigSetExpClk 内部)、或者在启用 UART 之后、UARTDisable 函数被调用。   但是、我在我的代码或我正在使用的任何 TIVAware 库代码中都找不到此类调用。  我知道我快速连续写入16字节 FIFO 中的字符超过16个、但我很高兴 UARTCharPut 函数阻止等待 FIFO 清空一个或多个元素。

我没有使用中断、也没有启用中断。  

在首次等待 UARTSpaceAvail 返回 true、no 失效后、我尝试使用 UARTCharPut 非阻塞选项。   我发现解决这个问题的唯一方法是在运行几个对 UARTCharPut 的调用之前、按 如下所示设置一个大延迟

ROM_SysCtlDelay (200000);
UARTCharPut (Command_UART_PORT_With_EP、0x23);//获取滤波器类型的应答 cmd
UARTCharPut (Command_UART_PORT_With_EP、(uint8_t) FilterChannel);//使用通道
UARTCharPut (Command_UART_PORT_FilterType、UART8_intt)进行应答;//使用 FilterType 

解释这种行为的可能原因是什么?

BTW 这是我的 UART 初始化例程:

void initialize_uart_on_ep (void)
{
Command_UART_port_and_EP=UART6_BASE;

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);//将
EP 初始化为 SP UART 以执行命令 SysCtlPeripheralEnable (SYSCTL_Periph_UART6);//将 EP 初始化为 SP UART6。

GPIOPinConfigure (GPIO_PP0_U6RX);//UART 用于 EP 和 SP
之间的命令 GPIOPinConfigure (GPIO_P1_U6TX);//UART 用于 EP 和 SP
GPIOPinTypeUART (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1)之间的命令;//UART 用于800EP_USTR_U_UST_UART8_UST_UTP_US_UST_UTOP0_US_UST_UTP_UST_UTP_UST_UTP_0


| UART_US_US_UST_UTP_UST_UTOOT_US_US_UST_UTP_UST_UTP_0_UST_UTP_UST_UTP_UST_UTO 

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

    尊敬的 Peter:

     我在 UART0上写了一个小示例、观察到终端窗口和示波器、但我没有发现问题。 我不需要添加任何延迟。 看一下您的代码、您的波特率为80000、这对我来说有点奇怪。 您可以用代码和我的代码尝试115200吗?

    int
    main (void)
    {
    uint32_t ui32SysClock;
    
    
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    
    
    //
    //启用此示例使用的外设。
    //需要启用 UART 本身以及 GPIO 端口
    //包含将要使用的引脚。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    //为 UART 功能配置 GPIO 引脚复用。
    //只有当您的器件支持 GPIO 引脚功能多路复用时才需要此功能。
    //研究数据表以查看每个引脚分配的函数。
    // TODO:更改此选项以选择您正在使用的端口/引脚
    //
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);
    
    //
    //由于 GPIO A0和 A1用于 UART 功能、它们必须是
    //配置为用作外设功能(而不是 GPIO)。
    //待办事项:更改此项以匹配您正在使用的端口/引脚
    //
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //将 UART 配置为115、200、8-N-1操作。
    //此函数使用 SysCtlClockGet ()或 ui32SysClock 获取系统时钟
    //频率。 这也可以是一个变量或硬编码值
    //而不是函数调用。
    //
    
    UARTConfigSetExpClk (UART0_BASE、ui32SysClock、115200、
    (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
    UART_CONFIG_PAR_NONE));
    
    while (1){
    UARTCharPut (UART0_BASE、'a');
    UARTCharPut (UART0_BASE、'b');
    UARTCharPut (UART0_BASE、 'c');
    UARTCharPut (UART0_BASE、'd');
    UARTCharPut (UART0_BASE、'e');
    UARTCharPut (UART0_BASE、'f');
    UARTCharPut (UART0_BASE、'g');
    UARTCharPut (UART0_BASE、 'h');
    UARTCharPut (UART0_BASE、'i');
    UARTCharPut (UART0_BASE、'j');
    UARTCharPut (UART0_BASE、'k');
    UARTCharPut (UART0_BASE、'l');
    UARTCharPut (UART0_BASE、 'm');
    UARTCharPut (UART0_BASE、'n');
    UARTCharPut (UART0_BASE、'o');
    }
    
    } 

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

    感谢您的回复 Charles。 当我尝试与您相同的代码时、它也对我来说是可以的。 (我创建了20行、每行都用 UARTCharPut 发送字母)、我注意到缓冲区按预期填充在第16行之后。

    这意味着迅速连续调用 UARTCharPut()超过16次的行为不是我的问题的原因。 我将波特率从80K 升至1152K、这没有解决问题。

    如果我在上面的代码中注释了 ROM_SysCtlDelay (200000)、代码中的其他内容会导致 UARTCharPut 挂起、然后通常会提出 FaultISR。

    使用 TI 的文档 spma043.pdf (用于调试 FaultISR),我尝试调查 FaultISR,但它不够描述。 我所了解的只是矢量编号是03、对应于"处理器异常"的故障描述。

    MCU 上还会发生很多其他情况、因此在不缩小范围的情况下、我不确定要复制和粘贴哪些代码。

    我还能尝试什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW 为了获得您为工作提供的上述代码示例,我必须将其从模块中取出,在模块中我通常调用 UARTCharPut(),并像您所做的那样将其放置到 main {}函数中。 当被放置在原始模块中时、只有两个对 UARTCharPUT()的调用有效、第三个对 UARTCharPUT()的调用挂起。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:
    您在哪里调用 UARTCharPut()? 您的意思是、您必须将其从"模块"中取出? 您能否在 UARTCharPut()中显示完整的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我在另一个*。c 文件(因此是模块)中调用它。  我的项目很大、在调用之前和之后会发生许多事情、除非您可以运行整个项目、否则我不知道要为您提供哪些器件。  因此、我要做的是逐位注释掉部分、直到错误消失。  我将告诉您我发现的内容。

    谢谢

    Peter

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

    我花了很多时间来评论在 UARTCharPut()调用之前发生的事情,看看我是否可以删除我的 sysctrldelay 调用,但我没有成功。 如果我发现其他事情通过了调查、我可能会暂停调查并再次做出贡献、

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:
    重新开始调查后、请告知我们您的结果、您可以始终重新打开帖子或创建新帖子。 现在、我将关闭线程。