zoukankan      html  css  js  c++  java
  • STM32-串口通信基本流程

    串口功能讲解

    串口框图

    对应的板载引脚,我的是STM32F103VET6

    引脚 APB2总线 APB1总线 APB1总线 APB1总线 APB1总线
    串口 USART1 USART2 USART3 USART4 USART5
    TXD PA9 PA2 PB10 PC10 PC12
    RXD PA10 PA3 PB11 PC11 PD2
    SCLK PA8 PA4 PB12
    NCTS PA11 PA0 PB13
    NRTS PA12 PA1 PB14

    TXD:数据发送

    RXD:数据接收

    SCLK:时钟,仅同步通信时使用

    nRTS:请求发送(Request to send)

    nCTS:允许发送(CLear to send)

    注意:STM32F103VET6 系统控制器有三个 USART 和两个 UART,其中 USART1 和时钟来源 于 APB2 总线时钟,其最大频率为 72MHz,其他四个的时钟来源于 APB1 总线时钟,其最 大频率为 36MHz。UART 只是异步传输功能,所以没有 SCLK、nCTS 和 nRTS 功能引脚。

    数据寄存器——USART_DR:9位有效,包含一个发送数据寄存器IDR和一个接收数据寄存器RDR,一个地址对应了两个物理内存。

    数据寄存器

    数据寄存器——USART_DR:只有底9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。一个地址对应了两个物理内存。

    数据格式

    (启动位)USART_CR1:M,0:8bit 1:9bit

    (停止位)USART_CR2:STOP

    (校验位)USATR_CR1:PCE(使能校验),PS(选择校验),PEIE

    (校验检测)USART_SR:PE(校验错误)

    具体流程

    数据发送

    UE:USART使能(USART enable) 0:时钟与输出被禁止 1:模块使能

    当该位被清零 .

    TE:发送使能(使能后 串口可以发送数据)

    内存→(读取)CPU或DMA→发送数据寄存器(TDR)→发送移位寄存器→TX

    TXE(发送数据寄存器空)→TXC(发送移位寄存器完成)

    数据接收

    UE:USART使能(USART enable) 0:时钟与输出被禁止 1:模块使能

    当该位被清零 .

    RE:接收使能(使能后 串口可以接收数据).

    RX→接收移位寄存器→接收数据寄存器(RXNE)

    波特率

    波特率:每秒钟要发送多少数据

    USART_BRR:波特率寄存器

    分数波特率的产生

    Tx / Rx 波特率 =fck/16*USARTDIV

    fck:外设的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1)

    注意需要区分APB1 APB2 两条总线的时钟

    USARTDIV:无符号的定点数 这12位的值设置在USART_BRR寄存器

    列如:串口1

    USART:USART1 时钟为72M

    波特率:115200

    115200 = 72000000/16*USARTDIV

    USARTDIV = 39.0625

    DIV_Fraction = 0.0625*16 = 1 = 0x01

    DIV_Mantissa = 39 = 0x17

    则:USART_BRR = 0X171

    基本结构体

    上面是编写流程 现在进入实战编写代码

    串口初始化结构体

    typedef struct
    {
     //串口波特率   115200
      uint32_t USART_BaudRate;           
    /*!< This member configures the USART communication baud rate.The baud rate is computed using the following formula:- IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */
     //字长  控制寄存器M位 
      uint16_t USART_WordLength;         
     /*!< Specifies the number of data bits transmitted or received in a frame.
    This parameter can be a value of @ref USART_Word_Length */
    //停止位
      uint16_t USART_StopBits;            
     /*!< Specifies the number of stop bits transmitted.This parameter can be a value of @ref USART_Stop_Bits */
    //校验位
      uint16_t USART_Parity;              
      /*!< Specifies the parity mode.This parameter can be a value of @ref USART_Parity @note When parity is enabled, the computed parity is inserted
    at the MSB position of the transmitted data (9th bit whenthe word length is set to 9 data bits; 8th bit when the word length is set to 8 data bits). */
    //模式(发送与接收)
      uint16_t USART_Mode;                
    /*!< Specifies wether the Receive or Transmit mode is enabled or disabled.
    This parameter can be a value of @ref USART_Mode */
     //硬件控制流  中断
      uint16_t USART_HardwareFlowControl;
     /*!< Specifies wether the hardware flow control mode is enabledor disabled.
     This parameter can be a value of @ref USART_Hardware_Flow_Control */
    } USART_InitTypeDef;
    

    串口时钟配置(同步还是异步通讯)

    typedef struct
    {
     
      uint16_t USART_Clock;   /*!< Specifies whether the USART clock is enabled or disabled.
                                   This parameter can be a value of @ref USART_Clock */
    //极性
      uint16_t USART_CPOL;    /*!< Specifies the steady state value of the serial clock.
    //相位                               This parameter can be a value of @ref USART_Clock_Polarity */
    
      uint16_t USART_CPHA;    /*!< Specifies the clock transition on which the bit capture is made.
                                   This parameter can be a value of @ref USART_Clock_Phase */
    
      uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted
                                   data bit (MSB) has to be output on the SCLK pin in synchronous mode.
                                   This parameter can be a value of @ref USART_Last_Bit */
    } USART_ClockInitTypeDef;
    
  • 相关阅读:
    文件较验及Google Gson的使用
    SQLite数据库操作
    错误收集
    【记录】Linux安装JDK详细步骤
    【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)
    【原创】rman备份出现ORA-19625
    【原创】rman 全库备份脚本
    【原创】TimeSten安装与配置
    【原创】查询占CPU高的oracle进程
    【参考】查找Oracle最高的几个等待事件以及锁的信息
  • 原文地址:https://www.cnblogs.com/Serendipitychen/p/13912030.html
Copyright © 2011-2022 走看看