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