STM32f0发现USART缓冲区未发送

时间:2014-04-27 18:15:09

标签: serial-port printf uart stm32 usart

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

我查看了USART1的状态寄存器,TX位设置为1.我假设1表示发送完成。我试过它的波特率为9600和115200,但都没有取得任何成功。我不知道如何继续。

还要注意我用来将USART发送到PC的电缆。我正在使用FTDI的USB-RS232-WE-1800-BT_0.0(http://www.ftdichip.com/Products/Cables/USBRS232.htm) 我在想这可能是我的错误。这条电缆适用于此应用吗?我需要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");
    }

}

1 个答案:

答案 0 :(得分:0)

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

最难以解决的问题是购买新的电缆,为了寻找具有3V或3.3V I / O的电缆 - 额外的0.3 V不应该成为问题。来自SparkFun的one,但你应该很容易在eBay或者AliExpress上找到替代品(可能更便宜)。

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