【STM32】STM32F407实现简单的Modbus协议

本文详细介绍了在STM32上实现MODBUS_RTU协议的过程,包括功能码0x01的读线圈状态请求与响应的代码实现,以及CRC校验算法的运用。通过实际案例,展示了MODBUS协议在工业自动化网络中的应用。

前言

    这篇文章是我从零认识MODBUS过程中的一点笔记,主要讲解了我学习和使用MODBUS的思路。代码可能帮不到你,但是如果你是和我一样的初学者,建议你认真阅读。毕竟学习是一个思考练习的过程,如果只会Ctrl+C,那么就没什么意义了。作者水平有限,有错误敬请指出,互相学习,共同进步。

1.ModBus协议简介

       MODBUS协议是一种串行通信协议,由Modicon公司(施耐德公司前身)发表,由于其公开发表且无版权要求,易于部署和维护,在工业界广泛应用。MODBUS采用主从通信(Master/Slave),MODBUS有三种报文格式:ASCII、RTU、TCP,本文主要讨论RTU。

       如下图所示,串行通信上的MODBUS协议主要由地址,功能码,数据,CRC校验四部分数据帧构成。主机和从机的串行通信设备要求一致,参数要求一致,即假设使用串口,主从机波特率,奇偶校验等参数需一致。

 

 主机端状态图(标准流程)

从机端状态图(标准流程)

RTU报文数据格式:

从机地址:1 byte      功能码:1byte   数据:0-252byte(s)     CRC校验:2 byte  低位在前,高位在后                                                                                                                                                                    

2.MODBUS_RTU在STM32上的实现

    撸代码之前,我们先来看看MODBUS的数据模型,见下图。因为MODBUS通常用在PLC上,所以他的数据模型与PLC息息相关。这里我们不用管。直接看我给出的表格,便于理解,离散量输入即只读的位类型变量,与开关量一样。比如从机接了一个行程开关(按钮),我要读取开关的状态(只有0和1),而我们是无法直接操作开关的。再看"线圈",我的从机接了一个LED灯,我可以直接操作IO口控制灯的亮灭,也可以查询IO口电平知道灯的亮灭,所以他是可以读写的数据。"输入寄存器"理解为从机设备上有个温度传感器,传感器的数值是外界的温度,我们只能读取这个温度,所以是只读变量。"保持寄存器"理解为类似于从机ID一类信息,既可以被读取,也可以被改写。

STM32F407ZGT6GK原理图 STM32F407ZGT6 :ARM Cortex-M4 32位 MCU+FPU,210DMIPS,高达1 MB Flash/192 + 4KB RAM,USB OTG HS/FS,以太网,17 个TIM,3个ADC,15 个通信接口、摄像头。 特性: 1、内核:带有 FPU 的 ARM® 32 位 Cortex®-M4CPU、在 Flash 存储器中实现零等待状态运行性能的自适应实时加速器 (ART 加速器 ™)、主频高达 168MHz, MPU,能够实现高达210 DMIPS/1.25DMIPS/MHz (Dhrystone 2.1)的性能,具有 DSP 指令集。 2、存储器 – 高达1 MB Flash – 高达 192+4 KB的SRAM, 包括64-KB的CCM(内核耦合存储器)数据 RAM – 具有高达 32 位数据总线的灵活外部存储控制器: SRAM、 PSRAM、 NOR/NAND存储器 3、 LCD 并行接口,兼容 8080/6800 模式 4、 时钟、复位和电源管理 – 1.8 V 到 3.6 V 供电和 I/O – POR、 PDR、 PVD 和 BOR – 4 至 26 MHz 晶振 – 内置经工厂调校的 16 MHz RC 振荡器( 1% 精度) – 带校准功能的 32 kHz RTC 振荡器 – 内置带校准功能的 32 kHz RC 振荡器 5、低功耗 – 睡眠、停机和待机模式 – VBAT 可为 RTC、 20×32 位备份寄存器 + 可选的 4 KB 备份 SRAM 供电 6、3 个 12 位、 2.4 MSPS ADC:多达 24 通道,三重交叉模式下的性能高达 7.2 MSPS 7、2 个 12 位 D/A 转换器 8、通用DMA:具有FIFO和突发支持的16路DMA控制器 9、多达17个定时器: 12个16位定时器,和2个频率高达 168 MHz 的 32 位定时器,每个定时器都带有 4 个输入捕获 / 输出比较 /PWM,或脉冲计数器与正交 ( 增量 ) 编码器输入 10、调试模式 – SWD & JTAG 接口 – Cortex-M4 跟踪宏单元 ™ 11、多达 140 个具有中断功能的 I/O 端口 –高达 136 个快速 I/O,最高 84 MHz – 高达 138 个可耐 5 V 的 I/O 12、多达 15 个通信接口 – 多达 3 个 I2C 接口 (SMBus/PMBus) – 高达 4 个 USART/4 个 UART( 10.5 Mbit/s、ISO7816接口、 LIN、 IrDA、 调制解调器控制) – 高达 3 个 SPI ( 42 Mbits/s), 2 个具有复用的全双工 I2S, 通过内部音频 PLL 或外部时钟达到 音频级精度 – 2 个 CAN ( 2.0B 主动)以及 SDIO 接口
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicssic

创作不易,感谢您的鼓励和支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值