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:UART 不发送所有字符仅发送2个字符

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/588971/tm4c123gh6pm-uart-not-sending-all-chars-only-2-are-sent

器件型号:TM4C123GH6PM

大家好,我最近买了一个带有 ESP8266 WIFI 模块的节点 MCU,我当时正试图让它与我的 Tiva c 微控制器通信,我当时正试图发送一句简单的 dofile ("script1.lua"),它应该会使节点 MCU 上的 LED 闪烁。 使用 putty 通过串行监视器发送此消息可在节点 MCU 上正常工作, 但是,使用与 PuTTy 设置相同的微控制器并不起作用,事实上当微控制器和 nodemcu 都通过我的笔记本电脑上的 USB 连接时,我可以看到只发送了2个字母。 D 和 o 我句子中的前2个字母没有其他内容被发送,是否知道 Tiva c 可能会发生什么?  

这是我用于发送类似文件的完整代码、然后等待从节点 MCU 接收到任何内容

#include "tm4c123gh66.h"

void UART2_Init (void);
void UART2_Send_Char (char
*字符串);void UART2_Send_String (char *字符串);
void a;
int main ()
{
volatile int delay=0;
UART2_Init (char c
);for (delay = 0;void UART2_UART2+
















(t +)+)+(while UART2+)+(while + 1)+(UART2+)+(UART2+)+

}
void UART2_Init (void)
{
//1. 使用 RCGCUART 寄存器(见第342页)使能 UART 模块。
//启用时钟5
SYSCTL_RCGCUART_R |= 0x04;
// 2. 通过 RCGCGPIO 寄存器(见第338页)使能相应 GPIO 模块的时钟。
//为端口 D 启用时钟
SYSCTL_RCGCGPIO_R |= 0x08;
//要了解要启用哪个 GPIO 端口,请参阅第1344页的表23-5。
//数字使能端口 D
上的引脚 GPIO_PORTD_LOCK_R =0x4C4F434B;
GPIO_PORTD_CR_R = 0xFF;
GPIO_PORTD_DEN_R |= 0xFF;
/3。 将相应管脚的 AFSEL 位置位(见668页)。 要确定
要配置哪些 GPIO、请参见第1337页的表23-4。
//引脚 PD6和 PD7、PD6 -> uart5 Rx、PD7 -> uart5 TX
GPIO_PORTD_AFSEL_R |= 0xC0;
//5. 配置 GPIOPCTL 寄存
器的 PMCn 位域、将 UART 信号赋给相应的//管脚(见685页和1344页的表23-5)。
GPIO_PORTD_PCTL_R |= 0x11000000;
//本节讨论了使用 UART 模块所需的步骤。 对于这个示例、
/UART 时钟被假定为16MHz、并且所需的 UART 配置为:
//1- 115200波特率
//2-数据长度8位
//3 - 1停止位
///4/-无奇偶校验
//5/-无 FIFO
//6/-无中断
//禁用 uart3
UART2_CTL_R &=0xFE;
//get values for IBRD and FBRD from the data sheet page 900
UART2_IBRD_R = 8;
UART2_FBRD_R = 44;
//set the appropriate bit in LCRH for the configuration above
UART2_LCRH_R |= 0x60;
// clock source = system clock
UART2_CC_R &=UART2_R;


= 0x301;/UART2_UART2_UART2_R 模块= 0x00;/UART2_UART2_UART2_R。}


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

    [引用 user="Essam Eid]Tiva c 可能发生的任何情况?我没有尝试完全理解代码,因为它是在直接寄存器模式(DRM)中为寄存器字段写入的幻数,而不是更容易理解 TivaWare API。

    如果您想将 DRM 用于"学习"目的、建议您至少使用来自 Tivaware hw_*.h 寄存器字段的包含文件的宏。

    以下代码看起来可疑、因为值0x40是 UART 接收 FIFO 满(RXFF)标志、我认为代码应该测试 UART 发送 FIFO 满 (TXFF)标志:

    void UART2_Send_Char (char c)
    {
    while ((UART2_FR_R & 0x040)!= 0);
    UART2_DR_R = c;
    } 

    建议您包含 inc/hw_uart.h 文件、然后尝试以下代码以查看是否可以解决您的问题:

    void UART2_Send_Char (char c)
    {
    while ((UART2_FR_R & UART_FR_TXFF)!= 0);
    UART2_DR_R = c;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您,我误读了位号,很抱歉您浪费了时间:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    喜欢您使用"魔数"-或许 DRM 要求的"化学"会将用户从他们的"解决方案焦点"转移到"吃"时间/精力上?   (因此、MCU 页面搜索/转向非常多-以及各个寄存器位正在检查...)

    什么呢?   一天-也许两次(之后)"激光聚焦于关键/关键寄存器位"-所有这些都将被遗忘-并且必须从"方形一个!"开始(再次)过时的流程   谁能称之为"学习?"

    API -相比之下、是"试用、真实、经过测试"-可实现"真实"问题解决-减去用户"耗尽"、多余的精力和大量的时间投资。   是否(部分)注意"成为生产力?"  (由(仅) API 提供-以压倒多数提供。)   使用 API -绝不阻止或限制"注册检查"-这是"掩盖"的点。   为什么是这样?

    虽然您列出了 DRM 的准官方定义-发明和经验表明、"令人愉悦的回归单目。"