当前位置: 首页 > news >正文

STM32【H7】理论——通信

文章目录

  • 1. USART串口通信(STM32H7系列)
    • 1.1 串口的硬件框图
    • 1.2 串口的基本功能特性
    • 1.3 串口的自适应波特率
    • 1.4 串口的数据帧格式
    • 1.5 同步串口和异步串口的区别
    • 1.6 单工,半双工和全双工通讯
    • 1.7 串口的HAL库应用(串口的初始化流程)
      • 1.7.1 串口寄存器结构体USART_TypeDef
      • 1.7.2 串口句柄结构体 UART_HandleTypeDef

这里只对H7芯片的通信内容做讲解,关于通用的通信知识移步文章STM32理论 ——通信

1. USART串口通信(STM32H7系列)

USART(Universal synchronous asynchronous receiver transmitter,通用同步异步收发器),经常使用串口是异步串口,简称 UART.

1.1 串口的硬件框图

在这里插入图片描述

  • IRQ Interface 中断接口:用于实现中断方式的串口唤醒 usart_wkup 和串口的相关中断 usart_it.
  • DMA Interface DMA 接口:实现串口发送 usart_tx_dma 和接收 usart_rx_dma 的 DMA 方式。
  • COM Contronller 串口控制器:串口相关的寄存器基本都在这部分。
  • TxFIFO 和 RxFIFO:串口的发送和接收都支持了硬件 FIFO 功能。
  • TX 和 RX 引脚的互换功能:发送偏移寄存器(TX Shift Reg)和接收偏移寄存器(RX Shift Reg)与 TX 引脚,RX 引脚之间弄了个交叉连接,这里的意思是支持了引脚互换功能,这样在设计 PCB 的时候就可以比较随性了,接反了也没有关系。
  • 发送过程经过的寄存器:依次是 USART_TDR -> TxFIFO ->Tx Shift Reg 偏移寄存器 –> TX 或者 RX 引脚。
  • 接收经过的寄存器:依次是 TX 或者 RX 引脚-> Rx Shift Reg 偏移寄存器->RxFIFO –>USART_RDR。
  • 两个时钟 usart_pclk 和 usart_ker_ck:这两个时钟是独立的,作用如下:
    • usart_pclk:用于为外设总线提供时钟。
    • usart_ker_ck:串口外设的时钟源。

1.2 串口的基本功能特性

只列举了最常用的功能特性;

  • 任意波特率:硬件采用分数波特率发生器系统,可以设置任意的波特率,最高达 4.5Mbits/s.
  • 可编程数据字长度:支持 7bit,8bit 和 9bit.
  • 可配置的停止位:支持 1 或 2 个停止位。
  • 发送器和接收器可以单独使能:比如 GPS 应用只需要串口接收,那么发送的 GPIO 就可以节省出来用作其他功能。
  • 检测标志和中断
    • 接收缓冲器满,可产生中断。串口中断服务程序据此判断是否接收到数据。
    • 发送缓冲器空,可产生中断。串口中断服务程序据此启动发送下一个数据。
    • 传输结束标志,可产生中断。用于 RS485 通信,等最后一个字节发送完毕后,需要控制 RS485收发器芯片切换为接收模式。

1.3 串口的自适应波特率

  • 应用场合
    • 系统的通信速度未知。
    • 系统使用相对低精度的时钟源,并且该机制能够在没有测量时钟偏差的情况下获得正确的波特率。
  • 测量范围
    • 8 倍过采样的情况下,测量速度范围是 usart_ker_ck_pres/65535 到 usart_ker_ck_pres/8。最
      高串口速度是 100MHz / 8 = 12.5Mbps。
    • 16 倍过采样的情况下,速度范围是 usart_ker_ck_pres/65535 到 usart_ker_ck_pres/16。最高
      串口速度是 100MHz / 16 = 6.25Mbsp。

