关于stm32的串口

1.起始位检测机制,对于下降沿的采样规定了采样所得的信号序列。如果符合序列代表受到了起始位,然后就会把RXNE置位。

2.当RXNE被置位的时候,表明数据已经转移到了RDR,就是说已经可以被读出了。然后另外一个值得注意的是,只要及时的读数据,那么RXNE就会被复位。

3.分为多缓冲器通信和单缓冲器通信。单缓冲是由软件对相应的标志位清除,但是要保证必须在下一字符接收结束之前被清零,不然会溢出。


我们结合代码来考虑下这个问题。首先相关的usart配置就没什么好讲的了。都是固件库的内容。关键是中断函数的编写。

先上示例代码:

void DEBUG_USART_IRQHandler(void)
{
  
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
	{		
		ucTemp[i] = USART_ReceiveData(DEBUG_USARTx);
    USART_SendData(DEBUG_USARTx,ucTemp[0]); 
		i++;
		}
}

首先,我们在配置的时候就将进入中断的条件配置为RXNE置位的时候进入中断。我们参考参考手册,发现RXNE的置位代表数据已经可以读了。所以我们先在中断函数里读取数据,读完数据之后RXNE将会被自动清零。但是多字节到底是怎样传输的呢?


我编写了上述的实验代码,发现因为串口协议本身的特点,数据依然是一个字节一个字节的传输的。我利用串口助手向我的单片机传输相应的数据,因为每次返回的都是第一个被写入的数据,所以在后面我由上位机给向单片机写入不同位数的数据的时候发现返回来的是不同位数的初始值。也就是说每发送一个字节,就会进入一个中断。我之前一直想不明白的一点是多字节连续发送的话,RXNE还没清零下一个就来了怎么办,后来想通了,单片机速度远高于串口通信速率,所以在串口接收字节的时候在下一个字节来临之前RXNE就被清零了。但是这样也要注意尽量把中断写精简一点。

猜你喜欢

转载自blog.csdn.net/STM_32starter/article/details/76382906