前言
单片机型号STM32f103zet6
使用USART1串口来实现DMA收发
使用DMA1通道5,来传输USART1接收的数据
使用DMA1通道4,来传输USART1发送的数据
实现了Modbus 从机协议(03和06功能)
1.准备工作
modbus poll和modbus slave模拟软件下载
链接:https://pan.baidu.com/s/1cX8HC-rm3gsMmHIIvSGo6g?pwd=bai8
提取码:bai8
使用方法参考这位博主的
一.知识简介
1.USART
1).基础知识点
USART(Universal Synchronous and Asynchronous Serial Receiver and Transmitter,通用同步和异步串行接收和发送器)是一种常用于微控制器和计算机之间的串行通信协议。它支持全双工通信,即同时进行数据的发送和接收。USART通常用于嵌入式系统中,因为它可以提供稳定和可靠的数据传输。
以下是USART的一些基本知识点:
- 同步与异步通信:
- 异步通信:数据传输不依赖于时钟信号,每个字符的开始和结束由起始位和停止位标识。
- 同步通信:数据传输依赖于时钟信号,可以更高效地传输数据。
- 数据格式:
- 起始位:标识数据传输的开始。
- 数据位:传输实际的数据。常见的数据位长度有8位或9位。
- 奇偶校验位(可选):用于错误检测。
- 停止位:标识数据传输的结束,可以是一个或两个位。
- 波特率:
- 波特率是数据传输的速率,通常以比特每秒(bps)来表示。波特率越高,数据传输速度越快。
- 两个要通信的设备的波特率一定要设置相同,我们常见的波特率是 4800、 9600、115200 等。
- 帧结构:
- USART通信的一帧数据包括起始位、数据位、可选的奇偶校验位和停止位。
- 通信模式:
- 点对点:两个设备之间的直接通信。
- 多点:多个设备通过总线连接,可以进行广播或选择性通信。
- 硬件接口:
- USART通常通过TX(发送)和RX(接收)引脚进行数据传输。
2).各USART所使用的引脚接口
STM32f103上有3 个USART,其他系列请查看芯片手册在这里插入图片描述
2.DMA
1).基础知识点
DMA(Direct Memory Access,直接内存访问)是一种允许某些硬件子系统在不占用CPU的情况下,直接访问系统内存的技术。在串口通信中,DMA可以提高数据传输的效率,因为它允许数据在串口和内存之间直接传输,而不需要CPU的介入。
以下是DMA串口通信的一些基本知识点:
- DMA控制器:
- DMA控制器是负责管理DMA传输的硬件组件。它控制数据从源地址到目标地址的传输。
- 数据传输:
- 在串口通信中,DMA可以自动从串口接收器(USART)接收数据,并将其存储到内存中,或者从内存中读取数据并发送到串口发送器。
- 中断:
- 尽管DMA允许数据传输不需要CPU的直接参与,但通常在传输完成后,DMA控制器会通过中断通知CPU。
- 缓冲区:
- DMA通常使用一个或多个缓冲区来存储接收或发送的数据。这些缓冲区可以是环形缓冲区,以支持连续的数据流。
- 传输速率:
- DMA可以支持高速数据传输,因为它不受CPU速度的限制。
- 错误处理:
- DMA控制器通常具备错误检测功能,如传输超时、数据错误等,并可以在检测到错误时通过中断通知CPU。
- 配置:
- DMA的配置包括设置源和目标地址、传输大小、传输方向(接收或发送)、传输速率等。
- 优先级:
- 在多通道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协议的数据帧格式通常包括以下部分:
- 设备地址(Device Address):用于标识从设备的唯一地址,范围是0到247,0通常作为广播地址。
- 功能码(Function Code):指示从设备要执行的动作,不同的功能码对应不同的操作,例如读取或写入寄存器。
- 数据域(Data Field):包含请求和响应参数的数据,具体内容取决于功能码。
- 校验(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).数据帧解析
- 设备地址(Device Address):通常为1个字节,用于标识网络上的从设备。主设备(Master)通常不使用地址。
- 功能码(Function Code):1个字节,定义了要执行的动作,如读取或写入寄存器。
- 数据域(Data Field):1个或多个字节,包含执行功能码所需的数据,例如寄存器地址、要写入的值等。
- 校验(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