注:usart_ker_ck_pres 在不做串口分频的情况下,是 100MHz。

  • 测量方法
    根据不同的字符特征,支持四种自适应方法。自适应波特率在同步数据接收期间会测量多次,而且每次测量都会跟前一次做比较。
    当前支持四种字符样式进行识别,识别成功后会将中断状态寄存的 ABRF 位置 1,其中模式 2 发送几次 0x7F 基本都可以适应成功,相对好用,模式 3 跟模式 2 差不多,而模式 0 检测起始位的持续时间和模式 1 检测起始位以及第 1 个 bit 的数据位持续时间,这两种模式不好用。

【STM32H743实验例程】实验15:STM32H743串口自适应波特率

1.4 串口的数据帧格式

在这里插入图片描述
串口支持的帧格式如图(M 和 PCE 都是 USART_CR1 寄存器的位,其中 M 位用于控制帧长度,PCE用于使能奇偶校验位):特别注意奇偶校验位,用户在配置的时候可以选择奇校验和偶校验,校验位是占据的最高位。比如选择 M=00,PCE=1,即 7bit 的数据位。

  • 关于奇偶校验

    • 串口发送数据:如果发送的 7bit 数据是 111 0011,这个里面有奇数个 1,那么选择偶校验的情况下,校验位 = 1,凑够偶数个 1,而选择奇校验的情况下,校验位 = 0,因为已经是奇数个 1。校验位不需要用户去计算,是硬件自动生成的。
    • 串口接收数据:根据用户设置的奇校验或者偶校验类型,串口硬件会对接收到的数据做校验,如果失败,USART_ISR寄存器的 PE 位会被置 1。如果使能了对应的中断 PEIE,那么失败的时候还会产生中断。
  • 实际数据发送时,一帧数据中数据位的先后顺序:
    图一,不带奇偶校验位的数据帧格式:
    在这里插入图片描述
    图二,带奇偶校验位的数据帧格式:在这里插入图片描述

  • 起始位:在通信双方没有通信时(通信空闲状态),数据流起始位为1(或0),当双方开始通信时,起始位发生改变,表示通信开始

  • 数据位:8或 9位,有效数据位为 8位,第 9位可配置为奇偶校验位;

  • 奇偶校验位:用于校验数据传输是否出错,提高数据传输的准确率;

  • 停止位:与起始位同理,表示通信结束;

  • 波特率:通信双方约定好的码元符号传输速率;

1.5 同步串口和异步串口的区别

  • 异步通信(UART) 是按约定的波特率逐个字符传输的。每传输一个字符就用起始位来进行收、发双方的同步,不会因收发双方的时钟频率的偏差导致数据传输错误。这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。

异步通信的特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔是随机的。接收机完全靠每一帧的起始位和停止位来识别字符是正在进行传输还是传输结束。

  • 同步通信(USRT) 的发送和接收双方要保持完全的同步,因此要求接收和发送设备必须使用同一时钟。优点是可以实现高速度、大容量的数据传送;缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。典型的应用有SPI、IIC 通信接口。

同步通信在硬件上一般最少需要两根线,即时钟线和数据线,如IIC总线有SDL(串行时钟线)、SDA(串行数据线),有的时候还需要一个GND(公共参考地)。

可以说,不管是异步通信还是同步通信都需要进行同步,只是异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。所以,可以说前者是自同步,后者是外同步。

在这里插入图片描述
在这里插入图片描述

RS232:因为PC 与IC的电平不兼容,中间需加电平转换器;

1.6 单工,半双工和全双工通讯

  • 单工:在一个单工的串行通讯系统中,一般至少有两根线(信号线和地线),数据传送只有一个方向,例如可以使用单工数据传送将数据从一个简单的数据监测系统传送到 PC 上。
  • 半双工:在半双工串行通信系统中,一般同样要求至少有两根线。这里的数据传送是双向的。然而,同一个时刻只能为一个方向。如可以使用半双工通讯机制发送信息到嵌入式模块(来设置参数,比如采样率)。此外,在其他时候,可以使用这个种连接将嵌入式装置上的数据下载到 PC 中。
  • 全双工:在一个全双工的串行通信系统中,一般要求至少有三根线(信号线 A,信号线 B 和地线)。信号线 A 将传输一个方向上的数据,同时信号线 B 传送另一个方向上的数据。
    在这里插入图片描述

