FreeModbus从站源码解析(porttimer.c)

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.zipFreeModbusV1.6源码
FreeModbusMasterSlave(Rev1.0.0).zip笔者移植好测试通过STM32+FreeRTOS+FreeModbus Master Slave代码
ModbusSlave 7.0和ModbusPoll_7.0软件注册码.zipFreeModbus Master Slave调试工具
FreeModbus V1.6 主机使用说明.mdFreeModbus 主机使用说明文档
FreeModbus 从机流程图.vsdFreeModbus 从机流程图
FreeModbus 主机流程图.vsdFreeModbus 主机流程图
Modbus应用协议.doc笔者整理的 FreeModbus 协议文档
FreeModbus Datasheet笔者搜集 FreeModbus 官方协议文档

资料链接:👉FreeModbus资源传送门👈
资料介绍:👉FreeModbus资源介绍传送门👈

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七云享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值