2017-04-16 64 views
0

从STM32F411发送字符到PC时它会读取垃圾,但是当我做相反的操作时,MCU正确读取字符发送时出现问题。STM32F4 USART1发送垃圾

我执行以下操作:

  1. 启用GPIOA时钟和配置销9和10的复用功能。
  2. 启用USART1,离开默认值M(消息长度),停止位,DMA
  3. 设置USARTDIV导致为16MHz(HSI)9600波特*
  4. 配置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不工作?”

+0

什么都连接到,也许USART1被绑定到芯片上的USB串行或调试页眉/ MCU。 –

+0

@old_timer我有一个发现板,根据数据表中的原理图,它们连接到EMIF02(EMI滤波器)电源引脚和ID引脚。似乎没有可能影响高频信号的元素。 这可能是问题的原因,但仍然很有趣,为什么只有出站渠道中断。这是我的错误,没有检查,首先。我现在应该删除我的问题吗? – hrust

+0

我不认为你必须如果你不想让它处于这种状态,或者你可以回答自己的问题,我知道有一种方法可以做到这一点,或者是一段时间去做那些没有冒犯性的事情(搜索周围的答案到那)。看着我的代码,我想我只使用了uart2,并没有与uart1混淆,我知道这些主板中的一个我回应了其中一个uart出现的问题,并将回路放在未连接stlink的那个上。 –

回答

0

在通往扩展连接器PA9引脚的路上有一个电容滤除USART1 TX。我想,彼得哈里森很好地解释了这个问题。

http://www.micromouseonline.com/2013/05/05/using-usart1-on-the-stm32f4discovery/

+0

虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18251834) –