1.7 串口的HAL库应用(串口的初始化流程)

一些比较高级的型号芯片会有HAL库,如STM32H7系列;

  • 第 1 步:定义 UART_HandleTypeDef 类型串口结构体变量,比如 UART_HandleTypeDef huart。
  • 第 2 步:使用函数 HAL_UART_MspInit 初始化串口底层,不限制一定要用此函数里面初始化,用户也可以自己实现。
    • 使能串口时钟。
    • 引脚配置。
      • a、使能串口所使用的 GPIO 时钟。
      • b、配置 GPIO 的复用模式。
    • 如果使用中断方式函数 HAL_UART_Transmit_IT 和 HAL_UART_Receive_IT 需要做如下配置。
      • a、配置串口中断优先级。
      • b、使能串口中断。
    • 串口中断的开关是通过函数__HAL_UART_ENABLE_IT() 和 __HAL_UART_DISABLE_IT()来实现,这两个函数被嵌套到串口的发送和接收函数中调用。
    • 如果使用 DMA 方式函数 HAL_UART_Transmit_DMA 和 HAL_UART_Receive_DMA 需要做如下配置。
      • a、声明串口的发送和接收 DMA 结构体变量,注意发送和接收是独立的,如果都使用,那就都需要配置。
      • b、使能 DMA 接口时钟。
      • c、配置串口的发送和接收 DMA 结构体变量。
      • d、配置 DMA 发送和接收通道。
      • e、关联 DMA 和串口的句柄。
      • f、配置发送 DMA 和接收 DMA 的传输完成中断和中断优先级。
  • 第 3 步:配置串口的波特率,位长,停止位,奇偶校验位,流控制和发送接收模式。
  • 第 4 步:如果需要,可以编程高级特性,比如 TX/RX 交换引脚,自动波特率检测。通过第 1 步串口结构体变量 huart 的结构体成员 AdvancedInit 来设置。
  • 第 5 步:串口初始化调用的函数 HAL_UART_Init 初始化。

1.7.1 串口寄存器结构体USART_TypeDef

USART 相关的寄存器是通过 HAL 库中的结构体 USART_TypeDef 定义的,在 stm32h743xx.h 中可以找到这个类型定义:

typedef struct
{__IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x00 */__IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x04 */__IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x08 */__IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x0C */__IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x10 */uint16_t RESERVED2; /*!< Reserved, 0x12 */__IO uint32_t RTOR; /*!< USART Receiver Time Out register, Address offset: 0x14 */__IO uint16_t RQR; /*!< USART Request register, Address offset: 0x18 */uint16_t RESERVED3; /*!< Reserved, 0x1A */__IO uint32_t ISR; /*!< USART Interrupt and status register, Address offset: 0x1C */__IO uint32_t ICR; /*!< USART Interrupt flag Clear register, Address offset: 0x20 */__IO uint16_t RDR; /*!< USART Receive Data register, Address offset: 0x24 */uint16_t RESERVED4; /*!< Reserved, 0x26 */__IO uint16_t TDR; /*!< USART Transmit Data register, Address offset: 0x28 */uint16_t RESERVED5; /*!< Reserved, 0x2A */__IO uint32_t PRESC; /*!< USART clock Prescaler register, Address offset: 0x2C */
} USART_TypeDef;

其中__IO 表示 volatile, 这是标准 C 语言中的一个修饰字,表示这个变量是非易失性的,编译器不要将其优化
掉。core_m7.h 文件定义了这个宏:

#define __O volatile /*!< Defines 'write only' permissions */
#define __IO volatile /*!< Defines 'read / write' permissions */
  • USART1、USART2 … UART8 的定义,在 stm32h743xx.h 文件中:
#define PERIPH_BASE ((uint32_t)0x40000000)
#define D2_APB1PERIPH_BASE PERIPH_BASE
#define D2_APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define USART1_BASE (D2_APB2PERIPH_BASE + 0x1000)
#define USART2_BASE (D2_APB1PERIPH_BASE + 0x4400)
#define USART3_BASE (D2_APB1PERIPH_BASE + 0x4800)
#define UART4_BASE (D2_APB1PERIPH_BASE + 0x4C00)
#define UART5_BASE (D2_APB1PERIPH_BASE + 0x5000)
#define USART6_BASE (D2_APB2PERIPH_BASE + 0x1400)
#define UART7_BASE (D2_APB1PERIPH_BASE + 0x7800)
#define UART8_BASE (D2_APB1PERIPH_BASE + 0x7C00)
#define USART1 ((USART_TypeDef *) USART1_BASE) <----- 展开这个宏,(USART_TypeDef *) 0x40011000
#define USART2 ((USART_TypeDef *) USART2_BASE)
#define USART3 ((USART_TypeDef *) USART3_BASE)
#define UART4 ((USART_TypeDef *) UART4_BASE)
#define UART5 ((USART_TypeDef *) UART5_BASE)
#define USART6 ((USART_TypeDef *) USART6_BASE)
#define UART7 ((USART_TypeDef *) UART7_BASE)
#define UART8 ((USART_TypeDef *) UART8_BASE)

这样访问 USART1 的 CR1 寄存器可以采用这种形式:USART1->CR1 = 0.

1.7.2 串口句柄结构体 UART_HandleTypeDef

HAL 库在 USART_TypeDef 的基础上封装了一个结构体 UART_HandleTypeDef,定义如下:

typedef struct
{USART_TypeDef *Instance; /*!< UART registers base address */UART_InitTypeDef Init; /*!< UART communication parameters */UART_AdvFeatureInitTypeDef AdvancedInit; /*!< UART Advanced Features initialization parameters */uint8_t *
http://www.dtcms.com/a/466524.html

相关文章:

  • C++模板初阶 -- 讲解超详细
  • 网站免费优化工具广州做网站公司排名
  • 以太网PHY收发器深度解析:从基础原理到选型实践
  • 哪个网站微博做的最好济南网络推广网络营销
  • 做那种类型的网站seo好湘潭网站建设 排名磐石网络
  • 四川平台网站建设方案哪个网站可以做全网推广
  • 网站安全防黑联盟广州网站开发公司哪家好
  • 实验室烧杯的种类与选择,不同材质的实验室烧杯有何优缺点?
  • 公司怎么建立网站吗新闻页面设计
  • Linux学习笔记--获取输入设备信息
  • 【Python+GEE】遥感数据计算、分析和可视化及森林监测、洪涝灾害、干旱评估、植被变化等案例
  • 基础搭建图形化编程:课程目录介绍 总纲
  • 【时时三省】(C语言基础)顺序读写数据文件
  • wordpress搬站深圳企业网站制作哪个
  • 专门做酒店的招聘网站做实验的网站
  • 行业门户网站设计开网站需要什么流程
  • 抗辐照MCU芯片在低轨商业卫星原子钟中的适配与优化
  • 成都市分类信息网站开发淘宝网页制作
  • 攻防世界-Web-easytornado
  • 溧阳市城乡建设局网站鄢陵网站建设电脑建站
  • Linux-db2look创建表结构详细参数
  • 网站新闻源码网站开发技术难度
  • 湘潭网站建设多少钱jsp 响应式网站模板
  • PCB设计流程
  • 如何做展示型网站优秀的网站通过什么提供信息
  • 租车公司网站 模板腾讯网站建设专家
  • wordpress 是CMS自己做的网站竞价优化
  • UE5 测量 -2,长度测量:P5绘制定位点之间的连线,P6增加 UI控件,显示距离数据;P7第一个点不显示距离
  • AI操作系统 | LLMs RAG DRAG
  • Python全栈(基础篇)——每日一练详解(day02~day05)