STM32CubeMX+usart+DMA+Modbus从机

前言


单片机型号STM32f103zet6
使用USART1串口来实现DMA收发
使用DMA1通道5,来传输USART1接收的数据
使用DMA1通道4,来传输USART1发送的数据
实现了Modbus 从机协议(0306功能)
1.准备工作

modbus poll和modbus slave模拟软件下载

链接:https://pan.baidu.com/s/1cX8HC-rm3gsMmHIIvSGo6g?pwd=bai8
提取码:bai8

使用方法参考这位博主的

【工具使用】Modbus Poll软件使用详解-优快云博客

一.知识简介

1.USART

1).基础知识点在这里插入图片描述

USART(Universal Synchronous and Asynchronous Serial Receiver and Transmitter,通用同步和异步串行接收和发送器)是一种常用于微控制器和计算机之间的串行通信协议。它支持全双工通信,即同时进行数据的发送和接收。USART通常用于嵌入式系统中,因为它可以提供稳定和可靠的数据传输。

以下是USART的一些基本知识点:

  1. 同步与异步通信
  • 异步通信:数据传输不依赖于时钟信号,每个字符的开始和结束由起始位和停止位标识。
    • 同步通信:数据传输依赖于时钟信号,可以更高效地传输数据。
  1. 数据格式
  • 起始位:标识数据传输的开始。
    • 数据位:传输实际的数据。常见的数据位长度有8位或9位。
    • 奇偶校验位(可选):用于错误检测。
    • 停止位:标识数据传输的结束,可以是一个或两个位。
  1. 波特率
  • 波特率是数据传输的速率,通常以比特每秒(bps)来表示。波特率越高,数据传输速度越快。
    • 两个要通信的设备的波特率一定要设置相同,我们常见的波特率是 4800、 9600、115200 等。
  1. 帧结构
  • USART通信的一帧数据包括起始位、数据位、可选的奇偶校验位和停止位。
  1. 通信模式
  • 点对点:两个设备之间的直接通信。
    • 多点:多个设备通过总线连接,可以进行广播或选择性通信。
  1. 硬件接口
  • USART通常通过TX(发送)和RX(接收)引脚进行数据传输。
2).各USART所使用的引脚接口

STM32f103上有3 个USART,其他系列请查看芯片手册在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.DMA

1).基础知识点

DMA(Direct Memory Access,直接内存访问)是一种允许某些硬件子系统在不占用CPU的情况下,直接访问系统内存的技术。在串口通信中,DMA可以提高数据传输的效率,因为它允许数据在串口和内存之间直接传输,而不需要CPU的介入。

以下是DMA串口通信的一些基本知识点:

  1. DMA控制器
    • DMA控制器是负责管理DMA传输的硬件组件。它控制数据从源地址到目标地址的传输。
  2. 数据传输
    • 在串口通信中,DMA可以自动从串口接收器(USART)接收数据,并将其存储到内存中,或者从内存中读取数据并发送到串口发送器。
  3. 中断
    • 尽管DMA允许数据传输不需要CPU的直接参与,但通常在传输完成后,DMA控制器会通过中断通知CPU。
  4. 缓冲区
    • DMA通常使用一个或多个缓冲区来存储接收或发送的数据。这些缓冲区可以是环形缓冲区,以支持连续的数据流。
  5. 传输速率
    • DMA可以支持高速数据传输,因为它不受CPU速度的限制。
  6. 错误处理
    • DMA控制器通常具备错误检测功能,如传输超时、数据错误等,并可以在检测到错误时通过中断通知CPU。
  7. 配置
    • DMA的配置包括设置源和目标地址、传输大小、传输方向(接收或发送)、传输速率等。
  8. 优先级
    • 在多通道DMA系统中,可以设置不同的传输优先级,以确保关键任务的数据传输优先进行。
2).MDA框图

在这里插入图片描述

在这里插入图片描述

图中,我们标记了3处位置,起作用分别是:

DMA请求 如果外设想要通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA收到 请求信号之后,控制器会给外设一个应答信号,当外设应答后且DMA控制器收到应答信号之 后,就会启动DMA的传输,直到传输完毕。 DMA1有7个通道,DMA2有5个通道, 不同的DMA控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置。

