zoukankan      html  css  js  c++  java
  • STM8--UART2

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

     

     

  • 相关阅读:
    poj1328
    xml入门简介--两天学会xml
    php的一些特殊用法
    数据结构(一)
    队列的 基本操作
    栈的 基本操作
    线性表----单链表
    线性表----顺序表
    数据结构
    链式队列
  • 原文地址:https://www.cnblogs.com/caiya/p/12010310.html
Copyright © 2011-2022 走看看