STM32F4 USART1发送垃圾

STM32F4 USART1发送垃圾,stm32,cortex-m,cmsis,Stm32,Cortex M,Cmsis,当从STM32F411向PC发送字符时,它会读入垃圾,但当我执行相反的操作时,MCU会正确读取发送的字符 我执行以下操作: 启用GPIOA时钟并配置插脚9和10备用功能 启用USART1,保留M(消息长度)、停止位、DMA的默认值 设置USARTDIV以在16Mhz(HSI)下产生9600波特* 将USART配置为发送空闲帧作为第一次传输 *我还尝试了100MhzAPB2总线频率,结果相同 配置USART // 1. Enable USART SET_BIT(USART1->CR1, US

当从STM32F411向PC发送字符时,它会读入垃圾,但当我执行相反的操作时,MCU会正确读取发送的字符

我执行以下操作:

  • 启用GPIOA时钟并配置插脚9和10备用功能
  • 启用USART1,保留M(消息长度)、停止位、DMA的默认值
  • 设置
    USARTDIV
    以在16Mhz(HSI)下产生9600波特*
  • 将USART配置为发送空闲帧作为第一次传输
  • *我还尝试了100Mhz
    APB2
    总线频率,结果相同

    配置USART

    // 1. Enable USART
    SET_BIT(USART1->CR1, USART_CR1_UE);
    // 5. Select the desired baud rate in BRR
    SET_BIT(USART1->BRR, 0x683);        // USARTDIV
    // 6. Set TE in CR1 to send an idle frame as first transmission
    SET_BIT(USART1->CR1, USART_CR1_TE);
    
    在此之后,我尝试接受RealTerm2.0的
    a
    字符,配置如下:
    9600 8N1 None

    字符由以下代码发送:

    void SendChar_USART(char pChar)
    {
        // Transmitter 7, 8
        // 7. Write the data to send in the DR register (this clears TXE)
        USART1->DR = pChar;
        while(!READ_BIT(USART1->SR, USART_SR_TXE));
    }
    

    更新1


    切换到具有完全相同配置的USART2解决了这个问题,并且可以从串行终端恢复文本,但是这个问题没有得到回答:“为什么USART1不能按预期工作?”

    延伸连接器的PA9引脚上有一个电容器过滤掉了USART1 TX。我认为Peter Harrison很好地解释了这个问题


    每个都连接到什么,可能usart1连接到片上usb到串行或调试头/mcu。@old_timer我有一个发现板,根据数据表中的示意图,它们连接到EMIF02(EMI滤波器)电源引脚和ID引脚。似乎没有可能影响高频信号的元素。这可能是问题的原因,但有趣的是,为什么只有出站通道中断。是我的错,一开始没有检查。我现在应该删除我的问题吗?我不认为你必须删除。如果你不想,你可以将其保留在这种状态,或者你可以回答自己的问题,我知道有一种方法可以做到这一点,或者有一个时间可以做到这一点,这不是冒犯性的(搜索答案)。看看我的代码,我想我只使用了uart2,没有弄乱uart1,我知道其中的一块板我在一个uart中呼应了另一个uart,并在没有连接到stlink的板上放了一个环回。如果你还没有让它真正工作,如果管脚可以自由移动到边缘,那么它应该会明白这一点。由于uart2正常工作,您可以使用它来计算uart1,在其上设置一个环回,而不是连接它的任何东西,发送一些东西并检查接收器是否返回,使用其他数据重复。您连接uart1的是什么,以查看它是否正常工作?