DMA1
在这里插入图片描述

DMA2
***

通道 DMA具有12个独立可编程的通道,其中DMA1有7个通道,DMA2有5个通道,每 个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时 间只能接收一个,不能同时接收多个。

仲裁器 当发生多个DMA通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器 管理。仲裁器管理DMA通道请求分为两个阶段。第一阶段属于软件阶段,可以在DMA_CCRx 寄存器中设置,有4个等级:非常高,高,中和低四个优先级。第二阶段属于硬件阶段,如 果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越 低优先权越高,比如通道0高于通道1。在大容量产品和互联型产品中,DMA1控制器拥有 高于DMA2控制器的优先级。

3.Modbus

1).基础知识点

Modbus协议是一种串行通信协议,广泛应用于工业环境中,用于电子设备之间的通信。Modbus协议的数据帧格式通常包括以下部分:

  1. 设备地址(Device Address):用于标识从设备的唯一地址,范围是0到247,0通常作为广播地址。
  2. 功能码(Function Code):指示从设备要执行的动作,不同的功能码对应不同的操作,例如读取或写入寄存器。
  3. 数据域(Data Field):包含请求和响应参数的数据,具体内容取决于功能码。
  4. 校验(Checksum):对报文内容执行冗余校验的计算结果,用于确保数据传输的正确性。Modbus RTU通常使用CRC16校验,而Modbus ASCII使用LRC校验。

Modbus RTU数据帧的具体格式如下:

  • 起始位:1位
  • 数据位:8位,首先发送最低有效位
  • 奇偶校验位:1位
  • 停止位:1位

Modbus协议支持多种通信方式,包括串行通信(如RS-232、RS-485)和以太网通信(Modbus TCP)。在串行通信中,Modbus RTU和Modbus ASCII是两种常见的模式。

2).数据帧解析
  1. 设备地址(Device Address):通常为1个字节,用于标识网络上的从设备。主设备(Master)通常不使用地址。
  2. 功能码(Function Code):1个字节,定义了要执行的动作,如读取或写入寄存器。
  3. 数据域(Data Field):1个或多个字节,包含执行功能码所需的数据,例如寄存器地址、要写入的值等。
  4. 校验(Checksum):通常为2个字节的CRC(循环冗余校验),用于检测数据在传输过程中是否出现错误。

Modbus数据帧

设备地址 功能码 数据 校验
1byte 1byte Nbyte 2byte

本历程只实现了03和06功能码

功能码

0x03:读取从机寄存器数据

主机发送

从机设备地址 功能码 起始地址 寄存器个数 CRC校验码
01 03 xx xx xx xx xx xx

从机回复

从机设备地址 功能码 数据长度 数据1 数据2 数据N CRC校验码
01 03 xx xx xx xx xx xx xx xx xx xx

注意数据长度=要读取寄存器个数X2

例子:

Tx:主机

Rx:从机回复

在这里插入图片描述

0x06:向一个寄存器写入数据

主机发送

从机设备地址 功能码 起始地址 寄存器个数 CRC校验码
01 06 xx xx xx xx xx xx

从机回复

从机设备地址 功能码 起始地址 寄存器个数 CRC校验码
01 06 xx xx xx xx xx xx

06功能码回复与主机发送相同

例子:

Tx:主机

Rx:从机回复

在这里插入图片描述

3).CRC校验

1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7、最终CRC寄存器的值就是CRC的值。

方便大家代码放这了

/* 参数1:数组指针;参数2;长度 */

uint16_t Modbus_CRC16(uint8_t *buffer, uint16_t buffer_length)
{
   
    uint16_t crc = 0xFFFF;
    for (uint16_t i = 0; i < buffer_length; i++)
    {
   
        crc ^= (uint16_t)buffer[i];
        for (uint8_t j = 0; j < 8; j++)
        {
   
            if (crc & 0x0001)
                crc = (crc >> 1) ^ 0xA001;
            else
                crc = crc >> 1;
        }
    }
    crc = (crc >> 8) | (crc << 8);
    return 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值