我正试图通过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);
}
我的问题是:这是一种正常而合理的行为吗?万一它是什么,接收传入字节流丢弃那些不受欢迎的字节的好策略是什么?如果不是,我做错了什么?
答案 0 :(得分:1)
这是因为在复位和为AFIO配置的引脚之间的间隔期间,它们处于高阻态,因此尝试读取将返回未定义的数据。您的接收器在您的发射器之前就已准备就绪。
为了防范这种情况,您需要通过带外方法指示准备情况,或者如果您的重置是电连接的,那么一种愚蠢的方法,例如在接收器上睡眠一秒钟,在启动时和发射器后在发射器上停留2秒钟已配置为AFIO应该这样做。