zoukankan      html  css  js  c++  java
  • STM32F103(三) USART实践

    转自:http://blog.csdn.net/robin7513/archive/2010/04/06/5455643.aspx

    GPIO的后面很容易想到的应该就是通用同步/异步接受发送器(USART) 了。对于比较复杂点的程序而言,用led来调试显然是有点不太科学。所以,把USART口调试好后,有助于之后其它部分的调试。(把USART当成是调试输出口来用 )

        调试USART花了我一些时间,其实问题主要出现在一些很小的细节方面。比如发现发送的数据中夹杂这乱码,后来通过数据的二进制分析发现是奇偶校验位不小心打开了。如果排除这些小问题的话,整个工作应该是很容易的。

    先上例程,然后标注,最后分析

    USART的初始化

    void UartInit(void)
    {

      USART_InitTypeDef USART_InitStructure;//声明一个USART初始化结构体(固件库中貌似很喜欢用这种风格来初始化设备)

      USART_InitStructure.USART_BaudRate = 115200;//初始化波特率
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置数据长度为8bit
      USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位为1
      USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//数据流控制为none
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收和发送模式都打开
      USART_InitStructure.USART_Clock = USART_Clock_Disable;//禁用USART时钟
      USART_InitStructure.USART_CPOL = USART_CPOL_Low;//数据低电平有效
      USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;//时钟相位
      USART_InitStructure.USART_LastBit = USART_LastBit_Disable;//禁用最后一位

      /* Configure USART1 */
      USART_Init(USART1, &USART_InitStructure);//初始化1口
      /* Configure USART2 */
      USART_Init(USART2, &USART_InitStructure);//初始化2口

      /* Enable the USART1 */
      USART_Cmd(USART1, ENABLE);//打开1口
       /* Enable the USART2 */
      USART_Cmd(USART2, ENABLE);//打开2口
    }

      整个过程是很顺理成章的,但是需要注意几点:

      1、在有的固件库版本中,USART与时钟相关的设置是独立的使用,有一个独立的结构体,例如:

        USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;    
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;      

        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;      

        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
        USART_ClockInit(USART1, USART_ClockInitStructure);

      2、在初始化USART前应该先把GPIO设置好,USART是GPIO的复用功能。例如USART1的引脚初始化

        /* PA9 USART1_Tx */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出(TX)
        GPIO_Init(GPIOA, GPIO_InitStructure);
        /* PA10 USART1_Rx  */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入(RX)
        GPIO_Init(GPIOA, GPIO_InitStructure);

       成功出始化后就可以手法数据了。提供一下收发数据的例程

    int SendChar (int ch)//发送单个数据

    {                

    USART_SendData(USART1, (unsigned char) ch);
      while (!(USART1->SR & USART_FLAG_TXE));
      return (ch);
    }

    void Print_String(u8 *p)//发送一串数据
    {
       while(*p)
       {
          USART_SendData(USART1, *p++);
          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
          {}
        }
    }

       有的人可能习惯了使用printf函数进行打印,所以我们也可以通过重构print来达到重构printf来达到目的。(具体方法以后再说)

       至于接收,一般都通过中断来实现。因为后面还要详细的介绍中断。这边就先给个例程吧,关于中断的介绍后面再说。

    void USART2_IRQHandler(void)
    {
      if(RxCounter > 99)
      {
        RxCounter = 100;
      }
      while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)//等待接收完成
      {
      }
       RxBuffer[RxCounter++] = (USART_ReceiveData(USART2) & 0x7F);

      USART_ClearFlag(USART2, USART_FLAG_RXNE);//清空接收标志位

    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/robin7513/archive/2010/04/06/5455643.aspx

  • 相关阅读:
    Different AG groups have the exactly same group_id value if the group names are same and the ‘CLUSTER_TYPE = EXTERNAL/NONE’
    An example of polybase for Oracle
    use azure data studio to create external table for oracle
    Missing MSI and MSP files
    You may fail to backup log or restore log after TDE certification/key rotation.
    Password is required when adding a database to AG group if the database has a master key
    Use KTPASS instead of adden to configure mssql.keytab
    ardunio+舵机
    android webview 全屏100%显示图片
    glide 长方形图片显示圆角问题
  • 原文地址:https://www.cnblogs.com/hnrainll/p/1934112.html
Copyright © 2011-2022 走看看