UART以一个起始位开始通信,起始方法是由TX引脚输出低电平。跟着起始位之后是要发送的8位或者9位数据,如果有奇偶校验则数据后面是奇偶校验的数据信息,最后是停止位,停止位可以设置为1,2,1.5个。
发送配置及单字节通信过程:
寄存器介绍:
控制寄存器 1(UART_CR1):
控制寄存器 2(UART_CR2):
控制寄存器 3(UART_CR3):
波特比率寄存器 1(UART_BRR1):
波特比率寄存器 2 (UART_B):
状态寄存器(UART_SR):
数据寄存器(UART_DR):
使用流程:
1:设置数据长度,奇偶效验,停止位,中断使用等,操作寄存器为CR1,CR2,CR3,下面是我的串口配置代码。
/*urat2初始化*/ void uart2_init() { UART2_CR1=0X14;//8数据,1奇偶效验,1停止,开启接收中断 UART2_CR2=0X2c; UART2_CR3=0X00; UART2_BRR2=0X03;//波特率配置--9600 UART2_BRR1=0X68; }
2:发送数据:代码如下,很简单,就往寄存器里面写入数据即可。
UART2_CR2&=0Xf7; UART2_DR=uart_put;//串口发送 UART2_CR2|=0X08; while((UART2_SR&0X80)==0);//等待发送完成
3:接受输出:我使用了接收中断,所以在中断处理函数里面接收数据
#pragma vector=UART2_R_RXNE_vector __interrupt void UART2_IRQHandler (void) { while((UART2_SR&0X20)==0);//等待接收完成 uart_get=UART2_DR;//读取接受值,同时会清零标志位 }
注意:
1:在STM8S中M位所定义是帧长度,而不是数据位的长度!也就是说M位所定位的长度为“数据位+奇偶校验位”个数的总和。当数据位为8位时,不使用奇偶校验的时候,M的长度为8位;而要使用奇偶校验的时候,M的长度应该为9位!所以编写程序的时候不能简单的只改变校验位的设置;
2:看STM8S的参考手册,我们发现在状态寄存器UART_SR中的Bit0为PE,此标志位指示奇偶校验错误:PE=0,没有校验错误;PE=1,校验错误。PE标志位是在什么情况下被清除的,我们在参考手册可以看到:要清除PE标志位,软件要按以下操作顺序进行执行:先读取UART_SR,再读取UART_DR。程序需要对PE进行检测,然后再判断是否要接收,因为不管发送方是什么校验方式或者无校验,单片机串口都是会接收到数据。
比如我在发送过程中遇到这样的问题:
发送方:9600,N,8,1 (发出的数据位数为8)发送一个字节 0xC5 1100 0101
收方:9600,O,8,1
接收方PE位为0,可以接到0xC5;此时发送方的停止位被接收方当作校验位,由于是奇校验,而此时的校验位为1,所以只有含有偶数个1的那些数据才能被正确收到。
3:在使用串口调试工具时,要注意有些串口工具的奇偶校验位不起作用,测试sscom42的校验位可以使用!