STM32F407

STM32F407移植FreemodbusV1.6

准备工作 工具介绍 软件 Keil5: 代码编译调试 CubeMX: 代码生成工具 VSCode: 代码编辑器 Modbus Poll && Slave: 调试工具 硬件 STM32F407ZGT6: 普中麒麟F407开发板 两个串口转USB: 用于连接主机和从机 创建工程 CubeMX工程创建 选择芯片型号 设置时钟(外部晶振) 设置调试接口和基准时钟 配置串口(USART1~3) 开启FreeRTOS 创建3个任务 生成项目 Keil工程整合 将下载的Freemodbus源码复制到项目根目录,添加所需源文件: modbus/functions/ 下所有文件 modbus/rtu/ 下所有文件 mb.c 和 mb_m.c 移植详解 port.c - 临界区实现 #include "FreeRTOS.h" #include "task.h" #include "semphr.h" void EnterCriticalSection(void) { taskENTER_CRITICAL(); } void ExitCriticalSection(void) { taskEXIT_CRITICAL(); } portevent.c - 事件标志 使用FreeRTOS事件组实现Modbus事件通知。 portserial.c - 串口收发 实现串口初始化、收发控制,使用FIFO缓冲区接收数据。 porttimer.c - 定时器 实现Modbus帧间隔检测,波特率大于19200时固定为1750us。 主机移植 主机移植与从机类似,主要区别在于: portevent_m.c 中添加了响应事件标志 使用信号量实现主机操作同步 主机使用示例 void MasterTaskFun(void *argument) { for(;;) { eMBMasterPoll(); } } void MasterSendTaskFun(void *argument) { uint16_t data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for(;;) { eMBMasterReqWriteMultipleHoldingRegister(1, 0, 10, data, 100); for (uint16_t i = 0; i < 10; i++) { data[i] += 1; } osDelay(1000); } } 从机使用示例 void Slave_TaskFun(void *argument) { for(;;) { eMBPoll(); } } 测试 使用Modbus Poll和Modbus Slave软件进行测试: ...

September 13, 2024 · 1 min · Embedded Engineer
Modbus

Freemodbus主从库

Freemodbus 简介 Freemodbus 是一款开源的 Modbus 协议栈,由armink大神移植。同时支持主机和从机的功能。 FreeModbus 主机源码是开源的,这使得在嵌入式产品中实现Modbus主机功能变得简单。 特性 新增加的主机源码与原有从机的风格及接口保持一致 支持主机与从机在同一协议栈运行 支持实时操作系统及裸机移植 为应用提供多种请求模式,可以选择阻塞还是非阻塞模式 支持所有常用的Modbus方法 文件结构 源文件 描述 FreeModbus/modbus/mb.c Modbus从机设置及轮询接口 FreeModbus/modbus/mb_m.c Modbus主机设置及轮询接口 FreeModbus/modbus/rtu/mbrtu.c 从机RTU模式设置 FreeModbus/modbus/rtu/mbrtu_m.c 主机RTU模式设置 FreeModbus/port/portserial.c 从机串口移植 FreeModbus/port/portserial_m.c 主机串口移植 FreeModbus/port/user_mb_app.c 从机数据缓冲区 FreeModbus/port/user_mb_app_m.c 主机数据缓冲区 数据缓冲区 数据缓冲区定义在 user_mb_app_m.c 文件中,共4种数据类型: 线圈(Coils) 离散输入(Discrete Inputs) 保持寄存器(Holding Registers) 输入寄存器(Input Registers) API详解 写单个保持寄存器 eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut ); 读多个保持寄存器 eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); 读输入寄存器 eMBMasterReqReadInputRegister( UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut ); 返回值说明 返回值 描述 MB_MRE_NO_ERR 正常 MB_MRE_NO_REG 寄存器地址出错 MB_MRE_TIMEDOUT 响应超时 MB_MASTER_BUSY 主机忙 获取方式 GitHub: https://github.com/RT-Thread-packages/freemodbus

September 10, 2024 · 1 min · Embedded Engineer