STM32+Freemodbus移植+freertos+rs485

1.使能外部高速时钟

 2.由于使用的是STlink,所以Debug选择Serial Wire

 3.时钟树配置

 4.串口1配置

 5.LPUART1串口配置

 6.timer2配置

在Modbus协议中,当波特率小于19200时,超时时间为3.5个字符时间,一字节(八位)外加一个停止位一个校验位,

所以一个字符有10位,发送一个字符时间1/9600*10,

所以3.5个字符时间为1/9600*10*3.5=0.00365s=3650us

7.GPIO配置

8.freertos配置

9.将LPUSART1和TIM2配置成中断模式 

 10.先将USART1调通,并重定向,方便调试

打开usart.c,加入重定向代码

 11.打开freemodbus源码包,并新建文件夹rs485_modbus,将modbus复制进rs485_modbus文件夹中,打开demo文件夹,再打开BARE文件夹,将里面的port和demo.c复制进rs485_modbus文件夹中

结果如下

12.将rs485_modbus剪切到keil5工程下  

 13.将所有的rs485_modbus文件夹下的C文件都丢在创建的RS_Modbus组下

 14.引入头文件

 15.将demo.c中的主函数注释,再进行编译

 16. 0错误,0警告,说明离移植成功了一半,接下来要加入相应串口和定时器

(1)打开portserial.c文件,修改串口代码配置

引入stm32相应头文件

 将static注释,方便在其他文件调用

 将FreeModbus的串口收发底层函数与stm32串口收发相关联,rs485模块使用的是LPUART1

 已初始化串口LPUART1,故返回TRUE

 添加串口发送代码,RS485为半双工,发送状态:RS485_DIR管脚为高电平,接收状态:RS485_DIR管脚为低电平,故发送前置高,发送后置低以便及时接收数据

 添加串口接收代码

2)打开porttimer.c文件,修改定时器代码配置

引入stm32头文件

 将static注释,方便在其他文件调用

 已初始化定时器2,故返回TRUE

 使能定时器2中断

 禁用任何挂起的定时器

(3)打开port.h头文件

 添加"stm32l4xx_hal.h"头文件

 添加开关总中断代码

 (4)打开stm32l4xx_it.c文件

声明这两个外部函数

 将LPUSART1接收到的内容转移到freemodbus的功能函数进行处理

(5)打开demo.c文件

修改宏

 赋值给寄存器

6)打开main.c文件

引入相应头文件

 使用extern声明prvvTIMERExpiredISR外部函数,用于和modbus的定时器底层代码相关联

 在所需外设初始化完成之后的用户编辑区内初始化FreeModBus函数

 添加定时器中断回调函数

(7)打开freertos.c文件

添加相应头文件

在任务中添加eMBPoll()函数启动监听

可以使用ModbusPoll进行测试,由于我的ModbusPoll已过期,所以在树莓派下结合libmodbus开源库写了一个测试代码

结果如下

主机发送报文为010400000004F1C9

从机回复报文为01040800110022003300442D37

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值