diff --git a/components/freemodbus/Kconfig b/components/freemodbus/Kconfig index cbdba581fa..a28e5f498a 100644 --- a/components/freemodbus/Kconfig +++ b/components/freemodbus/Kconfig @@ -187,25 +187,40 @@ menu "Modbus configuration" Modbus stack event processing time. config FMB_TIMER_PORT_ENABLED - bool "Modbus slave stack use timer for 3.5T symbol time measurement" + bool "Modbus stack use timer for 3.5T symbol time measurement" default n help If this option is set the Modbus stack uses timer for T3.5 time measurement. Else the internal UART TOUT timeout is used for 3.5T symbol time measurement. config FMB_TIMER_GROUP - int "Modbus Timer group number" + int "Slave Timer group number" range 0 1 default 0 help - Modbus Timer group number that is used for timeout measurement. + Modbus slave Timer group number that is used for timeout measurement. config FMB_TIMER_INDEX - int "Modbus Timer index in the group" + int "Slave Timer index in the group" range 0 1 default 0 help - Modbus Timer Index in the group that is used for timeout measurement. + Modbus slave Timer Index in the group that is used for timeout measurement. + + config FMB_MASTER_TIMER_GROUP + int "Master Timer group number" + range 0 1 + default FMB_TIMER_GROUP + help + Modbus master Timer group number that is used for timeout measurement. + + config FMB_MASTER_TIMER_INDEX + int "Master Timer index" + range 0 1 + default FMB_TIMER_INDEX + help + Modbus master Timer Index in the group that is used for timeout measurement. + Note: Modbus master and slave should have different timer index to be able to work simultaneously. config FMB_TIMER_ISR_IN_IRAM bool "Place timer interrupt handler into IRAM" diff --git a/components/freemodbus/modbus/mb.c b/components/freemodbus/modbus/mb.c index be00e55c64..25722011a9 100644 --- a/components/freemodbus/modbus/mb.c +++ b/components/freemodbus/modbus/mb.c @@ -54,7 +54,7 @@ #endif #ifndef MB_PORT_HAS_CLOSE -#define MB_PORT_HAS_CLOSE 0 +#define MB_PORT_HAS_CLOSE 1 #endif /* ----------------------- Static variables ---------------------------------*/ diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index a127326f8e..c74122abef 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -61,6 +61,8 @@ #define MB_TCP_FRAME_LOG_BUFSIZE (256) +#define MB_PORT_HAS_CLOSE (1) // Define to explicitly close port on destroy + // Define number of timer reloads per 1 mS #define MB_TIMER_TICS_PER_MS (20UL) diff --git a/components/freemodbus/port/porttimer.c b/components/freemodbus/port/porttimer.c index 35371ad238..565d58ed02 100644 --- a/components/freemodbus/port/porttimer.c +++ b/components/freemodbus/port/porttimer.c @@ -147,8 +147,7 @@ vMBPortTimersDisable(void) void vMBPortTimerClose(void) { #ifdef CONFIG_FMB_TIMER_PORT_ENABLED - ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex)); - ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex)); + ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex)); ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle)); #endif } diff --git a/components/freemodbus/port/porttimer_m.c b/components/freemodbus/port/porttimer_m.c index 9d70336327..e473195ef3 100644 --- a/components/freemodbus/port/porttimer_m.c +++ b/components/freemodbus/port/porttimer_m.c @@ -50,16 +50,13 @@ #define MB_TIMER_DIVIDER ((TIMER_BASE_CLK / 1000000UL) * MB_TICK_TIME_US - 1) // divider for 50uS #define MB_TIMER_WITH_RELOAD (1) -// Timer group and timer number to measure time (configurable in KConfig) -#define MB_TIMER_INDEX (CONFIG_FMB_TIMER_INDEX) -#define MB_TIMER_GROUP (CONFIG_FMB_TIMER_GROUP) - /* ----------------------- Variables ----------------------------------------*/ static USHORT usT35TimeOut50us; -static const USHORT usTimerIndex = MB_TIMER_INDEX; // Initialize Modbus Timer index used by stack, -static const USHORT usTimerGroupIndex = MB_TIMER_GROUP; // Timer group index used by stack -static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle +// Initialize Modbus Timer group and index used by stack +static const USHORT usTimerIndex = CONFIG_FMB_MASTER_TIMER_INDEX; +static const USHORT usTimerGroupIndex = CONFIG_FMB_MASTER_TIMER_GROUP; +static timer_isr_handle_t xTimerIntHandle; // Timer interrupt handle /* ----------------------- static functions ---------------------------------*/ static void IRAM_ATTR vTimerGroupIsr(void *param) @@ -193,7 +190,6 @@ vMBMasterPortTimersDisable() void vMBMasterPortTimerClose(void) { - ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex)); - ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex)); + ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex)); ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle)); } diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c index cf45730f40..b45e83980c 100644 --- a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c +++ b/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c @@ -173,7 +173,7 @@ static esp_err_t mbc_serial_slave_destroy(void) mb_error = eMBClose(); MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE, "mb stack close failure returned (0x%x).", (uint32_t)mb_error); - + mbs_interface_ptr = NULL; vMBPortSetMode((UCHAR)MB_PORT_INACTIVE); return ESP_OK; }