diff --git a/modbus.c b/modbus.c index 8af3c24..48981ca 100644 --- a/modbus.c +++ b/modbus.c @@ -25,6 +25,8 @@ static uint16_t dev_id = DEFAULT_DEVICE_MODBUS_ID; const uint16_t com_dev_id = 247; static void (*ModbusUartSendByte)(USART_TypeDef*, unsigned char); +static void (*ModbusTimEnable)(TIM_TypeDef*); +static void (*ModbusTimDisable)(TIM_TypeDef*); static int32_t (*ModbusTcpSendByte)(uint8_t, unsigned char*, uint16_t); static void (*ModbusRIRPoll)(void); static void (*ModbusRHRPoll)(void); @@ -34,6 +36,12 @@ static void (*ModbusWSRPoll)(uint16_t, uint16_t); void modbus_connect_callback_send_byte(void (*s)(USART_TypeDef*, unsigned char)) { ModbusUartSendByte = s; } +void modbus_connect_callback_tim_en(void (*s)(TIM_TypeDef*)) { + ModbusTimEnable = s; +} +void modbus_connect_callback_tim_dis(void (*s)(TIM_TypeDef*)) { + ModbusTimDisable = s; +} #endif #ifdef CURRENT_OPERATION_MODE_TCP @@ -388,29 +396,19 @@ void modbus_poll(void) { } //======================= UART HANDLERS =========================// #ifdef CURRENT_OPERATION_MODE_UART -void Modbus_UART_IRQHandler(void) { - if (USART_GetITStatus(Modbus_UART, USART_IT_RXNE) != RESET) { - while(USART_GetFlagStatus(Modbus_UART,USART_FLAG_RXNE) == RESET) {} - if (rx_buf_ptr < 128) { - rx_buf[rx_buf_ptr++] = (unsigned char)Modbus_UART -> DR; - } else { - Modbus_UART -> DR; - } - USART_ClearITPendingBit(Modbus_UART, USART_IT_RXNE); - - if (timer_state == 0) { - timer_state = 1; - Modbus_TIM -> CNT = 0; - TIM_Cmd(Modbus_TIM, ENABLE); - } +void Modbus_GetByte(unsigned char byte) { + if (rx_buf_ptr < 128) { + rx_buf[rx_buf_ptr++] = byte; + } + + if (timer_state == 0) { + timer_state = 1; + ModbusTimEnable(Modbus_TIM); } } -void Modbus_TIM_IRQHandler(void) { - if (TIM_GetITStatus(Modbus_TIM, TIM_IT_Update) != RESET) - TIM_ClearITPendingBit(Modbus_TIM, TIM_IT_Update); - - TIM_Cmd(Modbus_TIM, DISABLE); +void Modbus_TIM_Handler(void) { + ModbusTimDisable(Modbus_TIM); timer_state = 0; rx_flag = 1; } diff --git a/modbus.h b/modbus.h index faac8bd..51f98a1 100644 --- a/modbus.h +++ b/modbus.h @@ -28,10 +28,14 @@ void set_modbus_id(unsigned char); void modbus_connect_callback_send_byte(void (*s)(USART_TypeDef*, unsigned char)); +void modbus_connect_callback_tim_en(void (*s)(TIM_TypeDef*)); +void modbus_connect_callback_tim_dis(void (*s)(TIM_TypeDef*)); void modbus_connect_callback_send_buf_tcp(int32_t (*s)(uint8_t, unsigned char*, uint16_t)); void modbus_connect_callback_rir_poll(void (*s)(void)); void modbus_connect_callback_rhr_poll(void (*s)(void)); void modbus_connect_callback_wsr_poll(void (*s)(uint16_t, uint16_t)); +void Modbus_GetByte(unsigned char); +void Modbus_TIM_Handler(void); void modbus_poll(void); void modbus_reset(void); diff --git a/modbus_constants_example.h b/modbus_constants_example.h index 85d0ecf..d87279e 100644 --- a/modbus_constants_example.h +++ b/modbus_constants_example.h @@ -6,28 +6,28 @@ // MCU Includes +#include "stm32f4xx_ll_lptim.h" #include "stm32f4xx_ll_gpio.h" +#include "stm32f4xx_ll_tim.h" // Needed Constants #define DEFAULT_DEVICE_MODBUS_ID 1 -#define CURRENT_OPERATION_MODE_TCP +#define CURRENT_OPERATION_MODE_UART #define Modbus_LED GPIOB -#define Modbus_LED_Pin LL_GPIO_PIN_9 +#define Modbus_LED_Pin LL_GPIO_PIN_2 #define MODBUS_LED_ON LL_GPIO_SetOutputPin(Modbus_LED, Modbus_LED_Pin); #define MODBUS_LED_OFF LL_GPIO_ResetOutputPin(Modbus_LED, Modbus_LED_Pin); #ifdef CURRENT_OPERATION_MODE_UART - #define RS485_GPIO GPIOB - #define RS485_GPIO_Pin GPIO_Pin_6 - #define MODBUS_TX_EN GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_SET); - #define MODBUS_TX_DIS GPIO_WriteBit(RS485_GPIO, RS485_GPIO_Pin, Bit_RESET); - #define Modbus_UART USART2 + #define MODBUS_TX_EN LL_GPIO_SetOutputPin(RS485_GPIO, RS485_GPIO_Pin); + #define MODBUS_TX_DIS LL_GPIO_ResetOutputPin(RS485_GPIO, RS485_GPIO_Pin); + #define RS485_GPIO GPIOA + #define RS485_GPIO_Pin LL_GPIO_PIN_11 + #define Modbus_UART USART1 #define Modbus_TIM TIM2 - #define Modbus_UART_IRQHandler USART2_IRQHandler - #define Modbus_TIM_IRQHandler TIM2_IRQHandler #endif