porttimer.c
#include "port.h"
#include "mb.h"
#include "mbport.h"
static TimerHandle_t SlaveOneShotTimer_Handle; // 软件定时器句柄
static void slaveOneShotCallback(TimerHandle_t xTimer); // 软件定时器回调函数
static void prvvTIMERExpiredISR(void); // 回调函数中调用该函数
/*
*******************************************************************
* @Func:软件定时器初始化,由eMBRTUInit函数调用
* @usTimeOut50us :由eMBRTUInit函数确定该值
* @Note :单次触发,定时周期
* (50*usTimeOut50us)/(1000*1000/configTICK_RATE_HZ)ms
*******************************************************************
*/
BOOL xMBPortTimersInit(USHORT usTimeOut50us)
{
SlaveOneShotTimer_Handle = xTimerCreate(
(const char*)"SlaveOneShotTimer",
(TickType_t )(50*usTimeOut50us)/(1000*1000/configTICK_RATE_HZ),
(UBaseType_t)pdFALSE,
(void*)1,
(TimerCallbackFunction_t)slaveOneShotCallback);
return TRUE;
}
/*
***********************************************
* @Func :启动定时器
* @Note :中断中必须调用以FromISR结尾的API函数
***********************************************
*/
void vMBPortTimersEnable(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
//是否在中断中
if(0 == __get_CONTROL())
{
xTimerStartFromISR(SlaveOneShotTimer_Handle,&xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
else
xTimerStart(SlaveOneShotTimer_Handle,0);
}
/*
***********************************************
* @Func :停止定时器
* @Note :中断中必须调用以FromISR结尾的API函数
***********************************************
*/
void vMBPortTimersDisable(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
//是否在中断中
if(0 == __get_CONTROL())
{
xTimerStopFromISR(SlaveOneShotTimer_Handle,&xHigherPriorityTaskWoken);
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}else
xTimerStop(SlaveOneShotTimer_Handle,0);
}
/*
***********************************************
* @Func :软件定时器回调函数
***********************************************
*/
static void slaveOneShotCallback(TimerHandle_t xTimer)
{
//定时器周期到处理函数
prvvTIMERExpiredISR();
}
static void prvvTIMERExpiredISR(void)
{
// 函数指针,指向 xMBRTUTimerT35Expired
(void) pxMBPortCBTimerExpired();
}
Modbus资料整理
笔者将Modbus 主机、从机协议完整资料整理如下:
文件 | 说明 |
---|---|
freemodbus-v1.6.zip | FreeModbusV1.6源码 |
FreeModbusMasterSlave(Rev1.0.0).zip | 笔者移植好测试通过STM32+FreeRTOS+FreeModbus Master Slave代码 |
ModbusSlave 7.0和ModbusPoll_7.0软件注册码.zip | FreeModbus Master Slave调试工具 |
FreeModbus V1.6 主机使用说明.md | FreeModbus 主机使用说明文档 |
FreeModbus 从机流程图.vsd | FreeModbus 从机流程图 |
FreeModbus 主机流程图.vsd | FreeModbus 主机流程图 |
Modbus应用协议.doc | 笔者整理的 FreeModbus 协议文档 |
FreeModbus Datasheet | 笔者搜集 FreeModbus 官方协议文档 |