×
嵌入式 > 技术百科 > 详情

STM8--UART2

发布时间:2021-12-06 发布时间:
|

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的校验位可以使用!



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机