0

我一直在做一个需要使用 UART 的项目。我参考了许多不同的来源,并且确信 USART 设置正确。我一直在调试器上运行代码,我注意到我的 xmitbuffer 正在正确填充。我试图在循环中打印你好,当我浏览代码时,缓冲区被 HelloHelloHello 填充。这符合预期。但是,终端上没有任何显示。我试过腻子和 TeraTerm。

我查看了 USART1 的状态寄存器,TX 位设置为 1。我假设 1 表示发送完成。我已经用 9600 和 115200 的波特率进行了尝试,但都没有成功。我不确定如何继续。

注意我用来将 USART 发送到 PC 的电缆也很重要。我正在使用来自 FTDI(http://www.ftdichip.com/Products/Cables/USBRS232.htm)的 USB-RS232-WE-1800-BT_0.0 我认为这可能是我的错误。该电缆是否适用于该应用程序?我需要一根 TTL 电缆吗?

所有设置以及我的主要功能都在下面。

USART 设置:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No ;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStruct);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);

GPIO 设置:大部分用于其他设备。端口 A 的引脚 9 和 10 是我们使用的 USART TX 和 RX 引脚。

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); 

GPIO_A.GPIO_Pin  = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_15;
GPIO_A.GPIO_Mode = GPIO_Mode_IN;
GPIO_A.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_A.GPIO_OType = GPIO_OType_PP;
GPIO_A.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_B.GPIO_Pin  = GPIO_Pin_All;
GPIO_B.GPIO_Mode = GPIO_Mode_IN;
GPIO_B.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_B.GPIO_OType = GPIO_OType_PP;
GPIO_B.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_C.GPIO_Pin  = GPIO_Pin_All;
GPIO_C.GPIO_Mode = GPIO_Mode_IN;
GPIO_C.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_C.GPIO_OType = GPIO_OType_PP;
GPIO_C.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOA, &GPIO_A);
GPIO_Init(GPIOB, &GPIO_B);
GPIO_Init(GPIOC, &GPIO_C);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

主要的:

void main(void)
{
    initMicro();


    while(1)
    {

        printf("Hello");
    }

}
4

1 回答 1

0

如果您将电缆直接连接到 MCU,那么这就是您的问题。电缆数据表的表 5.3表明它使用标准 RS-232 电压电平,数据表第 6 节中的示意图显示了使用 RS-232 电平转换器。STM32F0DISCOVERY板子给MCU的供电电压是3V,所以I/O电平是单电源3V,不兼容RS-232标准。

最不让人头疼的解决方案是购买一根新电缆,然后四处寻找带有 3V 或 3.3VI/O 的电缆——额外的 0.3 V 应该不成问题。这是 SparkFun 的一个,但你应该很容易在 eBay 或 AliExpress 上找到替代品(可能更便宜)。

低成本的解决方案是从当前电缆上拆下电压电平转换器,并将引脚直接连接到其上的 FTDI 芯片 (FT232RQ)。问题是 FTDI 芯片上的 5V 电压电平,因此您需要确保连接到它的 STM32 中的 I/O 能够耐受 5V,否则 STM32 会散发出神奇的烟雾。为确保 3.3VI/O 电压电平,您可以通过将 FT232RQ 的引脚 1 从 VCC 断开(这将涉及在 PCB 上切割一条轨道)来修改您的电缆,然后将其连接到同一芯片的引脚 16,这是一个3.3V 输出。

于 2014-04-27T23:26:16.673 回答