更高的波特率不适用于STM32F0Discovery板

时间:2017-05-26 16:42:05

标签: c embedded stm32

使用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以正确的设置接收任何值(因为收到较低的波特率)。

1 个答案:

答案 0 :(得分:0)

收到数据时忘记SPL,HAL或其他库。有这样的速度你应该使用DMA。如果中断例程记住你只有大约160-180个时钟周期。这很容易实现,但您需要使用裸寄存器编程。