使用USART时,使用STM32标准外围设备库出现一个奇怪的错误。我需要能够在USART2上以4M波特率传输。尽管据说该板支持最高6M的波特率,但只有3M及以下的波特才能正常工作。

我仔细阅读了SPL文档和开发板的参考手册,发现我的时钟默认为48MHz,并且过采样设置为8(通过在调试器中逐步执行代码来确认)。为什么3M及以下版本适用于标准初始化,但4M,5M和6M无效?

static void hal_init(void)
{
    GPIO_InitTypeDef port_init;
    USART_InitTypeDef usart_init;

    //GPIO init: USART2 PA2 as OUT, PA3 as IN
    RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE );

    /* Connect PA2 to USART2 tx, PA3 to rx */
    GPIO_PinAFConfig(GPIOA,  GPIO_PinSource3, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA,  GPIO_PinSource2, GPIO_AF_1);

    port_init.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    port_init.GPIO_Mode = GPIO_Mode_AF;
    port_init.GPIO_Speed = GPIO_Speed_50MHz;
    port_init.GPIO_OType = GPIO_OType_PP;
    port_init.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init( GPIOA, &port_init );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    /* Need oversampling set for higher baud rates */
    USART_OverSampling8Cmd(USART2, ENABLE);

    //USART init: USART2 500K 8n1
    usart_init.USART_BaudRate = USART_BAUD_RATE; // Currently 4M
    usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    usart_init.USART_Parity = USART_Parity_No;
    usart_init.USART_StopBits = USART_StopBits_1;
    usart_init.USART_WordLength = USART_WordLength_8b;
    usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART2, (USART_InitTypeDef*) &usart_init);

    USART_Cmd(USART2, ENABLE);
}


作为参考,开发板也使用FreeRTOS,我正在使用IAR-EWARM进行构建和调试。

编辑:通过告诉开发板连续发送0xA5(随机选择),然后将主机设置为接收10个字节,来测试错误行为。在所有3M或更低的波特率中,按预期接收一系列值0xA5的字节。对于4M,如果将过采样设置为16(OVER8 = 0),则将接收值0x00。如果将过采样设置为8(OVER8 = 1),则通过我的Python脚本或具有正确设置的PuTTy都不会接收到任何值(因为接收到的波特率较低)。

最佳答案

接收数据时,请忘记SPL,HAL或其他库。以这种速度,您应该使用DMA。如果执行中断例程,请记住您只有大约160-180个时钟滴答。这很容易实现,但是您需要使用裸寄存器编程。

关于c - 更高的波特率不适用于STM32F0发现板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44206426/

10-09 22:44