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

     

     

  • 相关阅读:
    洛谷 P1260 工程规划(差分约束)
    洛谷 P3660 [USACO17FEB]Why Did the Cow Cross the Road III G(树状数组)
    [模板]单调队列
    [模板]LIS(最长上升子序列)
    洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)
    如何求数字n的因数个数及因数和
    [模板]tarjan缩点+拓扑排序
    itext生成pdf(附带页眉,页脚,页码)
    工作总结03
    工作总结02(海报上传模块)
  • 原文地址:https://www.cnblogs.com/caiya/p/12010310.html
Copyright © 2020-2023  润新知