0

我正在尝试通过 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);
}

我的问题是:这是正常合理的行为吗?如果是这样,接收传入字节流并丢弃不需要的字节流的好策略是什么?如果不是,我做错了什么?

4

1 回答 1

2

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

为了防止这种情况发生,您需要通过带外方法指示准备就绪,或者如果您的复位是电气连接的,则使用愚蠢的方法,例如在启动时和引脚配置后在接收器上休眠一秒钟,在发射器上休眠 2 秒钟AFIO 应该这样做。

于 2014-10-09T10:15:07.037 回答