Arm PC从STM32F0 usart接收到错误数据

Arm PC从STM32F0 usart接收到错误数据,arm,uart,stm32,usart,Arm,Uart,Stm32,Usart,我试图按照此链接的答案配置我的STM32F0发现板的USART: 我使用USART2向我的PC发送数据,波特率9600和115200都已尝试过 我从“0”->“9”向PC发送字符,但我总是收到“cg3fe2d”和一些不可见字符,似乎有一些规定,有人能帮忙吗 我的STM32F0配置为使用内部osc,48MHz 我的参考代码如下: void test_uart() { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef G

我试图按照此链接的答案配置我的STM32F0发现板的USART:

我使用USART2向我的PC发送数据,波特率9600和115200都已尝试过

我从“0”->“9”向PC发送字符,但我总是收到“cg3fe2d”和一些不可见字符,似乎有一些规定,有人能帮忙吗

我的STM32F0配置为使用内部osc,48MHz

我的参考代码如下:

void test_uart()
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    uint16_t usart_data;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);

    //Configure USART2 pins:  Rx and Tx ----------------------------
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //Configure USART2 setting:       ----------------------------
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl =
    USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART2, &USART_InitStructure);

    USART_Cmd(USART2,ENABLE);

    usart_data = '0';
    while(1)
    {
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        if (usart_data > '9')
            usart_data  = '0';
        USART_SendData(USART2, usart_data++);
    }
}

我怀疑这和图书馆对时钟的看法和你们不同有关。特别是当您以不同的波特率获得相同的输出时


您需要告诉图书馆您当前的时钟是多少吗?

问题已经解决,非常感谢您的帮助,我想与您分享结果。原因是我使用的是USBtoRS232,我使用3根电线将其直接连接到发现板,我不知道RS232使用的是12V,这是根本原因。所以在我使用RS232适配器之后,问题就解决了。再次感谢大家

以前有人看到过吗?查看接收字符与传输字符的位字符串,如果波特率真的正确,我怀疑您的逻辑电平可能反转了太多或太少次。是的,可能。我现在怀疑OSC,可能是一个外部独立的OSC。也计划尝试自动波特率亲爱的,问题已经解决,我真的很感谢你的帮助,我想与你分享结果。原因是我使用的是USBto232,我使用3根电线将其直接连接到发现板,我不知道RS232使用的是12V,这是根本原因。所以在我使用RS232适配器之后,问题就解决了。再次感谢大家,我认为波特率与时钟的关系是正确的,因为:1。它工作,数据是用这个波特率接收的,如果我换成其他波特率,就不会收到数据。在usart驱动器侧,有apbclock=RCC\u ClocksStatus.PCLK\u频率;看起来时钟是根据当前PCLK自动配置的,您应该告诉1。在原来的岗位上。您确定收到了正确的数据吗?怎样你能做一个简单的回音发送接收到的信息,看看那里发生了什么吗?不要因为你得到了数据就认为它能工作!由于您复制了上述代码,请检查数据表,确保您的系统时钟和驱动UART的时钟有效。再次检查。在某些情况下,并非所有设置都有效,某些设置可能会产生较高的误码率。如果您有UART端口,也可以通过直接连接到主机的UART端口来执行测试。这将从设置中删除其他因素,例如USB-UART变差。多门:对不起,我在最初的帖子中没有提到“1”。你说得对,makeecho是一个了解问题的好方法。我尝试将时钟从48MHz更改为24MHz,然后USART无法接收数据。我计划检查过采样模式寄存器,如果仍然不起作用,我将进行回波,稍后会让您知道结果。对Sessyargc.jp:我同意你的看法,我没有计算buadrate,所以我会检查波特率和错误寄存器的状态。谢谢你们!您好,我仍在工作中,我尝试了不同的波特率值来使用ART_BRR寄存器,该寄存器用于配置波特率除法器。我发现9600的计算值是5000 BRR值。我尝试了5000左右的几个值,从4996-5300,所有值都可以发送数据,PC将接收数据,即使它是错误的,无论如何,它将影响PC接收到的数据结果。我猜这可能是由于内部OCS看起来不准确造成的