【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:[email protected]】
由于之前做过STM32+FreeModbus+uC/OSII(示例代码,点击下载) 的移植,所以这两天的努力整体移植工作还算比较顺利,已经成功提前完成之前制定的1、2阶段任务,源码位于FreeModbus+RT-Thead+STM32(示例代码,点击下载)。现将部分移植过程做以说明。
移植采用的是FreeModbus1.5源码,RT-Thread使用的最新的1.1.1稳定版,STM32选用串口1作为从机串口,并增加了RS485发送/接收使能引脚,考虑的Timer2到时候留住Modbus主机使用,所以这里从机选用了Timer3。
移植RT-Thread至STM32网上的例程很多,同时RTT提供相应BSP,这里就不在重复说明。
FreeModbus的移植过程中主要需修改以下几个文件
1、/FreeModbus/port/portserial.c 里面涉及多了很多串口配置,我这次把暂时只实现了串口1,串口模式支持奇偶校验,串口的发送及接收都采用中断模式,发送使用发送缓冲区空中断,而非采用串口发送完成中断,还需要在该文件增加串口中断服务程序。
2、/FreeModbus/port/porttimer.c 里面主要是设置了一个50us的定时器,采用定时器3溢出中断,并在文件中增加定时器中断服务程序
3、/FreeModbus/port/port.h 里面增加自己需要的相关头文件,定义RS485发送/接收使能引脚
4、/FreeModbus/port/port.c 里面增加开启、关闭全局中断,可是使用STM32库函数自带的,也可以使用RT-Thread中自带的,我这里使用的是STM32自带的开关全局中断
移植好最基本的FreeModbus框架之后就得开始编写相应的Modbus功能实现方法,我在移植STM32+FreeModbus+uC/OSII时候这个工作已经做过了,所以这次就直接拷贝过来用,文件位于/APP/src/UserModbusSlaver.c
至此FreeModbus的移植工作就算告于段落了,为了验证移植的成功性,我这里想通过ModbusPoll上位机软件查看操作系统的CPU利用率来验证,CPU利用率的整数位及小数位分别保存在Modbus保持寄存器的地址1、2里,下面来描述下具体过程
1、增加两个线程一个起名:SysMonitor(系统监控),另一个起名:ModbusSlaverPoll(Modbus从机轮训)
2、在系统监控线程中增加获取RTT的CPU利用率、闪烁指示灯和喂狗功能
3、在Modbus轮训线程中增加FreeModbus初始化(波特率115200、偶校验、RTU、串口1、从机ID1),及FreeModbus轮训方法
4、接下来就是见证奇迹的时刻,打开ModbusPoll软件,设置好串口信息及轮训的功能即可
看看就源码就更好理解了,两个过程非常简单,有问题欢迎大家提问。
//***************************系统监控线程***************************
//函数定义: void thread_entry_SysMonitor(void* parameter)
//入口参数:无
//出口参数:无
//备 注:Editor:Armink 2013-08-02 Company: BXXJS
//******************************************************************
void thread_entry_SysMonitor(void* parameter)
{
while (1)
{
cpu_usage_get(&CpuUsageMajor, &CpuUsageMinor);
usRegHoldingBuf[HD_CPU_USAGE_MAJOR] = CpuUsageMajor;
usRegHoldingBuf[HD_CPU_USAGE_MINOR] = CpuUsageMinor;
LED_LED1_ON;
LED_LED2_ON;
rt_thread_delay(DELAY_SYS_RUN_LED);
LED_LED1_OFF;
LED_LED2_OFF;
rt_thread_delay(DELAY_SYS_RUN_LED);
IWDG_Feed(); //喂狗
}
}
//*************************** Modbus从机线程***************************
//函数定义: void thread_entry_ModbusSlaverPoll(void* parameter)
//入口参数:无
//出口参数:无
//备 注:Editor:Armink 2013-08-02 Company: BXXJS
//******************************************************************
void thread_entry_ModbusSlaverPoll(void* parameter)
{
eMBInit(MB_RTU, 0x01, 1, 115200, MB_PAR_EVEN);
eMBEnable();
while (1)
{
eMBPoll();
rt_thread_delay(DELAY_MB_SLAVER_POLL);
}
}
为了方便大家关于项目的进展,目前项目源码已在Github上开源,https://github.com/armink/FreeModbus_Slaver-Master-RTT-STM32
大家可以关注查看下载,也可以pull request。