stm32 UART在启动时发送空字节

时间:2014-10-07 18:59:25

标签: c uart stm32f4discovery

我正试图通过uart在2个stm32f407板之间交换数据。我使用的外设是USART2(主板上有更多的外设)。我配置了它的波特率为9600,8位帧,没有奇偶校验位,只有1个停止位。发生的奇怪的事情是,在我实际发送的数据之前,接收器获取了大量空字节(更准确地说,有时候有9个连续的空字节,而在其他情况下,有8个空字节以0xFF字节结束) 。这似乎只有在我打开发送器或按下其重置按钮时才会发生,如果我连续多次发送相同的数据,一切都很好。 这是我用来设置uart的代码:

int uart_init ()
{
    unsigned int ra;

    ra=GET32(RCC_AHB1ENR);
    ra|=1<<0; //enable port A
    PUT32(RCC_AHB1ENR,ra);

    ra=GET32(RCC_APB1ENR);
    ra|=1<<17; //enable USART2
    PUT32(RCC_APB1ENR,ra);

    //PA2 USART2_TX
    //PA3 USART2_RX

    ra=GET32(GPIOA_MODER);
    ra|= (2<<4);
    ra|= (2<<6);
    PUT32(GPIOA_MODER,ra);
    ra=GET32(GPIOA_OTYPER);
    ra&=(1<<2);
    ra&=(1<<3);
    PUT32(GPIOA_OTYPER,ra);
    ra=GET32(GPIOA_AFRL);
    ra|=(7<<8);
    ra|=(7<<12);
    PUT32(GPIOA_AFRL,ra);

    // divisor 136 fractional divisor 11
    PUT32(USART2_BRR,(136<<4)|(11<<0));
    PUT32(USART2_CR1,(1<<13)|(1<<3)|(1<<2));
    return(0);
}

虽然这是我通过uart发送字节的例程:

void uart_putc ( unsigned int x )
{
    while (( GET32(USART2_SR) & (1<<7)) == 0) continue;
    PUT32(USART2_DR,x);
}

我的问题是:这是一种正常而合理的行为吗?万一它是什么,接收传入字节流丢弃那些不受欢迎的字节的好策略是什么?如果不是,我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是因为在复位和为AFIO配置的引脚之间的间隔期间,它们处于高阻态,因此尝试读取将返回未定义的数据。您的接收器在您的发射器之前就已准备就绪。

为了防范这种情况,您需要通过带外方法指示准备情况,或者如果您的重置是电连接的,那么一种愚蠢的方法,例如在接收器上睡眠一秒钟,在启动时和发射器后在发射器上停留2秒钟已配置为AFIO应该这样做。